import Codec.Archive.Tar as Tar import Data.Convertible.Base (convertSuccess) import Data.Object import Data.Object.Json as Json import qualified Data.ByteString as S import qualified Data.ByteString.Char8 as S8 import qualified Data.ByteString.Lazy as L import System.IO tar2json :: Tar.Entries -> JsonObject tar2json es0 = Mapping [(k,v) | (k,Just v) <- entries es0] where entries :: Tar.Entries -> [(S.ByteString, Maybe JsonObject)] entries Done = [] entries (Fail s) = error s entries (Next e es) = (path e, contents e) : entries es path :: Tar.Entry -> S.ByteString path = S8.pack {- Is this an encoding mistake? -} . entryPath contents :: Tar.Entry -> Maybe JsonObject contents = fmap (Scalar . JsonString) . f . entryContent where f (NormalFile s _) = Just (convertSuccess s) f _ = Nothing main :: IO () main = do hPutStrLn stderr "Reading standard input..." hSetEncoding stdin latin1 hSetEncoding stdout latin1 S.putStr -- printing output . Json.encode -- producing JSON . tar2json -- main translation . Tar.read -- reading the archive =<< L.getContents -- reading the input