module NetSpider.RPL.JSONUtil
( optSnake,
optCombinedNode,
optCombinedLink
) where
import Control.Applicative ((*>), (<*), (<|>))
import qualified Data.Aeson as Aeson
import Data.Char (isUpper, toLower)
import qualified Text.Regex.Applicative as RE
toSnake :: String -> String
toSnake = RE.replace $ RE.msym (\c -> if isUpper c then Just ['_', toLower c] else Nothing)
optSnake :: Aeson.Options
optSnake = Aeson.defaultOptions { Aeson.fieldLabelModifier = toSnake }
optCombinedNode :: Aeson.Options
optCombinedNode = Aeson.defaultOptions { Aeson.fieldLabelModifier = modifier }
where
modifier = map toLower . RE.replace (fmap (const "") $ RE.string "attrs")
optCombinedLink :: Aeson.Options
optCombinedLink =
Aeson.defaultOptions
{ Aeson.constructorTagModifier = tag_modifier,
Aeson.sumEncoding =
Aeson.TaggedObject
{ Aeson.tagFieldName = "link_type",
Aeson.contentsFieldName = "link"
}
}
where
tag_modifier = RE.replace regex
regex = fmap (map toLower) (RE.string "Combined" *> (RE.string "DIO" <|> RE.string "DAO") <* RE.string "Link")