git.iko.soy/typeable/derive-api-th
on master help sign in
add convertMap
commit10446b5746680bc61ccdffb22639bb73c0548f1c authorodr <dima.typeable.io> dateWed 11 Sep 2024, 13:24 (2 years ago) parenta218010
2 files changed+8−2
derive-api-th.cabal+1 src/Derive/API/TH.hs+7−2
derive-api-th.cabal+1
@@ -28,6 +28,7 @@ library
2828 build-depends:
2929 base >=4.7 && <5
3030 , aeson
31+ , containers
3132 , template-haskell
3233 , th-abstraction
3334 , generic-arbitrary
src/Derive/API/TH.hs+7−2
@@ -25,6 +25,7 @@ import Control.Monad
2525import Data.Aeson.TH as A
2626import Data.Aeson.Types
2727import Data.List
28+import Data.Map as M
2829import Data.Maybe
2930import Data.Typeable
3031import Language.Haskell.TH
@@ -67,6 +68,8 @@ data DerivingOptions = DerivingOptions
6768 , snake :: Bool
6869 -- ^ Whether to snake constructors and field labels
6970 -- Applied after stripping prefix
71+ , convertMap :: M.Map String String
72+ -- ^ convert names (constructors and fields) before snake and strip prefix
7073 , unwrapUnaryRecords :: Bool
7174 , omitNothingFields :: Bool
7275 , sumEncoding :: SumEncoding
@@ -78,18 +81,20 @@ defaultDerivingOptions :: DerivingOptions
7881defaultDerivingOptions = DerivingOptions
7982 { prefix = Nothing
8083 , snake = True
84+ , convertMap = mempty
8185 , unwrapUnaryRecords = False
8286 , omitNothingFields = False
8387 , sumEncoding = defaultTaggedObject }
8488
8589derivingOptionsToJsonOptions :: DerivingOptions -> Options
8690derivingOptionsToJsonOptions DerivingOptions{..} = defaultOptions
87− { fieldLabelModifier = snaked . stripped
88− , constructorTagModifier = snaked . stripped
91+ { fieldLabelModifier = snaked . stripped . convert
92+ , constructorTagModifier = snaked . stripped . convert
8993 , sumEncoding
9094 , omitNothingFields
9195 , unwrapUnaryRecords }
9296 where
97+ convert s = fromMaybe s $ M.lookup s convertMap
9398 snaked = if snake then camelTo2 '_' else id
9499 stripped = maybe id stripPrefix' prefix
95100