packages feed

json-tools-0.4.0: json-lines.hs

import Data.Aeson
import qualified Data.ByteString.Lazy as L
import qualified Data.ByteString.Lazy.Char8 as L8
import Control.Monad (when)
import System.Environment (getArgs)
import System.Exit (exitFailure)
import System.IO (hPutStrLn,stderr)
import Utils (readFiles)
import qualified Data.Vector as V

jsonUnlines :: Value -> [Value]
jsonUnlines (Array xs) = V.toList xs
jsonUnlines _          = error "Unexpected JSON value, only an array was expected"

usage :: IO a
usage = mapM_ (hPutStrLn stderr)
  ["Usage: json-line [--help] <file>*"
  ,""
  ,"Reads the given files as JSON arrays (or standard input, if '-' or"
  ,"no file is given). Writes on standard output the elements of these"
  ,"arrays as one JSON document per line."]
  >> exitFailure

main :: IO ()
main =
 do args <- getArgs
    when ("--help"`elem`args) usage
    L.putStr                  -- printing the output
     . L8.unlines             -- joining lines
     . map encode             -- showing each item
     . concat                 -- merge lines from all files
     . map (                  -- for each file
         jsonUnlines          -- main processing
         . maybe err id       -- error handling
         . decode'            -- parsing each file as JSON
       ) =<< readFiles args   -- reading the input
  where err = error "JSON decoding error"