Skip to content

Commit 83264fb

Browse files
committed
Fix toml generic codec stripTypeNamePrefix
1 parent bf86b00 commit 83264fb

File tree

1 file changed

+27
-2
lines changed

1 file changed

+27
-2
lines changed

pub/functora/src/cfg/Functora/CfgOrphan.hs

Lines changed: 27 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,9 @@ import Data.Aeson
1313
import qualified Data.Aeson as A
1414
import qualified Data.Binary as Binary
1515
import Data.Binary.Instances ()
16-
import Functora.Prelude
16+
import Data.Char (isLower, toLower)
17+
import Data.Typeable (typeRep)
18+
import Functora.Prelude hiding (toLower)
1719
import qualified GHC.Generics as Generics
1820
import qualified Text.URI as URI
1921
import Toml (HasCodec, HasItemCodec)
@@ -32,11 +34,34 @@ genericTomlCodec =
3234
Toml.genericCodecWithOptions
3335
Toml.TomlOptions
3436
{ Toml.tomlOptionsFieldModifier = \proxy ->
35-
Toml.stripTypeNamePrefix proxy . \case
37+
stripTypeNamePrefix proxy . \case
3638
('_' : xs) -> xs
3739
xs -> xs
3840
}
3941

42+
stripTypeNamePrefix :: forall a. (Typeable a) => Proxy a -> String -> String
43+
stripTypeNamePrefix _ fieldName =
44+
case stripPrefix (headToLower $ typeName @a) fieldName of
45+
Just rest -> leaveIfEmpty rest
46+
Nothing -> leaveIfEmpty (dropWhile isLower fieldName)
47+
where
48+
headToLower :: String -> String
49+
headToLower = \case
50+
[] -> error "Cannot use 'headToLower' on empty Text"
51+
x : xs -> toLower x : xs
52+
-- if all lower case then leave field as it is
53+
leaveIfEmpty :: String -> String
54+
leaveIfEmpty rest = if null rest then fieldName else headToLower rest
55+
56+
typeName :: forall a. (Typeable a) => String
57+
typeName =
58+
fromMaybe mempty
59+
. safeHead
60+
. words
61+
. show
62+
. typeRep
63+
$ Proxy @a
64+
4065
instance A.ToJSON URI where
4166
toJSON =
4267
A.toJSON . URI.render

0 commit comments

Comments
 (0)