git.iko.soy/typeable/aeson-inflections
on master help sign in
Refactor deriving lenses and JSON to improve compilation speeds (#5004)

* Move b2b api to deriving-aeson * Concat TH splices * Use TH JSON * Refactor json derivation * Create helper functions for joining splices

commite53713aa72b0ac8a7cb4f250a4b6f2999c969d1e authormniip <mniip@users.noreply.github.com> dateMon 14 Sep 2020, 12:35 (6 years ago) parent2e9190b
3 files changed+63
aeson-inflections.cabal+4 src/Data/Aeson/Inflections.hs+13 src/Data/Aeson/Inflections/Generic.hs+46
aeson-inflections.cabal+4
@@ -12,10 +12,14 @@ library
1212 hs-source-dirs: src
1313 ghc-options: -Wall
1414 exposed-modules: Data.Aeson.Inflections
15+ , Data.Aeson.Inflections.Generic
1516 build-depends: base >= 4.7 && < 5
1617 , aeson
18+ , deriving-aeson
1719 , inflections
1820 , lens
1921 , megaparsec
22+ , template-haskell
2023 , text
24+ default-extensions: DataKinds
2125 default-language: Haskell2010
src/Data/Aeson/Inflections.hs+13
@@ -1,6 +1,8 @@
11module Data.Aeson.Inflections
22 ( defaultFieldLabelModifier
33 , defaultFieldLabelModifier'
4+ , deriveDefaultJSON
5+ , deriveEnumJSON
46 , dropPrefix
57 , dropPrefixLower
68 , dropByPrefixLength
@@ -12,10 +14,13 @@ module Data.Aeson.Inflections
1214
1315import Control.Lens
1416import Control.Monad
17+import Data.Aeson
18+import Data.Aeson.TH
1519import Data.Char
1620import Data.Text (Text)
1721import qualified Data.Text as T (length, pack, unpack)
1822import Data.Void
23+import Language.Haskell.TH
1924import qualified Text.Inflections as I
2025import Text.Megaparsec.Error
2126
@@ -28,6 +33,14 @@ defaultFieldLabelModifier = toUnderscore . dropPrefix
2833defaultFieldLabelModifier' :: Text -> Text
2934defaultFieldLabelModifier' = T.pack . defaultFieldLabelModifier . T.unpack
3035
36+deriveDefaultJSON :: Name -> Q [Dec]
37+deriveDefaultJSON = deriveJSON defaultOptions
38+ { fieldLabelModifier = defaultFieldLabelModifier }
39+
40+deriveEnumJSON :: String -> Name -> Q [Dec]
41+deriveEnumJSON prefix = deriveJSON defaultOptions
42+ { constructorTagModifier = toUnderscore . cutPrefix prefix }
43+
3144-- | Just drops prefix
3245dropPrefix :: String -> String
3346dropPrefix = dropWhile (not . isUpper)
src/Data/Aeson/Inflections/Generic.hsnew file+46
@@ -0,0 +1,46 @@
1+{-# LANGUAGE KindSignatures #-}
2+
3+module Data.Aeson.Inflections.Generic
4+ -- Reexports from Deriving.Aeson
5+ ( CustomJSON(..)
6+ , FieldLabelModifier
7+ , ConstructorTagModifier
8+ , CamelToSnake
9+ , StripPrefix
10+ , OmitNothingFields
11+
12+ , DropPrefix
13+ , DropPrefixLower
14+ , ToLower
15+ , DefaultFieldLabelModifier
16+ , DefaultJSON
17+ , DefaultEnumJSON
18+ )
19+ where
20+
21+import Data.Aeson.Inflections
22+import Data.Char
23+import Deriving.Aeson
24+import GHC.TypeLits
25+
26+data DropPrefix
27+
28+instance StringModifier DropPrefix where
29+ getStringModifier = dropPrefix
30+
31+data DropPrefixLower
32+
33+instance StringModifier DropPrefixLower where
34+ getStringModifier = dropPrefixLower
35+
36+data ToLower
37+
38+instance StringModifier ToLower where
39+ getStringModifier = map toLower
40+
41+type DefaultFieldLabelModifier = (DropPrefix, CamelToSnake)
42+
43+type DefaultJSON = CustomJSON '[FieldLabelModifier DefaultFieldLabelModifier]
44+
45+type DefaultEnumJSON (prefix :: Symbol)
46+ = CustomJSON '[ConstructorTagModifier (StripPrefix prefix, CamelToSnake)]