packages feed

sbp-2.6.3: main/SBP2PRETTYJSON.hs

{-# LANGUAGE DeriveDataTypeable #-}
{-# OPTIONS_GHC -fno-cse #-}
{-# LANGUAGE NoImplicitPrelude #-}
{-# LANGUAGE OverloadedStrings #-}

-- |
-- Module:      SBP2PRETTYJSON
-- Copyright:   Copyright (C) 2019 Swift Navigation, Inc.
-- License:     LGPL-3
-- Maintainer:  Pasi Miettinen <dev@swiftnav.com>
-- Stability:   experimental
-- Portability: portable
--
-- SBP to JSON tool - reads SBP binary from stdin and sends SBP JSON
-- to stdout.

import BasicPrelude                      hiding (map, print)
import Control.Monad.Trans.Resource
import Data.Aeson.Encode.Pretty
import Data.ByteString.Lazy              hiding (ByteString, map)
import Data.Conduit
import Data.Conduit.Binary
import Data.Conduit.List
import Data.Conduit.Serialization.Binary
import SwiftNav.SBP
import System.Console.CmdArgs
import System.IO

data Cfg = Cfg { skiporder :: Bool
               , spaces :: Int
               , skipfilter :: Bool }
           deriving (Show, Data, Typeable)

defaultCfg :: Cfg
defaultCfg = Cfg { skiporder = False
                 , spaces = 0
                 , skipfilter = False }

-- | Encode a SBPMsg to a line of JSON.
encodeLine :: Cfg -> SBPMsg -> ByteString
encodeLine c (SBPMsgBadCrc _v)  | not (skipfilter c) = mempty
encodeLine c (SBPMsgUnknown _v) | not (skipfilter c) = mempty
encodeLine c v = toStrict $ encodePretty' (defConfig
  { confIndent = Spaces (spaces c)
  , confCompare = if (skiporder c) then mempty else compare
  }) v <> "\n"

main :: IO ()
main = do
  cfg <- cmdArgs defaultCfg
  runResourceT $
    sourceHandle stdin
      =$= conduitDecode
      =$= map (encodeLine cfg)
      $$  sinkHandle stdout