vflow-types-0.1: src/VFlow/Types/IpFix.hs
{-# LANGUAGE BangPatterns #-}
{-# LANGUAGE DeriveGeneric #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE RecordWildCards #-}
{-# LANGUAGE TypeOperators #-}
module VFlow.Types.IpFix
( IpFix(..)
, DataSetsEltElt(..)
, Header(..)
, HexInt(..)
)
where
import Control.Monad (mzero)
import Data.Aeson(Value(..), FromJSON(..), ToJSON(..), pairs, (.:), (.=), object)
import Data.Aeson.AutoType.Alternative
import Data.Int (Int64)
import Data.Monoid((<>))
import Net.IPv4 (IPv4)
import Text.Read (readMaybe)
import qualified Data.Scientific as Sci
import qualified Data.Text
import qualified GHC.Generics
newtype HexInt = HexInt Int64
deriving (Eq, Show)
instance FromJSON HexInt where
parseJSON (String s) = case readMaybe (Data.Text.unpack s) of
Nothing -> mzero
Just x -> pure (HexInt x)
parseJSON (Number s) = if Sci.isInteger s
then case Sci.toBoundedInteger s of
Nothing -> mzero
Just x -> pure (HexInt x)
else mzero
parseJSON _ = mzero
instance ToJSON HexInt where
toJSON (HexInt x) = toJSON x
toEncoding (HexInt x) = toEncoding x
data DataSetsEltElt = DataSetsEltElt {
dataSetsEltEltV :: !(IPv4 :|: HexInt),
dataSetsEltEltI :: !Int
} deriving (Show,Eq,GHC.Generics.Generic)
instance FromJSON DataSetsEltElt where
parseJSON (Object v) = DataSetsEltElt <$> v .: "V" <*> v .: "I"
parseJSON _ = mzero
instance ToJSON DataSetsEltElt where
toJSON (DataSetsEltElt {..}) = object ["V" .= dataSetsEltEltV, "I" .= dataSetsEltEltI]
toEncoding (DataSetsEltElt {..}) = pairs ("V" .= dataSetsEltEltV<>"I" .= dataSetsEltEltI)
data Header = Header {
headerLength :: !Int,
headerSequenceNo :: !Int,
headerExportTime :: !Int,
headerVersion :: !Int,
headerDomainID :: !Int
} deriving (Show,Eq,GHC.Generics.Generic)
instance FromJSON Header where
parseJSON (Object v) = Header <$> v .: "Length" <*> v .: "SequenceNo" <*> v .: "ExportTime" <*> v .: "Version" <*> v .: "DomainID"
parseJSON _ = mzero
instance ToJSON Header where
toJSON (Header {..}) = object ["Length" .= headerLength, "SequenceNo" .= headerSequenceNo, "ExportTime" .= headerExportTime, "Version" .= headerVersion, "DomainID" .= headerDomainID]
toEncoding (Header {..}) = pairs ("Length" .= headerLength<>"SequenceNo" .= headerSequenceNo<>"ExportTime" .= headerExportTime<>"Version" .= headerVersion<>"DomainID" .= headerDomainID)
data IpFix = IpFix {
ipFixAgentID :: !IPv4,
ipFixHeader :: !Header,
ipFixDataSets :: [[DataSetsEltElt]]
} deriving (Show,Eq,GHC.Generics.Generic)
instance FromJSON IpFix where
parseJSON (Object v) = IpFix <$> v .: "AgentID" <*> v .: "Header" <*> v .: "DataSets"
parseJSON _ = mzero
instance ToJSON IpFix where
toJSON (IpFix {..}) = object ["AgentID" .= ipFixAgentID, "Header" .= ipFixHeader, "DataSets" .= ipFixDataSets]
toEncoding (IpFix {..}) = pairs ("AgentID" .= ipFixAgentID<>"Header" .= ipFixHeader<>"DataSets" .= ipFixDataSets)