|
1 |
| -{-# LANGUAGE DerivingStrategies #-} |
2 | 1 | {-# LANGUAGE TemplateHaskell #-}
|
3 | 2 |
|
4 | 3 | module Hydra.NetworkVersions where
|
5 | 4 |
|
6 | 5 | import Hydra.Prelude hiding (encodeUtf8)
|
7 | 6 |
|
8 |
| -import Control.Lens ((^@..)) |
9 |
| -import Data.Aeson (Value (..)) |
10 |
| -import Data.Aeson.Key qualified as Key |
11 |
| -import Data.Aeson.KeyMap qualified as KeyMap |
12 |
| -import Data.Aeson.Lens (members, _Object) |
| 7 | +import Control.Lens ((^.), (^?)) |
| 8 | +import Data.Aeson (Value (..), encode) |
| 9 | +import Data.Aeson.Lens (key, nonNull, _Key) |
13 | 10 | import Data.FileEmbed (embedFile, makeRelativeToProject)
|
14 |
| -import Data.List qualified as List |
15 |
| -import Data.Text (pack, splitOn, toLower, unpack) |
| 11 | +import Data.Text (splitOn) |
16 | 12 | import Data.Text.Encoding (encodeUtf8)
|
| 13 | +import Data.Version (Version (..), showVersion) |
17 | 14 | import Hydra.Cardano.Api (TxId, deserialiseFromRawBytesHex)
|
18 |
| -import Hydra.Version (gitDescribe) |
| 15 | +import Hydra.Version (embeddedRevision, gitRevision, unknownVersion) |
| 16 | +import Paths_hydra_node (version) |
| 17 | + |
| 18 | +hydraNodeVersion :: Version |
| 19 | +hydraNodeVersion = |
| 20 | + version & \(Version semver _) -> Version semver revision |
| 21 | + where |
| 22 | + revision = |
| 23 | + maybeToList $ |
| 24 | + embeddedRevision |
| 25 | + <|> gitRevision |
| 26 | + <|> Just unknownVersion |
19 | 27 |
|
20 |
| -{-# NOINLINE networkVersions #-} |
21 | 28 | networkVersions :: ByteString
|
22 | 29 | networkVersions = $(makeRelativeToProject "./networks.json" >>= embedFile)
|
23 | 30 |
|
24 |
| -parseNetworkTxIds :: String -> Either String [TxId] |
25 |
| -parseNetworkTxIds networkString = do |
26 |
| - let networkTxt = toLower $ pack networkString |
27 |
| - let info = networkVersions ^@.. members . _Object |
28 |
| - case find (\(n, _) -> Key.toText n == networkTxt) info of |
29 |
| - Nothing -> Left $ "Unknown network:" <> unpack networkTxt |
30 |
| - Just (_, t) -> getLastTxId t |
| 31 | +parseNetworkTxIds :: MonadFail m => Version -> String -> m [TxId] |
| 32 | +parseNetworkTxIds hydraVersion network = do |
| 33 | + case networkVersions ^? key (network ^. _Key) of |
| 34 | + Nothing -> fail $ "Unknown network: " <> toString network |
| 35 | + Just t -> getLastTxId t |
31 | 36 | where
|
32 | 37 | getLastTxId t = do
|
33 |
| - lastTxIds <- |
34 |
| - case gitDescribe of |
35 |
| - Nothing -> Left "Missing hydra-node revision." |
36 |
| - Just fullRev -> do |
37 |
| - let rev = List.head $ splitOn "-" $ pack fullRev |
38 |
| - case List.find (String rev ==) (KeyMap.elems t) of |
39 |
| - Just (String s) -> Right s |
40 |
| - _ -> Left "Failed to find released hydra-node version in networks.json." |
41 |
| - mapM parseToTxId (splitOn "," lastTxIds) |
| 38 | + case splitOn "-" $ fromString $ showVersion hydraVersion of |
| 39 | + [] -> fail "Failed to parse hydra-node revision." |
| 40 | + (rev : _) -> do |
| 41 | + case encode t ^? key (rev ^. _Key) . nonNull of |
| 42 | + Just (String s) -> mapM parseToTxId $ splitOn "," s |
| 43 | + _ -> fail "Failed to find released hydra-node version in networks.json." |
42 | 44 |
|
43 | 45 | parseToTxId textTxId = do
|
44 | 46 | case deserialiseFromRawBytesHex $ encodeUtf8 textTxId of
|
45 |
| - Left _ -> Left $ "Failed to parse string to TxId: " <> unpack textTxId |
46 |
| - Right txid -> Right txid |
| 47 | + Left _ -> fail $ "Failed to parse string to TxId: " <> toString textTxId |
| 48 | + Right txid -> pure txid |
0 commit comments