rest-stringmap-0.1.0.0: src/Rest/StringMap/Util.hs
module Rest.StringMap.Util
( pickleStringMap
, pickleMap
, mapSchema
, mapToJSON
, mapParseJSON
) where
import Data.Aeson.Types
import Data.JSON.Schema (JSONSchema, Schema, schema)
import Data.JSON.Schema.Combinators (field)
import Data.Proxy (Proxy)
import Data.String (IsString (..))
import Data.String.ToString (ToString (..))
import Text.XML.HXT.Arrow.Pickle (PU, XmlPickler, xpElem, xpList, xpPair, xpTextAttr, xpWrap, xpickle)
pickleStringMap :: XmlPickler b => ([(String, b)] -> m) -> (m -> [(String, b)]) -> PU m
pickleStringMap fromList toList =
xpElem "map"
$ xpWrap (fromList, toList)
$ xpList (xpElem "value" (xpPair (xpTextAttr "key") xpickle))
pickleMap :: (XmlPickler m, ToString k, IsString k) => ((String -> k) -> m -> m') -> ((k -> String) -> m' -> m) -> PU m'
pickleMap mapKeys mapKeys' = xpWrap (mapKeys fromString, mapKeys' toString) xpickle
mapSchema :: JSONSchema a => Proxy a -> Schema
mapSchema = field "key" False . schema
mapToJSON :: (ToString a, ToJSON m) => ((a -> String) -> m' -> m) -> m' -> Value
mapToJSON mapKeys = toJSON . mapKeys toString
mapParseJSON :: (FromJSON m, IsString k) => ((String -> k) -> m -> m') -> Value -> Parser m'
mapParseJSON mapKeys = fmap (mapKeys fromString) . parseJSON