deriving-aeson 0.2.6.1 → 0.2.7
raw patch · 6 files changed
+28/−6 lines, 6 filesdep ~aesondep ~basePVP: major bump suggested
API removals or changes: PVP suggests a major version bump
Dependency ranges changed: aeson, base
API changes (from Hackage documentation)
+ Deriving.Aeson: data Rename (from :: Symbol) (to :: Symbol)
+ Deriving.Aeson: instance (GHC.TypeLits.KnownSymbol from, GHC.TypeLits.KnownSymbol to) => Deriving.Aeson.StringModifier (Deriving.Aeson.Rename from to)
+ Deriving.Aeson: instance Deriving.Aeson.StringModifier '[]
+ Deriving.Aeson: instance forall a1 (a2 :: a1) (as :: [a1]). (Deriving.Aeson.StringModifier a2, Deriving.Aeson.StringModifier as) => Deriving.Aeson.StringModifier (a2 : as)
- Deriving.Aeson.Stock: type PrefixedSnake str = CustomJSON '[FieldLabelModifier (StripPrefix str, CamelToSnake)]
+ Deriving.Aeson.Stock: type PrefixedSnake str = CustomJSON '[FieldLabelModifier '[StripPrefix str, CamelToSnake]]
Files
- CHANGELOG.md +5/−0
- README.md +2/−2
- deriving-aeson.cabal +1/−1
- src/Deriving/Aeson.hs +14/−0
- src/Deriving/Aeson/Stock.hs +1/−1
- tests/test.hs +5/−2
CHANGELOG.md view
@@ -1,5 +1,10 @@ # Revision history for deriving-aeson +## 0.2.7++* Added a `StringModifier` instance to a list of types+* Added `Rename :: Symbol -> Symbol -> Type`+ ## 0.2.6 * Added `StringModifier` instances to 3 and 4-tuples
README.md view
@@ -23,7 +23,7 @@ , userAPIToken :: Maybe String } deriving Generic deriving (FromJSON, ToJSON)- via CustomJSON '[OmitNothingFields, FieldLabelModifier (StripPrefix "user", CamelToSnake)] User+ via CustomJSON '[OmitNothingFields, FieldLabelModifier '[StripPrefix "user", CamelToSnake]] User testData :: [User] testData = [User 42 "Alice" Nothing, User 43 "Bob" (Just "xyz")]@@ -36,7 +36,7 @@ * `Prefixed str` = `CustomJSON '[FieldLabelModifier (StripPrefix str)]` * `PrefixedSnake str` = `CustomJSON '[FieldLabelModifier (StripPrefix str, CamelToSnake)]`-* `Snake` = `CustomJSON '[FieldLabelModifier (StripPrefix str, CamelToSnake)]`+* `Snake` = `CustomJSON '[FieldLabelModifier '[StripPrefix str, CamelToSnake]]` * `Vanilla` = `CustomJSON '[]` How it works
deriving-aeson.cabal view
@@ -1,6 +1,6 @@ cabal-version: 2.4 name: deriving-aeson-version: 0.2.6.1+version: 0.2.7 synopsis: Type driven generic aeson instance customisation description: This package provides a newtype wrapper with FromJSON/ToJSON instances customisable via a phantom type parameter.
src/Deriving/Aeson.hs view
@@ -30,6 +30,7 @@ , CamelTo , CamelToKebab , CamelToSnake+ , Rename -- * Interface , AesonOptions(..) , StringModifier(..)@@ -95,6 +96,9 @@ -- | CamelCase to kebab-case type CamelToKebab = CamelTo "-" +-- | Rename fields called @from@ to @to@.+data Rename (from :: Symbol) (to :: Symbol)+ -- | Reify a function which modifies names class StringModifier t where getStringModifier :: String -> String@@ -102,6 +106,13 @@ instance KnownSymbol k => StringModifier (StripPrefix k) where getStringModifier = fromMaybe <*> stripPrefix (symbolVal (Proxy @k)) +instance StringModifier '[] where+ getStringModifier = id++-- | Left-to-right (@'foldr' ('flip' ('.')) 'id'@) composition+instance (StringModifier a, StringModifier as) => StringModifier (a ': as) where+ getStringModifier = getStringModifier @as . getStringModifier @a+ -- | Left-to-right (@'flip' '.'@) composition instance (StringModifier a, StringModifier b) => StringModifier (a, b) where getStringModifier = getStringModifier @b . getStringModifier @a@@ -118,6 +129,9 @@ getStringModifier = camelTo2 char where (char : _) = symbolVal (Proxy @separator)++instance (KnownSymbol from, KnownSymbol to) => StringModifier (Rename from to) where+ getStringModifier s = if s == symbolVal (Proxy @from) then symbolVal (Proxy @to) else s type family NonEmptyString (xs :: Symbol) :: Constraint where NonEmptyString "" = TypeError ('Text "Empty string separator provided for camelTo separator")
src/Deriving/Aeson/Stock.hs view
@@ -18,7 +18,7 @@ type Prefixed str = CustomJSON '[FieldLabelModifier (StripPrefix str)] -- | Strip @str@ prefices and convert from CamelCase to snake_case-type PrefixedSnake str = CustomJSON '[FieldLabelModifier (StripPrefix str, CamelToSnake)]+type PrefixedSnake str = CustomJSON '[FieldLabelModifier '[StripPrefix str, CamelToSnake]] -- | Convert from CamelCase to snake_case type Snake = CustomJSON '[FieldLabelModifier CamelToSnake]
tests/test.hs view
@@ -12,9 +12,12 @@ { userId :: Int , userName :: String , userAPIToken :: Maybe String+ , userType :: String } deriving Generic deriving (FromJSON, ToJSON)- via CustomJSON '[OmitNothingFields, FieldLabelModifier (StripPrefix "user", CamelToSnake)] User+ via CustomJSON '[ OmitNothingFields+ , FieldLabelModifier '[StripPrefix "user", CamelToSnake, Rename "type" "user_type"]+ ] User data Foo = Foo { fooFoo :: Int, fooBar :: Int } deriving Generic@@ -22,7 +25,7 @@ via Prefixed "foo" Foo testData :: [User]-testData = [User 42 "Alice" Nothing, User 43 "Bob" (Just "xyz")]+testData = [User 42 "Alice" Nothing "human", User 43 "Bob" (Just "xyz") "bot"] main = do BL.putStrLn $ encode testData