module Rest.StringMap.Util ( pickleStringMap , pickleMap , mapSchema ) where 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