Skip to content

Commit 1bda8fd

Browse files
committed
add derivationOutput(Parser|Builder), prop
1 parent e6ed8f8 commit 1bda8fd

File tree

4 files changed

+94
-11
lines changed

4 files changed

+94
-11
lines changed

hnix-store-core/src/System/Nix/Realisation.hs

Lines changed: 52 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,19 +4,29 @@ Description : Derivation realisations
44

55
module System.Nix.Realisation (
66
DerivationOutput(..)
7+
, DerivationOutputError(..)
8+
, derivationOutputBuilder
9+
, derivationOutputParser
710
, Realisation(..)
811
) where
912

1013
import Crypto.Hash (Digest)
1114
import Data.Map (Map)
1215
import Data.Set (Set)
16+
import Data.Text (Text)
17+
import Data.Text.Lazy.Builder (Builder)
1318
import Data.Dependent.Sum (DSum)
1419
import GHC.Generics (Generic)
1520
import System.Nix.Hash (HashAlgo)
16-
import System.Nix.OutputName (OutputName)
21+
import System.Nix.OutputName (OutputName, InvalidNameError)
1722
import System.Nix.Signature (Signature)
1823
import System.Nix.StorePath (StorePath)
1924

25+
import qualified Data.Bifunctor
26+
import qualified Data.Text
27+
import qualified Data.Text.Lazy.Builder
28+
import qualified System.Nix.Hash
29+
2030
-- | Output of the derivation
2131
data DerivationOutput outputName = DerivationOutput
2232
{ derivationOutputHash :: DSum HashAlgo Digest
@@ -25,6 +35,47 @@ data DerivationOutput outputName = DerivationOutput
2535
-- ^ Name of the output
2636
} deriving (Eq, Generic, Ord, Show)
2737

38+
data DerivationOutputError
39+
= DerivationOutputError_Digest String
40+
| DerivationOutputError_Name InvalidNameError
41+
| DerivationOutputError_NoExclamationMark
42+
| DerivationOutputError_NoColon
43+
| DerivationOutputError_TooManyParts [Text]
44+
deriving (Eq, Ord, Show)
45+
46+
derivationOutputParser
47+
:: (Text -> Either InvalidNameError outputName)
48+
-> Text
49+
-> Either DerivationOutputError (DerivationOutput outputName)
50+
derivationOutputParser outputName dOut =
51+
case Data.Text.splitOn (Data.Text.singleton '!') dOut of
52+
[] -> Left DerivationOutputError_NoColon
53+
[sriHash, oName] -> do
54+
hash <-
55+
case Data.Text.splitOn (Data.Text.singleton ':') sriHash of
56+
[] -> Left DerivationOutputError_NoColon
57+
[hashName, digest] ->
58+
Data.Bifunctor.first
59+
DerivationOutputError_Digest
60+
$ System.Nix.Hash.mkNamedDigest hashName digest
61+
x -> Left $ DerivationOutputError_TooManyParts x
62+
name <-
63+
Data.Bifunctor.first
64+
DerivationOutputError_Name
65+
$ outputName oName
66+
67+
pure $ DerivationOutput hash name
68+
x -> Left $ DerivationOutputError_TooManyParts x
69+
70+
derivationOutputBuilder
71+
:: (outputName -> Text)
72+
-> DerivationOutput outputName
73+
-> Builder
74+
derivationOutputBuilder outputName DerivationOutput{..} =
75+
System.Nix.Hash.algoDigestBuilder derivationOutputHash
76+
<> Data.Text.Lazy.Builder.singleton '!'
77+
<> Data.Text.Lazy.Builder.fromText (outputName derivationOutputName)
78+
2879
-- | Build realisation context
2980
--
3081
-- realisationId is ommited since it is a key

hnix-store-remote/src/System/Nix/Store/Remote/Serializer.hs

Lines changed: 15 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -134,7 +134,7 @@ import System.Nix.Derivation (Derivation(..), DerivationOutput(..))
134134
import System.Nix.DerivedPath (DerivedPath, ParseOutputsError)
135135
import System.Nix.Hash (HashAlgo(..))
136136
import System.Nix.OutputName (OutputName)
137-
import System.Nix.Realisation (Realisation(..))
137+
import System.Nix.Realisation (DerivationOutputError, Realisation(..))
138138
import System.Nix.Signature (Signature, NarSignature)
139139
import System.Nix.Store.Types (FileIngestionMethod(..), RepairMode(..))
140140
import System.Nix.StorePath (HasStoreDir(..), InvalidNameError, InvalidPathError, StorePath, StorePathHashPart, StorePathName)
@@ -232,6 +232,7 @@ data SError
232232
}
233233
| SError_ContentAddress String
234234
| SError_DerivedPath ParseOutputsError
235+
| SError_DerivationOutput DerivationOutputError
235236
| SError_Digest String
236237
| SError_EnumOutOfMinBound Int
237238
| SError_EnumOutOfMaxBound Int
@@ -347,6 +348,7 @@ text = mapIsoSerializer
347348
Data.Text.Encoding.encodeUtf8
348349
byteString
349350

351+
-- TODO Parser Builder
350352
_textBuilder :: NixSerializer r SError Builder
351353
_textBuilder = Serializer
352354
{ getS = Data.Text.Lazy.Builder.fromText <$> getS text
@@ -596,15 +598,18 @@ outputName =
596598
-- * Realisation
597599

598600
derivationOutputTyped :: NixSerializer r SError (System.Nix.Realisation.DerivationOutput OutputName)
599-
derivationOutputTyped = Serializer
600-
{ getS = do
601-
derivationOutputHash <- getS namedDigest
602-
derivationOutputName <- getS outputName
603-
pure System.Nix.Realisation.DerivationOutput{..}
604-
, putS = \System.Nix.Realisation.DerivationOutput{..} -> do
605-
putS namedDigest derivationOutputHash
606-
putS outputName derivationOutputName
607-
}
601+
derivationOutputTyped =
602+
mapPrismSerializer
603+
( Data.Bifunctor.first SError_DerivationOutput
604+
. System.Nix.Realisation.derivationOutputParser
605+
System.Nix.OutputName.mkOutputName
606+
)
607+
( Data.Text.Lazy.toStrict
608+
. Data.Text.Lazy.Builder.toLazyText
609+
. System.Nix.Realisation.derivationOutputBuilder
610+
System.Nix.OutputName.unOutputName
611+
)
612+
text
608613

609614
realisation
610615
:: HasStoreDir r

hnix-store-tests/hnix-store-tests.cabal

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -80,6 +80,7 @@ test-suite props
8080
ContentAddressSpec
8181
DerivationSpec
8282
DerivedPathSpec
83+
RealisationSpec
8384
StorePathSpec
8485
SignatureSpec
8586
hs-source-dirs:
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
module RealisationSpec where
2+
3+
import Test.Hspec (Spec, describe)
4+
import Test.Hspec.QuickCheck (prop)
5+
import Test.Hspec.Nix (roundtrips)
6+
7+
import System.Nix.Arbitrary ()
8+
9+
import qualified Data.Text.Lazy
10+
import qualified Data.Text.Lazy.Builder
11+
import qualified System.Nix.OutputName
12+
import qualified System.Nix.Realisation
13+
14+
spec :: Spec
15+
spec = do
16+
describe "DerivationOutput" $ do
17+
prop "roundtrips" $
18+
roundtrips
19+
( Data.Text.Lazy.toStrict
20+
. Data.Text.Lazy.Builder.toLazyText
21+
. System.Nix.Realisation.derivationOutputBuilder
22+
System.Nix.OutputName.unOutputName
23+
)
24+
( System.Nix.Realisation.derivationOutputParser
25+
System.Nix.OutputName.mkOutputName
26+
)

0 commit comments

Comments
 (0)