{-# LANGUAGE OverloadedStrings #-} {-# OPTIONS_GHC -fno-warn-orphans #-} module GLM.JSON where import Data.Aeson import Data.String import Control.Lens import Control.Arrow import GLM.Parser import System.Environment import System.Exit import System.IO import qualified Data.ByteString.Lazy.Char8 as B instance ToJSON Entry where toJSON (Entry a b) = object [ ("path" , fromString (unwords a)) , ("selector" , toJSON a ) , ("nested" , toJSON nests) , ("properties", object $ over each (fromString *** fromString) props)] where props :: [(String, String)] props = b ^.. each . _Prop nests = b ^.. each . _Nested main :: IO () main = do a <- getArgs case a of [] -> getContents >>= go "STDIN" xs -> mapM_ doF xs doF :: FilePath -> IO () doF f = readFile f >>= go f go :: String -> String -> IO () go f c = case glmParser f c of Left err -> oops err Right res -> B.putStrLn $ encode $ res oops :: Show a => a -> IO b oops err = hPutStrLn stderr (show err) >> exitFailure