on master help sign in
Re #195: factor out parts of yaml2json into module Common

This is code to be reused by json2yaml.

commit620ef8eb7b68b6629d3350db43c09eb45bcbd74e authorAndreas Abel <andreas.abel@ifi.lmu.de> dateWed 15 Sep 2021, 09:24 (5 years ago) parentdb34ecf
3 files changed+70−39
yaml/exe/Common.hs+60 yaml/exe/yaml2json.hs+8−38 yaml/yaml.cabal+2−1
yaml/exe/Common.hsnew file+60
@@ -0,0 +1,60 @@
1+{-# LANGUAGE CPP #-}
2+{-# LANGUAGE LambdaCase #-}
3+
4+-- | Code shared between @yaml2json@ and @json2yaml@.
5+
6+module Common where
7+
8+import Data.List ( intercalate )
9+#if !MIN_VERSION_base(4,11,0)
10+import Data.Semigroup ( Semigroup(..) )
11+#endif
12+import Data.Version ( Version(versionBranch) )
13+
14+import Options.Applicative ( Parser, help, hidden, infoOption, long, short )
15+
16+import qualified Paths_yaml as Paths
17+
18+-- * Version info and option
19+---------------------------------------------------------------------------
20+
21+-- | Homepage for @yaml2json@ and @json2yaml@.
22+
23+homepage :: String
24+homepage = "https://github.com/snoyberg/yaml/"
25+
26+-- | Version in @x.y.z@ format.
27+
28+version :: String
29+version = intercalate "." $ map show $ versionBranch Paths.version
30+
31+-- | Option @--numeric-version@.
32+
33+numericVersionOption :: Parser (a -> a)
34+numericVersionOption =
35+ infoOption version
36+ $ long "numeric-version"
37+ <> hidden
38+ <> help "Show just version number."
39+
40+-- | Option @--version@.
41+
42+versionOption :: String -> Parser (a -> a)
43+versionOption self =
44+ infoOption (unwords versionWords)
45+ $ long "version"
46+ <> short 'V'
47+ <> hidden
48+ <> help "Show version info."
49+ where
50+ versionWords = [ self, "version", version, homepage ]
51+
52+-- * Misc
53+---------------------------------------------------------------------------
54+
55+-- | @Just@ unless argument is @"-"@ (denoting @stdin@ or @stdout@).
56+
57+dashToNothing :: FilePath -> Maybe FilePath
58+dashToNothing = \case
59+ "-" -> Nothing
60+ file -> Just file
yaml/exe/yaml2json.hs+8−38
@@ -7,27 +7,26 @@ import Prelude hiding (putStr, getContents)
77import Data.Aeson (encode, Value)
88import Data.ByteString (getContents)
99import Data.ByteString.Lazy (putStr)
10−import Data.List (intercalate)
1110#if !MIN_VERSION_base(4,11,0)
1211import Data.Semigroup (Semigroup(..))
1312#endif
14−import Data.Version (Version(versionBranch))
1513import Data.Yaml (decodeFileEither, decodeEither')
1614
1715import Options.Applicative
1816 ( Parser
19− , action, execParser, header, help, helper, hidden
20− , info, infoOption, long, metavar, short, strArgument
17+ , action, execParser, header, help, helper, info
18+ , metavar, strArgument
2119 )
2220
2321import System.Exit
2422import System.IO (stderr, hPrint)
2523
26−import qualified Paths_yaml as Paths
24+import Common
25+ ( versionOption, numericVersionOption, dashToNothing )
2726
2827newtype Options = Options
2928 { optInput :: Maybe FilePath
30− -- ^ Nothing means @stdin@.
29+ -- ^ 'Nothing' means @stdin@.
3130 }
3231
3332-- | Name of the executable.
@@ -35,52 +34,23 @@ newtype Options = Options
3534self :: String
3635self = "yaml2json"
3736
38−-- | Homepage for this program.
39−
40−homepage :: String
41−homepage = "https://github.com/snoyberg/yaml/"
42−
43−-- | Version in @x.y.z@ format.
44−
45−version :: String
46−version = intercalate "." $ map show $ versionBranch Paths.version
47−
4837-- | Parse options; handle parse errors, @--help@, @--version@.
4938
5039options :: IO Options
5140options =
5241 execParser $
53− info (helper <*> versionOption <*> numericVersionOption <*> programOptions)
54− (header "Reads given YAML document and prints it JSON format to standard out.")
42+ info (helper <*> versionOption self <*> numericVersionOption <*> programOptions)
43+ (header "Reads given YAML document and prints it in JSON format to standard out.")
5544
5645 where
57− versionOption =
58− infoOption (unwords versionWords)
59− $ long "version"
60− <> short 'V'
61− <> hidden
62− <> help "Show version info."
63− versionWords = [ self, "version", version, homepage ]
64−
65− numericVersionOption =
66− infoOption version
67− $ long "numeric-version"
68− <> hidden
69− <> help "Show just version number."
70−
7146 programOptions = Options <$> oInput
7247
7348 oInput :: Parser (Maybe FilePath)
74− oInput = dashToStdin <$> do
49+ oInput = dashToNothing <$> do
7550 strArgument
7651 $ metavar "FILE"
7752 <> action "file"
7853 <> help "The input file containing the YAML document; use '-' for stdin."
79− where
80− -- dash is interpreted as stdin
81− dashToStdin = \case
82− "-" -> Nothing
83− file -> Just file
8454
8555showJSON :: Show a => Either a Value -> IO b
8656showJSON = \case
yaml/yaml.cabal+2−1
@@ -5,7 +5,7 @@ cabal-version: 1.12
55-- see: https://github.com/sol/hpack
66
77name: yaml
8−version: 0.11.5.0
8+version: 0.11.6.0
99synopsis: Support for parsing and rendering YAML documents.
1010description: README and API documentation are available at <https://www.stackage.org/package/yaml>
1111category: Data
@@ -151,6 +151,7 @@ executable json2yaml
151151executable yaml2json
152152 main-is: yaml2json.hs
153153 other-modules:
154+ Common
154155 Paths_yaml
155156 hs-source-dirs:
156157 exe