|
2 | 2 | {-# LANGUAGE OverloadedStrings #-} |
3 | 3 | {-# LANGUAGE ScopedTypeVariables #-} |
4 | 4 | {-# LANGUAGE RankNTypes #-} |
| 5 | +{-# LANGUAGE DataKinds #-} |
5 | 6 | {-# LANGUAGE TypeApplications #-} |
6 | 7 |
|
7 | | -module System.Nix.Store.Remote.Parsers ( |
8 | | - parseContentAddressableAddress |
9 | | - ) where |
| 8 | +module System.Nix.Store.Remote.Parsers |
| 9 | + ( parseContentAddressableAddress |
| 10 | + ) |
| 11 | +where |
10 | 12 |
|
11 | | -import Control.Applicative ((<|>)) |
12 | | -import Data.Attoparsec.ByteString.Char8 (Parser, (<?>)) |
13 | | -import Data.ByteString (ByteString) |
14 | | -import System.Nix.Hash (Digest, NamedAlgo, SomeNamedDigest(SomeDigest)) |
15 | | -import System.Nix.StorePath (ContentAddressableAddress(..), NarHashMode(..)) |
16 | | - |
17 | | -import qualified Data.Attoparsec.ByteString.Char8 |
18 | | -import qualified Data.ByteString.Char8 |
| 13 | +import Control.Applicative ( (<|>) ) |
| 14 | +import Data.Attoparsec.ByteString.Char8 |
| 15 | +import Data.ByteString.Char8 |
19 | 16 | import qualified Data.Text |
20 | | - |
21 | | -import qualified System.Nix.Internal.Base32 |
22 | | -import qualified System.Nix.Hash |
| 17 | +import Data.Text.Encoding ( decodeUtf8 ) |
| 18 | +import System.Nix.Hash |
| 19 | +import System.Nix.StorePath ( ContentAddressableAddress(..) |
| 20 | + , NarHashMode(..) |
| 21 | + ) |
23 | 22 |
|
24 | 23 | -- | Parse `ContentAddressableAddress` from `ByteString` |
25 | | -parseContentAddressableAddress :: forall hashAlgo . NamedAlgo hashAlgo |
26 | | - => ByteString |
27 | | - -> Either String ContentAddressableAddress |
| 24 | +parseContentAddressableAddress |
| 25 | + :: ByteString -> Either String ContentAddressableAddress |
28 | 26 | parseContentAddressableAddress = |
29 | | - Data.Attoparsec.ByteString.Char8.parseOnly |
30 | | - (contentAddressableAddressParser @hashAlgo) |
| 27 | + Data.Attoparsec.ByteString.Char8.parseOnly contentAddressableAddressParser |
31 | 28 |
|
32 | 29 | -- | Parser for content addressable field |
33 | | -contentAddressableAddressParser :: forall hashAlgo . NamedAlgo hashAlgo |
34 | | - => Parser ContentAddressableAddress |
35 | | -contentAddressableAddressParser = |
36 | | - caText |
37 | | - <|> caFixed @hashAlgo |
| 30 | +contentAddressableAddressParser :: Parser ContentAddressableAddress |
| 31 | +contentAddressableAddressParser = caText <|> caFixed |
38 | 32 |
|
39 | 33 | -- | Parser for @text:sha256:<h>@ |
40 | 34 | caText :: Parser ContentAddressableAddress |
41 | 35 | caText = do |
42 | | - _ <- "text:sha256:" |
43 | | - digest <- parseDigest |
44 | | - either fail return |
45 | | - $ Text <$> digest |
| 36 | + _ <- "text:sha256:" |
| 37 | + digest <- decodeBase32 @'SHA256 <$> parseHash |
| 38 | + either fail return $ Text <$> digest |
46 | 39 |
|
47 | 40 | -- | Parser for @fixed:<r?>:<ht>:<h>@ |
48 | | -caFixed :: forall hashAlgo . NamedAlgo hashAlgo => Parser ContentAddressableAddress |
| 41 | +caFixed :: Parser ContentAddressableAddress |
49 | 42 | caFixed = do |
50 | | - _ <- "fixed:" |
51 | | - narHashMode <- (pure Recursive <$> "true") <|> (pure RegularFile <$> "false") |
52 | | - <?> "Invalid Base32 part" |
53 | | - digest <- parseDigest |
| 43 | + _ <- "fixed:" |
| 44 | + narHashMode <- (pure Recursive <$> "r:") <|> (pure RegularFile <$> "") |
| 45 | + digest <- parseTypedDigest |
| 46 | + either fail return $ Fixed narHashMode <$> digest |
| 47 | + |
| 48 | +parseTypedDigest :: Parser (Either String SomeNamedDigest) |
| 49 | +parseTypedDigest = mkNamedDigest <$> parseHashType <*> parseHash |
54 | 50 |
|
55 | | - either fail return |
56 | | - $ Fixed <$> pure narHashMode <*> (SomeDigest @hashAlgo <$> digest) |
| 51 | +parseHashType :: Parser Data.Text.Text |
| 52 | +parseHashType = decodeUtf8 <$> ("sha256" <|> "sha1" <|> "md5") <* ":" |
57 | 53 |
|
58 | | -parseDigest :: forall a . Parser (Either String (Digest a)) |
59 | | -parseDigest = |
60 | | - System.Nix.Hash.decodeBase32 |
61 | | - . Data.Text.pack |
62 | | - . Data.ByteString.Char8.unpack |
63 | | - <$> Data.Attoparsec.ByteString.Char8.takeWhile1 |
64 | | - (\c -> c `elem` System.Nix.Internal.Base32.digits32) |
| 54 | +parseHash :: Parser Data.Text.Text |
| 55 | +parseHash = decodeUtf8 <$> takeWhile1 (/= ':') |
0 commit comments