Skip to content

Commit 9553c5b

Browse files
committed
Factor out printing store path base names too
Better for JSON, better to test in isolation.
1 parent 22714c9 commit 9553c5b

File tree

3 files changed

+31
-25
lines changed

3 files changed

+31
-25
lines changed

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

Lines changed: 17 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,8 @@ module System.Nix.StorePath
2727
storePathToFilePath
2828
, storePathToRawFilePath
2929
, storePathToText
30+
, storePathBaseToText
31+
, storePathBaseToRawFilePath
3032
, storePathToNarInfo
3133
, storePathHashPartToText
3234
, -- * Parsing 'StorePath's
@@ -184,14 +186,25 @@ instance Default StoreDir where
184186
class HasStoreDir r where
185187
hasStoreDir :: r -> StoreDir
186188

187-
-- | Render a 'StorePath' as a 'RawFilePath'.
188-
storePathToRawFilePath :: StoreDir -> StorePath -> RawFilePath
189-
storePathToRawFilePath storeDir StorePath{..} =
190-
unStoreDir storeDir <> "/" <> hashPart <> "-" <> name
189+
-- | Render a 'StorePath' as a base path (without store directory).
190+
-- This is the relative path format: @hashPart-name@
191+
storePathBaseToRawFilePath :: StorePath -> RawFilePath
192+
storePathBaseToRawFilePath StorePath{..} =
193+
hashPart <> "-" <> name
191194
where
192195
hashPart = Data.Text.Encoding.encodeUtf8 $ storePathHashPartToText storePathHash
193196
name = Data.Text.Encoding.encodeUtf8 $ unStorePathName storePathName
194197

198+
-- | Render a 'StorePath' as a base path 'Text' (without store directory).
199+
-- This is the relative path format: @hashPart-name@
200+
storePathBaseToText :: StorePath -> Text
201+
storePathBaseToText = Data.Text.Encoding.decodeUtf8 . storePathBaseToRawFilePath
202+
203+
-- | Render a 'StorePath' as a 'RawFilePath'.
204+
storePathToRawFilePath :: StoreDir -> StorePath -> RawFilePath
205+
storePathToRawFilePath storeDir sp =
206+
unStoreDir storeDir <> "/" <> storePathBaseToRawFilePath sp
207+
195208
-- | Render a 'StorePath' as a 'FilePath'.
196209
storePathToFilePath :: StoreDir -> StorePath -> FilePath
197210
storePathToFilePath storeDir = Data.ByteString.Char8.unpack . storePathToRawFilePath storeDir

hnix-store-json/src/System/Nix/JSON.hs

Lines changed: 4 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,6 @@ import Data.Foldable (toList)
2525
import Data.Set qualified
2626
import Data.Some
2727
import Data.Text (Text)
28-
import Data.Text qualified
2928
import Data.Text.Lazy qualified
3029
import Data.Text.Lazy.Builder qualified
3130
import Deriving.Aeson
@@ -41,7 +40,7 @@ import System.Nix.Realisation (DerivationOutput(..), Realisation, RealisationWit
4140
import System.Nix.Realisation qualified
4241
import System.Nix.Signature (Signature)
4342
import System.Nix.Signature qualified
44-
import System.Nix.StorePath (StorePath, StorePathName, StorePathHashPart, storePathHash, storePathName, mkStorePathName, unStorePathName, parseBasePathFromText)
43+
import System.Nix.StorePath (StorePath, StorePathName, StorePathHashPart, mkStorePathName, unStorePathName, parseBasePathFromText)
4544
import System.Nix.StorePath qualified
4645

4746
instance ToJSON StorePathName where
@@ -68,19 +67,8 @@ instance FromJSON StorePathHashPart where
6867
)
6968

7069
instance ToJSON StorePath where
71-
toJSON sp =
72-
toJSON $ Data.Text.concat
73-
[ System.Nix.StorePath.storePathHashPartToText (storePathHash sp)
74-
, "-"
75-
, System.Nix.StorePath.unStorePathName (storePathName sp)
76-
]
77-
78-
toEncoding sp =
79-
toEncoding $ Data.Text.concat
80-
[ System.Nix.StorePath.storePathHashPartToText (storePathHash sp)
81-
, "-"
82-
, System.Nix.StorePath.unStorePathName (storePathName sp)
83-
]
70+
toJSON = toJSON . System.Nix.StorePath.storePathBaseToText
71+
toEncoding = toEncoding . System.Nix.StorePath.storePathBaseToText
8472

8573
instance FromJSON StorePath where
8674
parseJSON =
@@ -92,12 +80,7 @@ instance FromJSON StorePath where
9280
)
9381

9482
instance ToJSONKey StorePath where
95-
toJSONKey = Data.Aeson.Types.toJSONKeyText $ \sp ->
96-
Data.Text.concat
97-
[ System.Nix.StorePath.storePathHashPartToText (storePathHash sp)
98-
, "-"
99-
, System.Nix.StorePath.unStorePathName (storePathName sp)
100-
]
83+
toJSONKey = Data.Aeson.Types.toJSONKeyText System.Nix.StorePath.storePathBaseToText
10184

10285
instance FromJSONKey StorePath where
10386
fromJSONKey = FromJSONKeyTextParser $

hnix-store-tests/tests/StorePathSpec.hs

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,3 +29,13 @@ spec = do
2929
roundtrips
3030
(storePathToText storeDir)
3131
(Data.Attoparsec.Text.parseOnly $ pathParser storeDir)
32+
33+
prop "roundtrips using parseBasePath . storePathBaseToRawFilePath" $
34+
roundtrips
35+
storePathBaseToRawFilePath
36+
parseBasePath
37+
38+
prop "roundtrips using parseBasePathFromText . storePathBaseToText" $
39+
roundtrips
40+
storePathBaseToText
41+
parseBasePathFromText

0 commit comments

Comments
 (0)