Skip to content

Commit 9274e45

Browse files
committed
Make the main derivation representation better typed
1 parent 50a1cd6 commit 9274e45

File tree

19 files changed

+586
-263
lines changed

19 files changed

+586
-263
lines changed

hnix-store-aterm/bench/Main.hs

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -22,10 +22,7 @@ benchmarks =
2222
bench0 example =
2323
Criterion.bench "example" (Criterion.nf parseExample example)
2424

25-
name = either (error . show) id $ mkStorePathName "ghc-8.0.2-with-packages"
26-
2725
parseExample =
2826
Data.Attoparsec.Text.Lazy.parse $
29-
System.Nix.Derivation.ATerm.parseDerivation
27+
System.Nix.Derivation.ATerm.parseTraditionalDerivation
3028
(StoreDir "/nix/store")
31-
name

hnix-store-aterm/hnix-store-aterm.cabal

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -96,6 +96,7 @@ Test-Suite property
9696
hnix-store-core ,
9797
hnix-store-aterm ,
9898
hnix-store-tests ,
99+
containers ,
99100
generic-arbitrary < 1.1 ,
100101
QuickCheck < 2.16,
101102
text ,

hnix-store-aterm/pretty-derivation/Main.hs

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -14,9 +14,8 @@ main = do
1414
text <- Data.Text.Lazy.IO.getContents
1515
case
1616
Data.Attoparsec.Text.Lazy.parse
17-
(System.Nix.Derivation.ATerm.parseDerivation
18-
(StoreDir "/nix/store")
19-
(error "todo get name from outputs if needed"))
17+
(System.Nix.Derivation.ATerm.parseTraditionalDerivation
18+
(StoreDir "/nix/store"))
2019
text
2120
of
2221
Fail _ _ err -> fail err

hnix-store-aterm/src/System/Nix/Derivation/ATerm.hs

Lines changed: 13 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -78,26 +78,27 @@
7878

7979
module System.Nix.Derivation.ATerm
8080
( -- * Types
81-
Derivation
82-
, Derivation'(..)
83-
, DerivationOutput(..)
84-
, DerivationInputs(..)
81+
TraditionalDerivation'(..)
82+
, FreeformDerivationOutput(..)
83+
, FreeformDerivationOutputs
84+
, TraditionalDerivationInputs(..)
8585
, DerivedPathMap(..)
8686

8787
-- * Parse derivations
88-
, parseDerivation
89-
, parseDerivationWith
90-
, parseDerivationOutput
91-
, parseDerivationInputs
88+
, parseTraditionalDerivation
89+
, parseTraditionalDerivationWith
90+
, parseFreeformDerivationOutput
91+
, parseTraditionalDerivationInputs
9292
, textParser
9393

9494
-- * Render derivations
95-
, buildDerivation
96-
, buildDerivationWith
97-
, buildDerivationOutput
98-
, buildDerivationInputs
95+
, buildTraditionalDerivation
96+
, buildTraditionalDerivationWith
97+
, buildFreeformDerivationOutput
98+
, buildTraditionalDerivationInputs
9999
) where
100100

101101
import System.Nix.Derivation
102+
import System.Nix.Derivation.Traditional
102103
import System.Nix.Derivation.ATerm.Builder
103104
import System.Nix.Derivation.ATerm.Parser

hnix-store-aterm/src/System/Nix/Derivation/ATerm/Builder.hs

Lines changed: 31 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -6,10 +6,10 @@
66

77
module System.Nix.Derivation.ATerm.Builder
88
( -- * Builder
9-
buildDerivation
10-
, buildDerivationWith
11-
, buildDerivationOutput
12-
, buildDerivationInputs
9+
buildTraditionalDerivation
10+
, buildTraditionalDerivationWith
11+
, buildFreeformDerivationOutput
12+
, buildTraditionalDerivationInputs
1313
) where
1414

1515
import Data.Map (Map)
@@ -18,8 +18,8 @@ import Data.Text (Text)
1818
import Data.Text.Lazy.Builder (Builder)
1919
import Data.Vector (Vector)
2020
import System.Nix.Derivation
21-
( Derivation'(..)
22-
, DerivationOutput(..)
21+
( FreeformDerivationOutput(..)
22+
, FreeformDerivationOutputs
2323
)
2424
import System.Nix.Derivation.Traditional
2525
import System.Nix.StorePath
@@ -32,42 +32,42 @@ import Data.Text.Lazy.Builder qualified
3232
import Data.Vector qualified
3333

3434
-- | Render a derivation as a `Builder`
35-
buildDerivation
35+
buildTraditionalDerivation
3636
:: StoreDir
37-
-> Derivation' TraditionalDerivationInputs DerivationOutput
37+
-> TraditionalDerivation' TraditionalDerivationInputs FreeformDerivationOutputs
3838
-> Builder
39-
buildDerivation sd =
40-
buildDerivationWith
41-
(buildDerivationInputs sd)
42-
(buildDerivationOutput sd)
39+
buildTraditionalDerivation sd =
40+
buildTraditionalDerivationWith
41+
(buildTraditionalDerivationInputs sd)
42+
(\_ -> buildFreeformDerivationOutput sd)
4343

4444
-- | Render a derivation as a `Builder` using custom
4545
-- renderer for storePaths, texts, outputNames and derivation inputs/outputs
46-
buildDerivationWith
46+
buildTraditionalDerivationWith
4747
:: (drvInputs -> Builder)
48-
-> (StorePathName -> OutputName -> drvOutput -> Builder)
49-
-> Derivation' drvInputs drvOutput
48+
-> (OutputName -> drvOutput -> Builder)
49+
-> TraditionalDerivation' drvInputs (Map OutputName drvOutput)
5050
-> Builder
51-
buildDerivationWith drvInputs drvOutput (Derivation {..}) =
51+
buildTraditionalDerivationWith drvInputs drvOutput (TraditionalDerivation {..}) =
5252
"Derive("
53-
<> mapOf keyValue0 outputs
53+
<> mapOf keyValue0 anonOutputs
5454
<> ","
55-
<> drvInputs inputs
55+
<> drvInputs anonInputs
5656
<> ","
57-
<> string platform
57+
<> string anonPlatform
5858
<> ","
59-
<> string builder
59+
<> string anonBuilder
6060
<> ","
61-
<> vectorOf string args
61+
<> vectorOf string anonArgs
6262
<> ","
63-
<> mapOf keyValue1 env
63+
<> mapOf keyValue1 anonEnv
6464
<> ")"
6565
where
6666
keyValue0 (key, output) =
6767
"("
6868
<> buildOutputName key
6969
<> ","
70-
<> drvOutput name key output
70+
<> drvOutput key output
7171
<> ")"
7272

7373
keyValue1 (key, value) =
@@ -77,31 +77,29 @@ buildDerivationWith drvInputs drvOutput (Derivation {..}) =
7777
<> string value
7878
<> ")"
7979

80-
-- | Render a @DerivationOutput@ as a `Builder` using custom
80+
-- | Render a @FreeformDerivationOutput@ as a `Builder` using custom
8181
-- renderer for storePaths
82-
buildDerivationOutput
82+
buildFreeformDerivationOutput
8383
:: StoreDir
84-
-> StorePathName
85-
-> OutputName
86-
-> DerivationOutput
84+
-> FreeformDerivationOutput
8785
-> Builder
88-
buildDerivationOutput storeDir drvName outputName =
86+
buildFreeformDerivationOutput storeDir =
8987
( \RawDerivationOutput {..} ->
9088
string rawPath
9189
<> ","
9290
<> string rawMethodHashAlgo
9391
<> ","
9492
<> string rawHash
9593
)
96-
. renderRawDerivationOutput storeDir drvName outputName
94+
. renderRawDerivationOutput storeDir
9795

98-
-- | Render a @DerivationInputs@ as a `Builder` using custom
96+
-- | Render a @TraditionalDerivationInputs@ as a `Builder` using custom
9997
-- renderer for storePaths and output names
100-
buildDerivationInputs
98+
buildTraditionalDerivationInputs
10199
:: StoreDir
102100
-> TraditionalDerivationInputs
103101
-> Builder
104-
buildDerivationInputs storeDir (TraditionalDerivationInputs {..}) =
102+
buildTraditionalDerivationInputs storeDir (TraditionalDerivationInputs {..}) =
105103
mapOf keyValue traditionalDrvs
106104
<> ","
107105
<> setOf (storePath storeDir) traditionalSrcs

hnix-store-aterm/src/System/Nix/Derivation/ATerm/Parser.hs

Lines changed: 31 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -9,10 +9,10 @@
99

1010
module System.Nix.Derivation.ATerm.Parser
1111
( -- * Parser
12-
parseDerivation
13-
, parseDerivationWith
14-
, parseDerivationOutput
15-
, parseDerivationInputs
12+
parseTraditionalDerivation
13+
, parseTraditionalDerivationWith
14+
, parseFreeformDerivationOutput
15+
, parseTraditionalDerivationInputs
1616
, textParser
1717
) where
1818

@@ -28,11 +28,11 @@ import Data.Text qualified
2828
import Data.Vector (Vector)
2929
import Data.Vector qualified
3030

31-
import System.Nix.Derivation.Traditional
3231
import System.Nix.Derivation
33-
( Derivation'(..)
34-
, DerivationOutput(..)
32+
( FreeformDerivationOutput(..)
33+
, FreeformDerivationOutputs
3534
)
35+
import System.Nix.Derivation.Traditional
3636
import System.Nix.StorePath
3737
import System.Nix.OutputName
3838

@@ -44,46 +44,47 @@ listOf element = do
4444
pure es
4545

4646
-- | Parse a derivation
47-
parseDerivation :: StoreDir -> StorePathName -> Parser (Derivation' TraditionalDerivationInputs DerivationOutput)
48-
parseDerivation sd =
49-
parseDerivationWith
50-
(parseDerivationInputs sd)
51-
(parseDerivationOutput sd)
47+
parseTraditionalDerivation
48+
:: StoreDir
49+
-> Parser (TraditionalDerivation' TraditionalDerivationInputs FreeformDerivationOutputs)
50+
parseTraditionalDerivation sd =
51+
parseTraditionalDerivationWith
52+
(parseTraditionalDerivationInputs sd)
53+
(\_ -> parseFreeformDerivationOutput sd)
5254

5355
-- | Parse a derivation using custom
5456
-- parsers for filepaths, texts, outputNames and derivation inputs/outputs
55-
parseDerivationWith
57+
parseTraditionalDerivationWith
5658
:: Parser drvInputs
57-
-> (StorePathName -> OutputName -> Parser drvOutput)
58-
-> StorePathName
59-
-> Parser (Derivation' drvInputs drvOutput)
60-
parseDerivationWith parseInputs parseOutput name = do
59+
-> (OutputName -> Parser drvOutput)
60+
-> Parser (TraditionalDerivation' drvInputs (Map OutputName drvOutput))
61+
parseTraditionalDerivationWith parseInputs parseOutput = do
6162
"Derive("
6263

6364
let keyValue0 = do
6465
"("
6566
key <- outputNameParser
6667
","
67-
drvOutput <- parseOutput name key
68+
drvOutput <- parseOutput key
6869
")"
6970
return (key, drvOutput)
70-
outputs <- mapOf keyValue0
71+
anonOutputs <- mapOf keyValue0
7172

7273
","
7374

74-
inputs <- parseInputs
75+
anonInputs <- parseInputs
7576

7677
","
7778

78-
platform <- textParser
79+
anonPlatform <- textParser
7980

8081
","
8182

82-
builder <- textParser
83+
anonBuilder <- textParser
8384

8485
","
8586

86-
args <- vectorOf textParser
87+
anonArgs <- vectorOf textParser
8788

8889
","
8990

@@ -94,25 +95,25 @@ parseDerivationWith parseInputs parseOutput name = do
9495
value <- textParser
9596
")"
9697
pure (key, value)
97-
env <- mapOf keyValue1
98+
anonEnv <- mapOf keyValue1
9899

99100
")"
100101

101-
pure Derivation {..}
102+
pure TraditionalDerivation {..}
102103

103104
-- | Parse a derivation output
104-
parseDerivationOutput :: StoreDir -> StorePathName -> OutputName -> Parser DerivationOutput
105-
parseDerivationOutput sd drvName outputName = do
105+
parseFreeformDerivationOutput :: StoreDir -> Parser FreeformDerivationOutput
106+
parseFreeformDerivationOutput sd = do
106107
rawPath <- textParser
107108
","
108109
rawMethodHashAlgo <- textParser
109110
","
110111
rawHash <- textParser
111-
parseRawDerivationOutput sd drvName outputName $ RawDerivationOutput {..}
112+
parseRawDerivationOutput sd $ RawDerivationOutput {..}
112113

113114
-- | Parse a derivation inputs
114-
parseDerivationInputs :: StoreDir -> Parser TraditionalDerivationInputs
115-
parseDerivationInputs sd = do
115+
parseTraditionalDerivationInputs :: StoreDir -> Parser TraditionalDerivationInputs
116+
parseTraditionalDerivationInputs sd = do
116117
traditionalDrvs <- mapOf $ do
117118
"("
118119
key <- storePathParser sd

0 commit comments

Comments
 (0)