sbp-1.2.2: main/JSON2SBP.hs
-- |
-- Module: JSON2SBP
-- Copyright: Copyright (C) 2015 Swift Navigation, Inc.
-- License: LGPL-3
-- Maintainer: Mark Fine <dev@swiftnav.com>
-- Stability: experimental
-- Portability: portable
--
-- JSON to SBP tool - reads SBP JSON from stdin and sends SBP JSON to
-- stdout.
import BasicPrelude hiding (lines)
import Control.Monad.Trans.Resource
import Data.Aeson
import Data.Conduit
import Data.Conduit.Binary
import qualified Data.Conduit.List as CL
import Data.Conduit.Serialization.Binary
import Debug.Trace
import SwiftNav.SBP
import System.IO
newtype SBPMsgData = SBPMsgData
{ sbpMsgData :: SBPMsg
} deriving ( Show, Read, Eq )
instance FromJSON SBPMsgData where
parseJSON (Object v) = SBPMsgData <$> v .: "data"
parseJSON _ = mzero
-- | Decode a SBPMsg from JSON.
decodeSBPMsg :: ByteString -> Maybe SBPMsg
decodeSBPMsg v = result
where parsed = eitherDecodeStrict v <|> sbpMsgData <$> eitherDecodeStrict v
result = case parsed of
Left s -> trace s Nothing
Right x -> Just x
main :: IO ()
main =
runResourceT $
sourceHandle stdin =$=
lines =$=
CL.mapMaybe decodeSBPMsg =$=
conduitEncode $$
sinkHandle stdout