RJson 0.3.1 → 0.3.2
raw patch · 2 files changed
+39/−11 lines, 2 filesPVP: major bump suggested
API removals or changes: PVP suggests a major version bump
API changes (from Hackage documentation)
+ Text.RJson: firstCharToLower :: String -> String
+ Text.RJson: firstCharToUpper :: String -> String
- Text.RJson: enumFromJson :: (Data FromJsonD a, Data TranslateFieldD a) => a -> JsonData -> Either String a
+ Text.RJson: enumFromJson :: (Data FromJsonD a, Data TranslateFieldD a) => (String -> String) -> a -> JsonData -> Either String a
- Text.RJson: enumToJson :: (Data ToJsonD a, ToJson a, TranslateField a) => a -> JsonData
+ Text.RJson: enumToJson :: (Data ToJsonD a, ToJson a, TranslateField a) => (String -> String) -> a -> JsonData
Files
- RJson.cabal +1/−1
- Text/RJson.hs +38/−10
RJson.cabal view
@@ -1,5 +1,5 @@ Name: RJson-Version: 0.3.1+Version: 0.3.2 Cabal-Version: >= 1.2 License: BSD3 License-File: LICENSE
Text/RJson.hs view
@@ -31,6 +31,8 @@ enumFromJson, stripInitialUnderscores, toJsonString,+ firstCharToUpper,+ firstCharToLower, Union(..), Union3, Union4, Union5, Union6, Union7,Union8,Union9,Union10) where@@ -288,10 +290,11 @@ error ("Unable to serialize the primitive type '" ++ typename x ++ "'") -- | This function can be used as an implementation of 'toJson' for simple enums.--- It just converts an enum value to a string determined by the name of the constructor.-enumToJson :: (Data ToJsonD a, ToJson a, TranslateField a) => a -> JsonData-enumToJson x- | isAlgType (dataTypeOf toJsonProxy x) = JDString (show (toConstr toJsonProxy x))+-- It just converts an enum value to a string determined by the name of the constructor,+-- after being fed through the (String -> String) function given as the first argument.+enumToJson :: (Data ToJsonD a, ToJson a, TranslateField a) => (String -> String) -> a -> JsonData+enumToJson transform x+ | isAlgType (dataTypeOf toJsonProxy x) = JDString (transform (showConstr (toConstr toJsonProxy x))) | True = error "Passed non-algebraic type to enumToJson" instance (Data ToJsonD t, TranslateField t) => ToJson t where@@ -522,13 +525,20 @@ _ -> Left "Bad fromJson conversion: Non-algebraic datatype given to 'genericFromJson'" genericFromJson _ _ = Left "Bad fromJson conversion: Expecting JSON object or array" +constrNames :: (Data FromJsonD a, Data TranslateFieldD a) => a -> [String]+constrNames x = map showConstr (dataTypeConstrs (dataTypeOf fromJsonProxy x))+ -- | The counterpart of 'enumToJson'.-enumFromJson :: (Data FromJsonD a, Data TranslateFieldD a) => a -> JsonData -> Either String a-enumFromJson dummy (JDString s) =- case fromConstrM fromJsonProxy Nothing (mkConstr (dataTypeOf fromJsonProxy dummy) s [] Prefix ) of- Nothing -> Left "Error in enumFromJson"- Just x -> Right x-enumFromJson _ _ = Left "Non-string given to enumFromJson"+enumFromJson :: (Data FromJsonD a, Data TranslateFieldD a) => (String -> String) -> a -> JsonData -> Either String a+enumFromJson transform dummy (JDString s) =+ let cname = (transform s) in+ if elem cname (constrNames dummy)+ then+ case fromConstrM fromJsonProxy Nothing (mkConstr (dataTypeOf fromJsonProxy dummy) cname [] Prefix ) of+ Nothing -> Left "Error in enumFromJson"+ Just x -> Right x+ else Left "Constructor name not recognized in enumFromJson"+enumFromJson _ _ _ = Left "Non-string given to enumFromJson" instance (Data FromJsonD t, Data TranslateFieldD t) => FromJson t where fromJson = genericFromJson@@ -729,9 +739,27 @@ toJsonString :: ToJson a => a -> String toJsonString = show . toJson ++--+-- A couple of utility functions.+--+firstCharToUpper :: String -> String+firstCharToUpper "" = ""+firstCharToUpper (c:cs) = (toUpper c) : cs++firstCharToLower :: String -> String+firstCharToLower "" = ""+firstCharToLower (c:cs) = (toLower c) : cs+ {- data Test = Foo | Bar deriving Show $(derive[''Test])++instance ToJson Test where+ toJson = enumToJson firstCharToLower+instance FromJson Test where+ fromJson = enumFromJson firstCharToUpper+ data Test2 = Test2 Int Int deriving Show $(derive[''Test2]) data Test4 = Test4 { z :: String } deriving Show