@@ -1,10 +1,13 @@
11module Data.Aeson.Inflections
22 ( defaultFieldLabelModifier
33 , defaultFieldLabelModifier'
4+ , deriveDefaultJSON
5+ , deriveEnumJSON
46 , dropPrefix
57 , dropPrefixLower
68 , dropByPrefixLength
79 , cutPrefix
10+ , cutOptionalPrefix
811 , toUnderscore
912 , toDashed
1013 , toSpaced
@@ -12,10 +15,14 @@ module Data.Aeson.Inflections
1215
1316import Control.Lens
1417import Control.Monad
18+import Data.Aeson
19+import Data.Aeson.TH
1520import Data.Char
21+import Data.Maybe
1622import Data.Text (Text)
17−import qualified Data.Text as T (length, pack, unpack)
23+import qualified Data.Text as T
1824import Data.Void
25+import Language.Haskell.TH
1926import qualified Text.Inflections as I
2027import Text.Megaparsec.Error
2128
@@ -28,6 +35,14 @@ defaultFieldLabelModifier = toUnderscore . dropPrefix
2835defaultFieldLabelModifier' :: Text -> Text
2936defaultFieldLabelModifier' = T.pack . defaultFieldLabelModifier . T.unpack
3037
38+deriveDefaultJSON :: Name -> Q [Dec]
39+deriveDefaultJSON = deriveJSON defaultOptions
40+ { fieldLabelModifier = defaultFieldLabelModifier }
41+
42+deriveEnumJSON :: String -> Name -> Q [Dec]
43+deriveEnumJSON prefix = deriveJSON defaultOptions
44+ { constructorTagModifier = toUnderscore . cutPrefix prefix }
45+
3146-- | Just drops prefix
3247dropPrefix :: String -> String
3348dropPrefix = dropWhile (not . isUpper)
@@ -47,6 +62,10 @@ cutPrefix pref s = if pref == take plen s
4762 where
4863 plen = length pref
4964
65+-- | Drop prefix if exists
66+cutOptionalPrefix :: Text -> Text -> Text
67+cutOptionalPrefix prefix txt = fromMaybe txt $ T.stripPrefix prefix txt
68+
5069-- | Drops prefix and turns first character to lowercase
5170dropPrefixLower :: String -> String
5271dropPrefixLower = over _head toLower . dropPrefix