From 23910e70e3c5d4a3285a0fba0b7f0b1daa5ef6fe Mon Sep 17 00:00:00 2001 From: Simon Jakobi Date: Wed, 11 Sep 2019 08:05:19 +0200 Subject: [PATCH] dhall-json: Add --output options (#1304) As requested in #1303. --- dhall-json/dhall-to-json/Main.hs | 17 +++++++++++++++-- dhall-json/dhall-to-yaml/Main.hs | 15 ++++++++++++++- dhall-json/json-to-dhall/Main.hs | 32 +++++++++++++++++++++++++------- dhall-json/src/Dhall/Yaml.hs | 2 ++ dhall-json/yaml-to-dhall/Main.hs | 31 ++++++++++++++++++++++++------- 5 files changed, 80 insertions(+), 17 deletions(-) diff --git a/dhall-json/dhall-to-json/Main.hs b/dhall-json/dhall-to-json/Main.hs index 0282b4c..0309ea5 100644 --- a/dhall-json/dhall-to-json/Main.hs +++ b/dhall-json/dhall-to-json/Main.hs @@ -14,7 +14,6 @@ import Options.Applicative (Parser, ParserInfo) import qualified Control.Exception import qualified Data.Aeson import qualified Data.Aeson.Encode.Pretty -import qualified Data.ByteString.Char8 import qualified Data.ByteString.Lazy import qualified Data.Text.IO as Text.IO import qualified Dhall @@ -33,6 +32,7 @@ data Options , conversion :: Conversion , approximateSpecialDoubles :: Bool , file :: Maybe FilePath + , output :: Maybe FilePath } | Version @@ -45,6 +45,7 @@ parseOptions = <*> Dhall.JSON.parseConversion <*> parseApproximateSpecialDoubles <*> optional parseFile + <*> optional parseOutput ) <|> parseVersion where @@ -94,6 +95,13 @@ parseOptions = <> Options.metavar "FILE" ) + parseOutput = + Options.strOption + ( Options.long "output" + <> Options.help "Write JSON to a file instead of standard output" + <> Options.metavar "FILE" + ) + parserInfo :: ParserInfo Options parserInfo = Options.info @@ -137,7 +145,12 @@ main = do json <- omission <$> explaining (Dhall.JSON.codeToValue conversion specialDoubleMode file text) - Data.ByteString.Char8.putStrLn $ Data.ByteString.Lazy.toStrict $ encode json + let write = + case output of + Nothing -> Data.ByteString.Lazy.putStr + Just file_ -> Data.ByteString.Lazy.writeFile file_ + + write (encode json <> "\n") handle :: IO a -> IO a handle = Control.Exception.handle handler diff --git a/dhall-json/dhall-to-yaml/Main.hs b/dhall-json/dhall-to-yaml/Main.hs index 23864a8..c683b8e 100644 --- a/dhall-json/dhall-to-yaml/Main.hs +++ b/dhall-json/dhall-to-yaml/Main.hs @@ -29,6 +29,7 @@ parseOptions = <*> parseQuoted <*> Dhall.JSON.parseConversion <*> optional parseFile + <*> optional parseOutput ) <|> parseVersion where @@ -52,6 +53,13 @@ parseOptions = <> Options.help "Display version" ) + parseOutput = + Options.strOption + ( Options.long "output" + <> Options.help "Write YAML to a file instead of standard output" + <> Options.metavar "FILE" + ) + parserInfo :: ParserInfo (Maybe Options) parserInfo = Options.info @@ -76,7 +84,12 @@ main = do Nothing -> Text.IO.getContents Just path -> Text.IO.readFile path - Data.ByteString.putStr =<< dhallToYaml options file contents + let write = + case output of + Nothing -> Data.ByteString.putStr + Just file_ -> Data.ByteString.writeFile file_ + + write =<< dhallToYaml options file contents handle :: IO a -> IO a handle = Control.Exception.handle handler diff --git a/dhall-json/json-to-dhall/Main.hs b/dhall-json/json-to-dhall/Main.hs index 4f2e864..07d790a 100644 --- a/dhall-json/json-to-dhall/Main.hs +++ b/dhall-json/json-to-dhall/Main.hs @@ -23,6 +23,7 @@ import qualified Data.ByteString.Lazy.Char8 as ByteString import qualified Data.Text.IO as Text.IO import qualified Data.Text.Prettyprint.Doc as Pretty import qualified Data.Text.Prettyprint.Doc.Render.Terminal as Pretty.Terminal +import qualified Data.Text.Prettyprint.Doc.Render.Text as Pretty.Text import qualified GHC.IO.Encoding import qualified Options.Applicative as Options import qualified System.Console.ANSI as ANSI @@ -49,6 +50,7 @@ data Options { schema :: Text , conversion :: Conversion , file :: Maybe FilePath + , output :: Maybe FilePath , ascii :: Bool , plain :: Bool } @@ -62,6 +64,7 @@ parseOptions = <$> parseSchema <*> parseConversion <*> optional parseFile + <*> optional parseOutput <*> parseASCII <*> parsePlain ) @@ -88,6 +91,13 @@ parseOptions = <> Options.metavar "FILE" ) + parseOutput = + Options.strOption + ( Options.long "output" + <> Options.help "Write Dhall expression to a file instead of standard output" + <> Options.metavar "FILE" + ) + parseASCII = Options.switch ( Options.long "ascii" @@ -138,16 +148,24 @@ main = do let stream = Pretty.layoutSmart Dhall.Pretty.layoutOpts document - supportsANSI <- ANSI.hSupportsANSI IO.stdout + case output of + Nothing -> do + supportsANSI <- ANSI.hSupportsANSI IO.stdout - let ansiStream = - if supportsANSI && not plain - then fmap Dhall.Pretty.annToAnsiStyle stream - else Pretty.unAnnotateS stream + let ansiStream = + if supportsANSI && not plain + then fmap Dhall.Pretty.annToAnsiStyle stream + else Pretty.unAnnotateS stream - Pretty.Terminal.renderIO IO.stdout ansiStream + Pretty.Terminal.renderIO IO.stdout ansiStream - Text.IO.putStrLn "" + Text.IO.putStrLn "" + + Just file_ -> + IO.withFile file_ IO.WriteMode $ \h -> do + Pretty.Text.renderIO h stream + + Text.IO.hPutStrLn h "" handle :: IO a -> IO a handle = Control.Exception.handle handler diff --git a/dhall-json/src/Dhall/Yaml.hs b/dhall-json/src/Dhall/Yaml.hs index a856adb..f110ea2 100644 --- a/dhall-json/src/Dhall/Yaml.hs +++ b/dhall-json/src/Dhall/Yaml.hs @@ -38,6 +38,7 @@ data Options = Options , quoted :: Bool , conversion :: Conversion , file :: Maybe FilePath + , output :: Maybe FilePath } defaultOptions :: Options @@ -48,6 +49,7 @@ defaultOptions = , quoted = False , conversion = NoConversion , file = Nothing + , output = Nothing } parseDocuments :: Parser Bool diff --git a/dhall-json/yaml-to-dhall/Main.hs b/dhall-json/yaml-to-dhall/Main.hs index 6deb12e..417140a 100644 --- a/dhall-json/yaml-to-dhall/Main.hs +++ b/dhall-json/yaml-to-dhall/Main.hs @@ -23,6 +23,7 @@ import qualified Data.ByteString.Char8 as BSL8 import qualified Data.Text.IO as Text.IO import qualified Data.Text.Prettyprint.Doc as Pretty import qualified Data.Text.Prettyprint.Doc.Render.Terminal as Pretty.Terminal +import qualified Data.Text.Prettyprint.Doc.Render.Text as Pretty.Text import qualified Dhall.Pretty import qualified GHC.IO.Encoding import qualified Options.Applicative as Options @@ -40,6 +41,7 @@ data CommandOptions { schema :: Text , conversion :: Conversion , file :: Maybe FilePath + , output :: Maybe FilePath , ascii :: Bool , plain :: Bool } @@ -61,6 +63,7 @@ parseOptions = <$> parseSchema <*> parseConversion <*> optional parseFile + <*> optional parseOutput <*> parseASCII <*> parsePlain ) @@ -87,6 +90,13 @@ parseOptions = <> Options.metavar "FILE" ) + parseOutput = + Options.strOption + ( Options.long "output" + <> Options.help "Write Dhall expression to a file instead of standard output" + <> Options.metavar "FILE" + ) + parseASCII = Options.switch ( Options.long "ascii" @@ -129,17 +139,24 @@ main = do let stream = Pretty.layoutSmart Dhall.Pretty.layoutOpts document - supportsANSI <- ANSI.hSupportsANSI IO.stdout + case output of + Nothing -> do + supportsANSI <- ANSI.hSupportsANSI IO.stdout - let ansiStream = - if supportsANSI && not plain - then fmap Dhall.Pretty.annToAnsiStyle stream - else Pretty.unAnnotateS stream + let ansiStream = + if supportsANSI && not plain + then fmap Dhall.Pretty.annToAnsiStyle stream + else Pretty.unAnnotateS stream - Pretty.Terminal.renderIO IO.stdout ansiStream + Pretty.Terminal.renderIO IO.stdout ansiStream - Text.IO.putStrLn "" + Text.IO.putStrLn "" + Just file_ -> + IO.withFile file_ IO.WriteMode $ \h -> do + Pretty.Text.renderIO h stream + + Text.IO.hPutStrLn h "" handle :: IO a -> IO a handle = Control.Exception.handle handler