From b8874b28165f17456b988294829162abdb952315 Mon Sep 17 00:00:00 2001 From: Joseph Sumabat Date: Wed, 16 Oct 2024 13:36:04 -0400 Subject: [PATCH] Use field label modifier on deprecated --- src/Moat.hs | 18 +++++++++++++----- test/DeprecatedFieldSpec.hs | 11 +++++++---- 2 files changed, 20 insertions(+), 9 deletions(-) diff --git a/src/Moat.hs b/src/Moat.hs index d11db54..99f870b 100644 --- a/src/Moat.hs +++ b/src/Moat.hs @@ -100,6 +100,7 @@ import Control.Monad.Except #if MIN_VERSION_mtl(2,3,0) import Control.Monad.Trans #endif +import qualified Data.Bifunctor as Bifunctor import Data.Bool (bool) import qualified Data.Char as Char import Data.Foldable (foldl', foldlM, foldr') @@ -982,8 +983,8 @@ mkNewtype o@Options {..} typName doc instTys ts = \case } -> do fieldDocs <- lift $ mapM (getDocWith o) fieldNames fields <- zipFields o fieldNames constructorFields fieldDocs - deprecatedFieldExps <- lift [e|deprecatedFields|] - matchProxy =<< lift (structExp typName doc instTys dataInterfaces dataProtocols dataAnnotations fields deprecatedFieldExps ts makeBase) + deprecatedFieldExp <- lift $ mkDeprecatedField o deprecatedFields + matchProxy =<< lift (structExp typName doc instTys dataInterfaces dataProtocols dataAnnotations fields deprecatedFieldExp ts makeBase) ConstructorInfo { constructorFields = [field] } -> do @@ -1035,9 +1036,13 @@ mkProd o@Options {..} typName parentDoc instTys ts = \case } -> do fieldDocs <- lift $ mapM (getDocWith o) fieldNames fields <- zipFields o fieldNames constructorFields fieldDocs - deprecatedFieldExp <- lift [e|deprecatedFields|] + deprecatedFieldExp <- lift $ mkDeprecatedField o deprecatedFields matchProxy =<< lift (structExp typName parentDoc instTys dataInterfaces dataProtocols dataAnnotations fields deprecatedFieldExp ts makeBase) +mkDeprecatedField :: Options -> [(String, Maybe String)] -> Q Exp +mkDeprecatedField options deprecatedFields = + let modifiedFields = Bifunctor.first (modifyFieldName options) <$> deprecatedFields in [e|modifiedFields|] + -- | 'strictFields' are required to exist in the record and are always included. -- 'omitFields' will remove any remaining fields if they are 'Discard'ed. zipFields :: Options -> [Name] -> [Type] -> [Maybe String] -> MoatM [Exp] @@ -1123,12 +1128,15 @@ getFreeTyVar = \case SigT (VarT name) _kind -> Just name _ -> Nothing +modifyFieldName :: Options -> String -> String +modifyFieldName options = onHeadWith (lowerFirstField options) . fieldLabelModifier options + -- make a struct field pretty prettyField :: Options -> Name -> Type -> Maybe String -> Exp -prettyField Options {..} name ty doc = +prettyField options name ty doc = RecConE 'Field - [ ('fieldName, stringE (onHeadWith lowerFirstField (fieldLabelModifier (nameStr name)))) + [ ('fieldName, stringE (modifyFieldName options (nameStr name))) , ('fieldType, toMoatTypeEPoly ty) , ('fieldDoc, prettyDoc doc) ] diff --git a/test/DeprecatedFieldSpec.hs b/test/DeprecatedFieldSpec.hs index c5eb52d..7613ec9 100644 --- a/test/DeprecatedFieldSpec.hs +++ b/test/DeprecatedFieldSpec.hs @@ -1,20 +1,23 @@ module DeprecatedFieldSpec where import Common +import Data.List (stripPrefix) +import Data.Maybe import Moat import Test.Hspec import Test.Hspec.Golden data Data = Data - { field0 :: Int - , field1 :: Maybe Int + { testField0 :: Int + , testField1 :: Maybe Int } mobileGenWith ( defaultOptions - { fieldsRequiredByClients = ["field0", "field1"] + { fieldsRequiredByClients = ["testField0", "testField1"] , omitFields = const Discard - , deprecatedFields = [("field1", Just "Deprecated since build 500")] + , deprecatedFields = [("testField1", Just "Deprecated since build 500")] + , fieldLabelModifier = \s -> fromMaybe s (stripPrefix "test" s) } ) ''Data