@@ -25,6 +25,7 @@ import Control.Monad
25import Data.Aeson.TH as A
25import Data.Aeson.TH as A
26import Data.Aeson.Types
26import Data.Aeson.Types
27import Data.List
27import Data.List
28import Data.Maybe
29import Data.Maybe
29import Data.Typeable
30import Data.Typeable
30import Language.Haskell.TH
31import Language.Haskell.TH
@@ -67,6 +68,8 @@ data DerivingOptions = DerivingOptions
67 , snake :: Bool
68 , snake :: Bool
68 -- ^ Whether to snake constructors and field labels
69 -- ^ Whether to snake constructors and field labels
69 -- Applied after stripping prefix
70 -- Applied after stripping prefix
71+ , convertMap :: M.Map String String
72+ -- ^ convert names (constructors and fields) before snake and strip prefix
70 , unwrapUnaryRecords :: Bool
73 , unwrapUnaryRecords :: Bool
71 , omitNothingFields :: Bool
74 , omitNothingFields :: Bool
72 , sumEncoding :: SumEncoding
75 , sumEncoding :: SumEncoding
@@ -78,18 +81,20 @@ defaultDerivingOptions :: DerivingOptions
78defaultDerivingOptions = DerivingOptions
81defaultDerivingOptions = DerivingOptions
79 { prefix = Nothing
82 { prefix = Nothing
80 , snake = True
83 , snake = True
84+ , convertMap = mempty
81 , unwrapUnaryRecords = False
85 , unwrapUnaryRecords = False
82 , omitNothingFields = False
86 , omitNothingFields = False
83 , sumEncoding = defaultTaggedObject }
87 , sumEncoding = defaultTaggedObject }
85derivingOptionsToJsonOptions :: DerivingOptions -> Options
89derivingOptionsToJsonOptions :: DerivingOptions -> Options
86derivingOptionsToJsonOptions DerivingOptions{..} = defaultOptions
90derivingOptionsToJsonOptions DerivingOptions{..} = defaultOptions
87− { fieldLabelModifier = snaked . stripped
91+ { fieldLabelModifier = snaked . stripped . convert
88− , constructorTagModifier = snaked . stripped
92+ , constructorTagModifier = snaked . stripped . convert
89 , sumEncoding
93 , sumEncoding
90 , omitNothingFields
94 , omitNothingFields
91 , unwrapUnaryRecords }
95 , unwrapUnaryRecords }
97+ convert s = fromMaybe s $ M.lookup s convertMap
93 snaked = if snake then camelTo2 '_' else id
98 snaked = if snake then camelTo2 '_' else id
94 stripped = maybe id stripPrefix' prefix
99 stripped = maybe id stripPrefix' prefix