{-# LANGUAGE NoImplicitPrelude #-}
{-# LANGUAGE TemplateHaskell #-}
module SwiftNav.SBP.TH
( makeSBP
, makeJSON
) where
import BasicPrelude
import Control.Lens
import Data.Aeson.TH
import Data.Binary
import qualified Data.ByteString as BS
import qualified Data.ByteString.Lazy as LBS
import Language.Haskell.TH
import SwiftNav.SBP.Types
makeSBP :: Name -> Name -> Q [Dec]
makeSBP :: Name -> Name -> Q [Dec]
makeSBP Name
msgType Name
name =
[d|instance ToSBP $(conT name) where
toSBP m senderID = encoded & msgSBPCrc .~ checkCrc encoded
where
payload = LBS.toStrict $ encode m
len = fromIntegral $ BS.length payload
encoded = Msg $(varE msgType) senderID len (Bytes payload) 0
|]
makeJSON :: String -> Name -> Q [Dec]
makeJSON :: String -> Name -> Q [Dec]
makeJSON String
prefix = Options -> Name -> Q [Dec]
deriveJSON Options
defaultOptions
{ fieldLabelModifier :: String -> String
fieldLabelModifier = forall (m :: * -> *) a b. Monad m => m (a -> b) -> m a -> m b
ap forall a. a -> Maybe a -> a
fromMaybe forall a b. (a -> b) -> a -> b
$ forall a. Eq a => [a] -> [a] -> Maybe [a]
stripPrefix String
prefix
}