Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
68 changes: 42 additions & 26 deletions dhall-json/dhall-to-json/Main.hs
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@

module Main where

import Control.Applicative ((<|>))
import Control.Applicative ((<|>), optional)
import Control.Exception (SomeException)
import Control.Monad (when)
import Data.Aeson (Value)
Expand All @@ -17,12 +17,13 @@ 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
import qualified Data.Text as Text
import qualified Data.Text.IO as Text.IO
import qualified Dhall
import qualified Dhall.JSON
import qualified GHC.IO.Encoding
import qualified Options.Applicative
import qualified Paths_dhall_json as Meta
import qualified Options.Applicative as Options
import qualified Paths_dhall_json as Meta
import qualified System.Exit
import qualified System.IO

Expand All @@ -33,6 +34,7 @@ data Options = Options
, version :: Bool
, conversion :: Conversion
, approximateSpecialDoubles :: Bool
, file :: Maybe FilePath
}

parseOptions :: Parser Options
Expand All @@ -44,58 +46,66 @@ parseOptions =
<*> parseVersion
<*> Dhall.JSON.parseConversion
<*> parseApproximateSpecialDoubles
<*> optional parseFile
where
parseExplain =
Options.Applicative.switch
( Options.Applicative.long "explain"
<> Options.Applicative.help "Explain error messages in detail"
Options.switch
( Options.long "explain"
<> Options.help "Explain error messages in detail"
)

parsePretty =
prettyFlag <|> compactFlag <|> defaultBehavior
where
prettyFlag =
Options.Applicative.flag'
Options.flag'
True
( Options.Applicative.long "pretty"
<> Options.Applicative.help "Pretty print generated JSON"
( Options.long "pretty"
<> Options.help "Pretty print generated JSON"
)

compactFlag =
Options.Applicative.flag'
Options.flag'
False
( Options.Applicative.long "compact"
<> Options.Applicative.help "Render JSON on one line"
( Options.long "compact"
<> Options.help "Render JSON on one line"
)

defaultBehavior =
pure False

parseVersion =
Options.Applicative.switch
( Options.Applicative.long "version"
<> Options.Applicative.help "Display version"
Options.switch
( Options.long "version"
<> Options.help "Display version"
)

parseApproximateSpecialDoubles =
Options.Applicative.switch
( Options.Applicative.long "approximate-special-doubles"
<> Options.Applicative.help "Use approximate representation for NaN/±Infinity"
Options.switch
( Options.long "approximate-special-doubles"
<> Options.help "Use approximate representation for NaN/±Infinity"
)

parseFile =
Options.strOption
( Options.long "file"
<> Options.help "Read expression from a file instead of standard input"
<> Options.metavar "FILE"
)

parserInfo :: ParserInfo Options
parserInfo =
Options.Applicative.info
(Options.Applicative.helper <*> parseOptions)
( Options.Applicative.fullDesc
<> Options.Applicative.progDesc "Compile Dhall to JSON"
Options.info
(Options.helper <*> parseOptions)
( Options.fullDesc
<> Options.progDesc "Compile Dhall to JSON"
)

main :: IO ()
main = do
GHC.IO.Encoding.setLocaleEncoding GHC.IO.Encoding.utf8

Options {..} <- Options.Applicative.execParser parserInfo
Options {..} <- Options.execParser parserInfo

when version $ do
putStrLn (showVersion Meta.version)
Expand All @@ -119,9 +129,15 @@ main = do
then ApproximateWithinJSON
else ForbidWithinJSON

stdin <- Data.Text.IO.getContents
text <- case file of
Nothing -> Text.IO.getContents
Just path -> Text.IO.readFile path

let path = case file of
Nothing -> "(stdin)"
Just p -> Text.pack p

json <- omission <$> explaining (Dhall.JSON.codeToValue conversion specialDoubleMode "(stdin)" stdin)
json <- omission <$> explaining (Dhall.JSON.codeToValue conversion specialDoubleMode path text)

Data.ByteString.Char8.putStrLn $ Data.ByteString.Lazy.toStrict $ encode json

Expand Down
39 changes: 27 additions & 12 deletions dhall-json/dhall-to-yaml/Main.hs
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
{-# LANGUAGE RecordWildCards #-}
module Main where

import Control.Applicative (optional)
import Control.Exception (SomeException)
import Data.Monoid ((<>))
import Dhall.JSON (parseOmission, parseConversion)
Expand All @@ -10,9 +11,10 @@ import Options.Applicative (Parser, ParserInfo)

import qualified Control.Exception
import qualified Data.ByteString
import qualified Data.Text.IO
import qualified Data.Text as Text
import qualified Data.Text.IO as Text.IO
import qualified GHC.IO.Encoding
import qualified Options.Applicative
import qualified Options.Applicative as Options
import qualified System.Exit
import qualified System.IO

Expand All @@ -24,32 +26,45 @@ parseOptions =
<*> parseDocuments
<*> parseQuoted
<*> Dhall.JSON.parseConversion
<*> optional parseFile
where
parseExplain =
Options.Applicative.switch
( Options.Applicative.long "explain"
<> Options.Applicative.help "Explain error messages in detail"
Options.switch
( Options.long "explain"
<> Options.help "Explain error messages in detail"
)

parseFile =
Options.strOption
( Options.long "file"
<> Options.help "Read expression from a file instead of standard input"
<> Options.metavar "FILE"
)

parserInfo :: ParserInfo Options
parserInfo =
Options.Applicative.info
(Options.Applicative.helper <*> parseOptions)
( Options.Applicative.fullDesc
<> Options.Applicative.progDesc "Compile Dhall to YAML"
Options.info
(Options.helper <*> parseOptions)
( Options.fullDesc
<> Options.progDesc "Compile Dhall to YAML"
)

main :: IO ()
main = do
GHC.IO.Encoding.setLocaleEncoding GHC.IO.Encoding.utf8

options <- Options.Applicative.execParser parserInfo
options@Options {..} <- Options.execParser parserInfo

handle $ do
contents <- case file of
Nothing -> Text.IO.getContents
Just path -> Text.IO.readFile path

stdin <- Data.Text.IO.getContents
let path = case file of
Nothing -> "(stdin)"
Just p -> Text.pack p

Data.ByteString.putStr =<< dhallToYaml options "(stdin)" stdin
Data.ByteString.putStr =<< dhallToYaml options path contents

handle :: IO a -> IO a
handle = Control.Exception.handle handler
Expand Down
50 changes: 33 additions & 17 deletions dhall-json/json-to-dhall/Main.hs
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@

module Main where

import Control.Applicative (optional)
import qualified Control.Exception
import Control.Exception (SomeException, throwIO)
import Control.Monad (when)
Expand All @@ -18,7 +19,7 @@ import Data.Text (Text)
import qualified Data.Text.IO as Text
import Data.Version (showVersion)
import qualified GHC.IO.Encoding
import qualified Options.Applicative as O
import qualified Options.Applicative as Options
import Options.Applicative (Parser, ParserInfo)
import qualified System.Exit
import qualified System.IO
Expand All @@ -34,34 +35,46 @@ import qualified Paths_dhall_json as Meta

-- | Command info and description
parserInfo :: ParserInfo Options
parserInfo = O.info
( O.helper <*> parseOptions)
( O.fullDesc
<> O.progDesc "Populate Dhall value given its Dhall type (schema) from a JSON expression"
parserInfo = Options.info
( Options.helper <*> parseOptions)
( Options.fullDesc
<> Options.progDesc "Convert a JSON expression to a Dhall expression, given the expected Dhall type"
)

-- | All the command arguments and options
data Options = Options
{ version :: Bool
, schema :: Text
, conversion :: Conversion
, file :: Maybe FilePath
} deriving Show

-- | Parser for all the command arguments and options
parseOptions :: Parser Options
parseOptions = Options <$> parseVersion
<*> parseSchema
<*> parseConversion
<*> optional parseFile
where
parseSchema = O.strArgument
( O.metavar "SCHEMA"
<> O.help "Dhall type expression (schema)"
)
parseVersion = O.switch
( O.long "version"
<> O.short 'V'
<> O.help "Display version"
)
parseSchema =
Options.strArgument
( Options.metavar "SCHEMA"
<> Options.help "Dhall type expression (schema)"
)

parseVersion =
Options.switch
( Options.long "version"
<> Options.short 'V'
<> Options.help "Display version"
)

parseFile =
Options.strOption
( Options.long "file"
<> Options.help "Read JSON from a file instead of standard input"
<> Options.metavar "FILE"
)

-- ----------
-- Main
Expand All @@ -71,15 +84,18 @@ main :: IO ()
main = do
GHC.IO.Encoding.setLocaleEncoding GHC.IO.Encoding.utf8

Options {..} <- O.execParser parserInfo
Options {..} <- Options.execParser parserInfo

when version $ do
putStrLn (showVersion Meta.version)
System.Exit.exitSuccess

handle $ do
stdin <- BSL8.getContents
value :: A.Value <- case A.eitherDecode stdin of
bytes <- case file of
Nothing -> BSL8.getContents
Just path -> BSL8.readFile path

value :: A.Value <- case A.eitherDecode bytes of
Left err -> throwIO (userError err)
Right v -> pure v

Expand Down
2 changes: 2 additions & 0 deletions dhall-json/src/Dhall/Yaml.hs
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,7 @@ data Options = Options
, documents :: Bool
, quoted :: Bool
, conversion :: Conversion
, file :: Maybe FilePath
}

defaultOptions :: Options
Expand All @@ -46,6 +47,7 @@ defaultOptions =
, documents = False
, quoted = False
, conversion = NoConversion
, file = Nothing
}

parseDocuments :: Parser Bool
Expand Down
Loading