@@ -1,10 +1,28 @@
1−module Data.Aeson.Inflections where
1+module Data.Aeson.Inflections
2+ ( defaultFieldLabelModifier
3+ , defaultFieldLabelModifier'
3import Control.Lens
16import Control.Lens
4import Control.Monad
17import Control.Monad
5import Data.Char
20import Data.Char
6−import Data.Text as T (Text, pack, unpack)
21+import Data.Maybe
22+import Data.Text (Text)
23+import qualified Data.Text as T
7import Data.Void
24import Data.Void
25+import Language.Haskell.TH
8import qualified Text.Inflections as I
26import qualified Text.Inflections as I
9import Text.Megaparsec.Error
27import Text.Megaparsec.Error
@@ -17,10 +35,24 @@ defaultFieldLabelModifier = toUnderscore . dropPrefix
17defaultFieldLabelModifier' :: Text -> Text
35defaultFieldLabelModifier' :: Text -> Text
18defaultFieldLabelModifier' = T.pack . defaultFieldLabelModifier . T.unpack
36defaultFieldLabelModifier' = T.pack . defaultFieldLabelModifier . T.unpack
38+deriveDefaultJSON :: Name -> Q [Dec]
39+deriveDefaultJSON = deriveJSON defaultOptions
40+ { fieldLabelModifier = defaultFieldLabelModifier }
42+deriveEnumJSON :: String -> Name -> Q [Dec]
43+deriveEnumJSON prefix = deriveJSON defaultOptions
44+ { constructorTagModifier = toUnderscore . cutPrefix prefix }
20-- | Just drops prefix
46-- | Just drops prefix
21dropPrefix :: String -> String
47dropPrefix :: String -> String
22dropPrefix = dropWhile (not . isUpper)
48dropPrefix = dropWhile (not . isUpper)
50+-- | The same as @Prelude.drop@, but takes a string, instead of a length.
51+-- This makes code more explicit (easier to see what exactly we are expecting to
53+dropByPrefixLength :: Text -> (String -> String)
54+dropByPrefixLength t = drop (T.length t)
24-- | Cuts the prefix or throws error if prefix does not match. For TH
56-- | Cuts the prefix or throws error if prefix does not match. For TH
25-- modifiers only
57-- modifiers only
26cutPrefix :: String -> String -> String
58cutPrefix :: String -> String -> String
@@ -30,6 +62,10 @@ cutPrefix pref s = if pref == take plen s
31 plen = length pref
63 plen = length pref
65+-- | Drop prefix if exists
66+cutOptionalPrefix :: Text -> Text -> Text
67+cutOptionalPrefix prefix txt = fromMaybe txt $ T.stripPrefix prefix txt
33-- | Drops prefix and turns first character to lowercase
69-- | Drops prefix and turns first character to lowercase
34dropPrefixLower :: String -> String
70dropPrefixLower :: String -> String
35dropPrefixLower = over _head toLower . dropPrefix
71dropPrefixLower = over _head toLower . dropPrefix