aboutsummaryrefslogtreecommitdiff
path: root/tea-cleaner/TeaCleaner/Options.hs
diff options
context:
space:
mode:
Diffstat (limited to 'tea-cleaner/TeaCleaner/Options.hs')
-rw-r--r--tea-cleaner/TeaCleaner/Options.hs24
1 files changed, 24 insertions, 0 deletions
diff --git a/tea-cleaner/TeaCleaner/Options.hs b/tea-cleaner/TeaCleaner/Options.hs
new file mode 100644
index 0000000..7353f8f
--- /dev/null
+++ b/tea-cleaner/TeaCleaner/Options.hs
@@ -0,0 +1,24 @@
+module TeaCleaner.Options
+ ( jsonOptions
+ ) where
+
+import qualified Data.Aeson.TH as Aeson
+import Prelude hiding (id)
+import Data.Char
+
+applyFirst :: (Char -> Char) -> String -> String
+applyFirst _ [] = []
+applyFirst f [x] = [f x]
+applyFirst f (x:xs) = f x: xs
+
+-- | Generic casing for symbol separated names
+symbCase :: String -> String
+symbCase = u . applyFirst toLower
+ where u [] = []
+ u (x:xs) | isUpper x = '_' : toLower x : u xs
+ | otherwise = x : u xs
+
+jsonOptions :: Aeson.Options
+jsonOptions = Aeson.defaultOptions
+ { Aeson.fieldLabelModifier = symbCase
+ }