Skip to content

Commit 23910e7

Browse files
sjakobimergify[bot]
authored andcommitted
dhall-json: Add --output options (#1304)
As requested in #1303.
1 parent cb5ccab commit 23910e7

File tree

5 files changed

+80
-17
lines changed

5 files changed

+80
-17
lines changed

dhall-json/dhall-to-json/Main.hs

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,6 @@ import Options.Applicative (Parser, ParserInfo)
1414
import qualified Control.Exception
1515
import qualified Data.Aeson
1616
import qualified Data.Aeson.Encode.Pretty
17-
import qualified Data.ByteString.Char8
1817
import qualified Data.ByteString.Lazy
1918
import qualified Data.Text.IO as Text.IO
2019
import qualified Dhall
@@ -33,6 +32,7 @@ data Options
3332
, conversion :: Conversion
3433
, approximateSpecialDoubles :: Bool
3534
, file :: Maybe FilePath
35+
, output :: Maybe FilePath
3636
}
3737
| Version
3838

@@ -45,6 +45,7 @@ parseOptions =
4545
<*> Dhall.JSON.parseConversion
4646
<*> parseApproximateSpecialDoubles
4747
<*> optional parseFile
48+
<*> optional parseOutput
4849
)
4950
<|> parseVersion
5051
where
@@ -94,6 +95,13 @@ parseOptions =
9495
<> Options.metavar "FILE"
9596
)
9697

98+
parseOutput =
99+
Options.strOption
100+
( Options.long "output"
101+
<> Options.help "Write JSON to a file instead of standard output"
102+
<> Options.metavar "FILE"
103+
)
104+
97105
parserInfo :: ParserInfo Options
98106
parserInfo =
99107
Options.info
@@ -137,7 +145,12 @@ main = do
137145

138146
json <- omission <$> explaining (Dhall.JSON.codeToValue conversion specialDoubleMode file text)
139147

140-
Data.ByteString.Char8.putStrLn $ Data.ByteString.Lazy.toStrict $ encode json
148+
let write =
149+
case output of
150+
Nothing -> Data.ByteString.Lazy.putStr
151+
Just file_ -> Data.ByteString.Lazy.writeFile file_
152+
153+
write (encode json <> "\n")
141154

142155
handle :: IO a -> IO a
143156
handle = Control.Exception.handle handler

dhall-json/dhall-to-yaml/Main.hs

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ parseOptions =
2929
<*> parseQuoted
3030
<*> Dhall.JSON.parseConversion
3131
<*> optional parseFile
32+
<*> optional parseOutput
3233
)
3334
<|> parseVersion
3435
where
@@ -52,6 +53,13 @@ parseOptions =
5253
<> Options.help "Display version"
5354
)
5455

56+
parseOutput =
57+
Options.strOption
58+
( Options.long "output"
59+
<> Options.help "Write YAML to a file instead of standard output"
60+
<> Options.metavar "FILE"
61+
)
62+
5563
parserInfo :: ParserInfo (Maybe Options)
5664
parserInfo =
5765
Options.info
@@ -76,7 +84,12 @@ main = do
7684
Nothing -> Text.IO.getContents
7785
Just path -> Text.IO.readFile path
7886

79-
Data.ByteString.putStr =<< dhallToYaml options file contents
87+
let write =
88+
case output of
89+
Nothing -> Data.ByteString.putStr
90+
Just file_ -> Data.ByteString.writeFile file_
91+
92+
write =<< dhallToYaml options file contents
8093

8194
handle :: IO a -> IO a
8295
handle = Control.Exception.handle handler

dhall-json/json-to-dhall/Main.hs

Lines changed: 25 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ import qualified Data.ByteString.Lazy.Char8 as ByteString
2323
import qualified Data.Text.IO as Text.IO
2424
import qualified Data.Text.Prettyprint.Doc as Pretty
2525
import qualified Data.Text.Prettyprint.Doc.Render.Terminal as Pretty.Terminal
26+
import qualified Data.Text.Prettyprint.Doc.Render.Text as Pretty.Text
2627
import qualified GHC.IO.Encoding
2728
import qualified Options.Applicative as Options
2829
import qualified System.Console.ANSI as ANSI
@@ -49,6 +50,7 @@ data Options
4950
{ schema :: Text
5051
, conversion :: Conversion
5152
, file :: Maybe FilePath
53+
, output :: Maybe FilePath
5254
, ascii :: Bool
5355
, plain :: Bool
5456
}
@@ -62,6 +64,7 @@ parseOptions =
6264
<$> parseSchema
6365
<*> parseConversion
6466
<*> optional parseFile
67+
<*> optional parseOutput
6568
<*> parseASCII
6669
<*> parsePlain
6770
)
@@ -88,6 +91,13 @@ parseOptions =
8891
<> Options.metavar "FILE"
8992
)
9093

94+
parseOutput =
95+
Options.strOption
96+
( Options.long "output"
97+
<> Options.help "Write Dhall expression to a file instead of standard output"
98+
<> Options.metavar "FILE"
99+
)
100+
91101
parseASCII =
92102
Options.switch
93103
( Options.long "ascii"
@@ -138,16 +148,24 @@ main = do
138148

139149
let stream = Pretty.layoutSmart Dhall.Pretty.layoutOpts document
140150

141-
supportsANSI <- ANSI.hSupportsANSI IO.stdout
151+
case output of
152+
Nothing -> do
153+
supportsANSI <- ANSI.hSupportsANSI IO.stdout
154+
155+
let ansiStream =
156+
if supportsANSI && not plain
157+
then fmap Dhall.Pretty.annToAnsiStyle stream
158+
else Pretty.unAnnotateS stream
159+
160+
Pretty.Terminal.renderIO IO.stdout ansiStream
142161

143-
let ansiStream =
144-
if supportsANSI && not plain
145-
then fmap Dhall.Pretty.annToAnsiStyle stream
146-
else Pretty.unAnnotateS stream
162+
Text.IO.putStrLn ""
147163

148-
Pretty.Terminal.renderIO IO.stdout ansiStream
164+
Just file_ ->
165+
IO.withFile file_ IO.WriteMode $ \h -> do
166+
Pretty.Text.renderIO h stream
149167

150-
Text.IO.putStrLn ""
168+
Text.IO.hPutStrLn h ""
151169

152170
handle :: IO a -> IO a
153171
handle = Control.Exception.handle handler

dhall-json/src/Dhall/Yaml.hs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@ data Options = Options
3838
, quoted :: Bool
3939
, conversion :: Conversion
4040
, file :: Maybe FilePath
41+
, output :: Maybe FilePath
4142
}
4243

4344
defaultOptions :: Options
@@ -48,6 +49,7 @@ defaultOptions =
4849
, quoted = False
4950
, conversion = NoConversion
5051
, file = Nothing
52+
, output = Nothing
5153
}
5254

5355
parseDocuments :: Parser Bool

dhall-json/yaml-to-dhall/Main.hs

Lines changed: 24 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ import qualified Data.ByteString.Char8 as BSL8
2323
import qualified Data.Text.IO as Text.IO
2424
import qualified Data.Text.Prettyprint.Doc as Pretty
2525
import qualified Data.Text.Prettyprint.Doc.Render.Terminal as Pretty.Terminal
26+
import qualified Data.Text.Prettyprint.Doc.Render.Text as Pretty.Text
2627
import qualified Dhall.Pretty
2728
import qualified GHC.IO.Encoding
2829
import qualified Options.Applicative as Options
@@ -40,6 +41,7 @@ data CommandOptions
4041
{ schema :: Text
4142
, conversion :: Conversion
4243
, file :: Maybe FilePath
44+
, output :: Maybe FilePath
4345
, ascii :: Bool
4446
, plain :: Bool
4547
}
@@ -61,6 +63,7 @@ parseOptions =
6163
<$> parseSchema
6264
<*> parseConversion
6365
<*> optional parseFile
66+
<*> optional parseOutput
6467
<*> parseASCII
6568
<*> parsePlain
6669
)
@@ -87,6 +90,13 @@ parseOptions =
8790
<> Options.metavar "FILE"
8891
)
8992

93+
parseOutput =
94+
Options.strOption
95+
( Options.long "output"
96+
<> Options.help "Write Dhall expression to a file instead of standard output"
97+
<> Options.metavar "FILE"
98+
)
99+
90100
parseASCII =
91101
Options.switch
92102
( Options.long "ascii"
@@ -129,17 +139,24 @@ main = do
129139

130140
let stream = Pretty.layoutSmart Dhall.Pretty.layoutOpts document
131141

132-
supportsANSI <- ANSI.hSupportsANSI IO.stdout
142+
case output of
143+
Nothing -> do
144+
supportsANSI <- ANSI.hSupportsANSI IO.stdout
145+
146+
let ansiStream =
147+
if supportsANSI && not plain
148+
then fmap Dhall.Pretty.annToAnsiStyle stream
149+
else Pretty.unAnnotateS stream
133150

134-
let ansiStream =
135-
if supportsANSI && not plain
136-
then fmap Dhall.Pretty.annToAnsiStyle stream
137-
else Pretty.unAnnotateS stream
151+
Pretty.Terminal.renderIO IO.stdout ansiStream
138152

139-
Pretty.Terminal.renderIO IO.stdout ansiStream
153+
Text.IO.putStrLn ""
140154

141-
Text.IO.putStrLn ""
155+
Just file_ ->
156+
IO.withFile file_ IO.WriteMode $ \h -> do
157+
Pretty.Text.renderIO h stream
142158

159+
Text.IO.hPutStrLn h ""
143160

144161
handle :: IO a -> IO a
145162
handle = Control.Exception.handle handler

0 commit comments

Comments
 (0)