packages feed

hw-json-1.3.2.0: app/App/Commands/CountAeson.hs

{-# LANGUAGE DataKinds           #-}
{-# LANGUAGE OverloadedStrings   #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE TypeApplications    #-}

module App.Commands.CountAeson
  ( cmdCountAeson
  ) where

import Control.Lens
import Data.Generics.Product.Any
import Options.Applicative       hiding (columns)

import qualified App.Commands.Types   as Z
import qualified Data.Aeson           as J
import qualified Data.ByteString.Lazy as LBS
import qualified Data.HashMap.Strict  as SHM
import qualified System.IO            as IO

runCountAeson :: Z.CountAesonOptions -> IO ()
runCountAeson opts = do
  let inputFile   = opts ^. the @"inputFile"
  let expression  = opts ^. the @"expression"

  lbs <- LBS.readFile inputFile

  let lbsLines = LBS.split 10 lbs

  let count :: Int = sum $ flip fmap lbsLines $ \lbsLine -> case J.decode lbsLine of
        Just (J.Object v) -> if SHM.member expression v then 1 else 0
        _                 -> 0

  IO.putStrLn $ "Count: " <> show count

  return ()

optsCountAeson :: Parser Z.CountAesonOptions
optsCountAeson = Z.CountAesonOptions
  <$> strOption
        (   long "input"
        <>  short 'i'
        <>  help "Input JSON file"
        <>  metavar "FILE"
        )
  <*> strOption
        (   long "expression"
        <>  help "JSON expression"
        <>  metavar "EXPRESSION"
        )

cmdCountAeson :: Mod CommandFields (IO ())
cmdCountAeson = command "count-aeson"  $ flip info idm $ runCountAeson <$> optsCountAeson