packages feed

json-tools-0.4.0: tar2json.hs

import Codec.Archive.Tar as Tar
import qualified Data.HashMap.Strict as HM
import qualified Data.Aeson as Aeson
import qualified Data.Text as T
import qualified Data.ByteString.Lazy as L
import System.IO

{-TODO currently does not work for binary files-}

tar2json :: Tar.Entries FormatError -> Aeson.Value
tar2json es0 = Aeson.Object $ HM.fromList [(k,v) | (k,Just v) <- entries es0] where

  entries :: Tar.Entries FormatError -> [(T.Text, Maybe Aeson.Value)]
  entries Done         = []
  entries (Fail s)     = error . show $ s
  entries (Next e es)  = (path e, contents e) : entries es

  path :: Tar.Entry -> T.Text
  path = T.pack . entryPath

  contents :: Tar.Entry -> Maybe Aeson.Value
  contents = fmap Aeson.toJSON . f . entryContent where
    f (NormalFile s _) = Just s
    f _                = Nothing

main :: IO ()
main
 = do hPutStrLn stderr "Reading standard input..."
      hSetEncoding stdin latin1
      hSetEncoding stdout latin1
      L.putStr            -- printing output
       . Aeson.encode     -- producing JSON
       . tar2json         -- main translation
       . Tar.read         -- reading the archive
       =<< L.getContents  -- reading the input