packages feed

sbp-4.0.3: main/JSON2JSON.hs

{-# LANGUAGE NoImplicitPrelude #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE TemplateHaskell   #-}

-- |
-- Module:      JSON2JSON
-- Copyright:   Copyright (C) 2015-2021 Swift Navigation, Inc.
-- License:     MIT
-- Contact:     https://support.swiftnav.com
-- Stability:   experimental
-- Portability: portable
--
-- JSON to JSON tool - reads SBP JSON from stdin and sends SBP JSON to
-- stdout.

import BasicPrelude                 hiding (lines, map, mapMaybe)
import Control.Monad.Trans.Resource
import Data.Aeson
import Data.Aeson.TH
import Data.ByteString.Lazy         hiding (ByteString, drop, map)
import Data.Conduit
import Data.Conduit.Binary          hiding (drop)
import Data.Conduit.List            hiding (drop)
import Data.Time
import SwiftNav.SBP
import System.IO

data Data = Data
  { _data :: SBPMsg
  , _time :: UTCTime
  } deriving Show

deriveJSON defaultOptions { fieldLabelModifier = drop 1 } ''Data

-- | Encode a SBPMsg to a line of JSON.
encodeLine :: Data -> ByteString
encodeLine v = toStrict $ encode v <> "\n"

main :: IO ()
main =
  runResourceT $
    sourceHandle stdin
      =$= lines
      =$= mapMaybe decodeStrict
      =$= map encodeLine
      $$  sinkHandle stdout