Something went wrong. Try again.
"Leading Comma JSON Formatter"
Something went wrong. Try again.
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899module Main where
import qualified Data.Aeson as Aesonimport qualified Data.ByteString.Lazy as BLimport qualified Data.Text as Timport qualified Data.Text.Encoding as TEimport qualified Data.Text.IO as TIOimport Data.Version (showVersion)import LCJF (prettyLeadingComma)import Options.Applicativeimport qualified Paths_lcjf as Pathsimport System.Exit (exitFailure)import System.IO (hPutStrLn, stderr)
data Options = Options { optInputFile :: Maybe FilePath , optOutputFile :: Maybe FilePath , optInplace :: Maybe FilePath , optInputString :: Maybe String } deriving (Show)
optionsParser :: Parser OptionsoptionsParser = Options <$> optional ( strOption ( long "file" <> short 'f' <> metavar "FILE" <> help "Read JSON from FILE instead of stdin" ) ) <*> optional ( strOption ( long "output" <> short 'o' <> metavar "FILE" <> help "Write output to FILE instead of stdout" ) ) <*> optional ( strOption ( long "inplace" <> short 'i' <> metavar "FILE" <> help "Format FILE in place (equivalent to -f FILE -o FILE)" ) ) <*> optional ( strArgument ( metavar "JSON" <> help "JSON string to format (if not provided, reads from stdin or file)" ) )
versionOption :: Parser (a -> a)versionOption = infoOption (showVersion Paths.version) ( long "version" <> short 'v' <> help "Show version number" )
optsInfo :: ParserInfo OptionsoptsInfo = info (optionsParser <**> versionOption <**> helper) ( fullDesc <> progDesc "Format JSON with leading commas in the style of Haskell/Elm" <> header "lcjf - Leading-Comma JSON Formatter" )
main :: IO ()main = do opts <- execParser optsInfo let (inputSource, outputDest) = resolveIO opts input <- readInput inputSource (optInputString opts) case Aeson.decode input of Nothing -> do hPutStrLn stderr "Error: Invalid JSON input" exitFailure Just val -> writeOutput outputDest (prettyLeadingComma val)
resolveIO :: Options -> (Maybe FilePath, Maybe FilePath)resolveIO opts = case optInplace opts of Just fp -> (Just fp, Just fp) Nothing -> (optInputFile opts, optOutputFile opts)
readInput :: Maybe FilePath -> Maybe String -> IO BL.ByteStringreadInput _ (Just jsonStr) = pure (BL.fromStrict (TE.encodeUtf8 (T.pack jsonStr)))readInput Nothing _ = BL.getContentsreadInput (Just fp) _ = BL.readFile fp
writeOutput :: Maybe FilePath -> T.Text -> IO ()writeOutput Nothing txt = TIO.putStrLn txtwriteOutput (Just fp) txt = TIO.writeFile fp (txt <> T.singleton '\n')