/
Parsers.hs
172 lines (139 loc) · 4.52 KB
/
Parsers.hs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
{-# LANGUAGE ApplicativeDo #-}
{-# LANGUAGE NamedFieldPuns #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE RankNTypes #-}
module Cardano.Config.Parsers
( command'
, parseConfigFile
, parseCoreNodeId
, parseDbPath
, parseFilePath
, parseLovelace
, parseUrl
, parseFlag
, parseFlag'
, parseFraction
, parseGenesisFile
, parseIntegral
, parseIntegralWithDefault
, parseLogOutputFile
, parseNodeAddress
, parseNodeId
, parseSigningKeyFile
, parseSocketPath
, readDouble
) where
import Prelude (String)
import Cardano.Prelude hiding (option)
import Cardano.Chain.Common (Lovelace, mkLovelace)
import Cardano.Config.Types
import Network.Socket (PortNumber)
import Options.Applicative
import Ouroboros.Consensus.NodeId (NodeId(..), CoreNodeId(..))
-- Common command line parsers
command' :: String -> String -> Parser a -> Mod CommandFields a
command' c descr p =
command c $ info (p <**> helper)
$ mconcat [ progDesc descr ]
parseConfigFile :: Parser FilePath
parseConfigFile =
strOption
( long "config"
<> metavar "NODE-CONFIGURATION"
<> help "Configuration file for the cardano-node"
<> completer (bashCompleter "file")
)
parseDbPath :: Parser FilePath
parseDbPath =
strOption
( long "database-path"
<> metavar "FILEPATH"
<> help "Directory where the state is stored."
)
parseGenesisFile :: String -> Parser GenesisFile
parseGenesisFile opt =
GenesisFile <$> parseFilePath opt "Genesis JSON file."
-- Common command line parsers
parseFilePath :: String -> String -> Parser FilePath
parseFilePath optname desc =
strOption $ long optname <> metavar "FILEPATH" <> help desc
parseFraction :: String -> String -> Parser Rational
parseFraction optname desc =
option (toRational <$> readDouble) $
long optname
<> metavar "DOUBLE"
<> help desc
parseLovelace :: String -> String -> Parser Lovelace
parseLovelace optname desc =
either (panic . show) identity . mkLovelace
<$> parseIntegral optname desc
parseUrl :: String -> String -> Parser String
parseUrl optname desc =
strOption $ long optname <> metavar "URL" <> help desc
parseIntegral :: Integral a => String -> String -> Parser a
parseIntegral optname desc = option (fromInteger <$> auto)
$ long optname <> metavar "INT" <> help desc
parseIntegralWithDefault :: Integral a => String -> String -> a -> Parser a
parseIntegralWithDefault optname desc def = option (fromInteger <$> auto)
$ long optname <> metavar "INT" <> help desc <> value def
parseFlag :: String -> String -> Parser Bool
parseFlag = parseFlag' False True
parseFlag' :: a -> a -> String -> String -> Parser a
parseFlag' def active optname desc =
flag def active $ long optname <> help desc
parseCoreNodeId :: Parser CoreNodeId
parseCoreNodeId =
option (fmap CoreNodeId auto) (
long "core-node-id"
<> metavar "CORE-NODE-ID"
<> help "The ID of the core node to which this client is connected."
)
parseNodeId :: String -> Parser NodeId
parseNodeId desc =
option (fmap (CoreId . CoreNodeId) auto) (
long "node-id"
<> metavar "NODE-ID"
<> help desc
)
parseNodeAddress :: Parser NodeAddress
parseNodeAddress = NodeAddress <$> parseHostAddr <*> parsePort
parseHostAddr :: Parser NodeHostAddress
parseHostAddr =
option (eitherReader parseNodeHostAddress) (
long "host-addr"
<> metavar "HOST-NAME"
<> help "Optionally limit node to one ipv6 or ipv4 address"
<> value (NodeHostAddress Nothing)
)
parsePort :: Parser PortNumber
parsePort =
option ((fromIntegral :: Int -> PortNumber) <$> auto) (
long "port"
<> metavar "PORT"
<> help "The port number"
<> value 0 -- Use an ephemeral port
)
parseSigningKeyFile :: String -> String -> Parser SigningKeyFile
parseSigningKeyFile opt desc = SigningKeyFile <$> parseFilePath opt desc
parseSocketPath :: Text -> Parser SocketPath
parseSocketPath helpMessage =
SocketPath <$> strOption
( long "socket-path"
<> (help $ toS helpMessage)
<> completer (bashCompleter "file")
<> metavar "FILEPATH"
)
parseLogOutputFile :: Parser FilePath
parseLogOutputFile =
strOption
( long "log-output"
<> metavar "FILEPATH"
<> help "Logging output file"
<> completer (bashCompleter "file")
)
readDouble :: ReadM Double
readDouble = do
f <- auto
when (f < 0) $ readerError "fraction must be >= 0"
when (f > 1) $ readerError "fraction must be <= 1"
return f