module Tedious.Util
  ( upperFirst,
    lowerFirst,
    trimPrefixName,
    trimPrefixName_,
    toJSONOptions,
    schemaOptions
  )
where

import Control.Lens (Ixed (..), (%~))
import Data.Char (toLower, toUpper)
import Data.Aeson (Options, defaultOptions)
import qualified Data.Aeson as A
import Data.OpenApi (fromAesonOptions, SchemaOptions)

upperFirst :: String -> String
upperFirst :: String -> String
upperFirst = Index String -> Traversal' String (IxValue String)
forall m. Ixed m => Index m -> Traversal' m (IxValue m)
ix Int
Index String
0 ((Char -> Identity Char) -> String -> Identity String)
-> (Char -> Char) -> String -> String
forall s t a b. ASetter s t a b -> (a -> b) -> s -> t
%~ Char -> Char
toUpper

lowerFirst :: String -> String
lowerFirst :: String -> String
lowerFirst = Index String -> Traversal' String (IxValue String)
forall m. Ixed m => Index m -> Traversal' m (IxValue m)
ix Int
Index String
0 ((Char -> Identity Char) -> String -> Identity String)
-> (Char -> Char) -> String -> String
forall s t a b. ASetter s t a b -> (a -> b) -> s -> t
%~ Char -> Char
toLower

trimPrefixName :: String -> String -> String
trimPrefixName :: String -> String -> String
trimPrefixName String
name = String -> String
lowerFirst (String -> String) -> (String -> String) -> String -> String
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Int -> String -> String
forall a. Int -> [a] -> [a]
drop (String -> Int
forall a. [a] -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
length String
name)

trimPrefixName_ :: String -> String -> String
trimPrefixName_ :: String -> String -> String
trimPrefixName_ String
name = String -> String
lowerFirst (String -> String) -> (String -> String) -> String -> String
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Int -> String -> String
forall a. Int -> [a] -> [a]
drop Int
1 (String -> String) -> (String -> String) -> String -> String
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Int -> String -> String
forall a. Int -> [a] -> [a]
drop (String -> Int
forall a. [a] -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
length String
name)

toJSONOptions :: Options
toJSONOptions :: Options
toJSONOptions = Options
defaultOptions {A.allNullaryToStringTag = False, A.sumEncoding = A.UntaggedValue, A.constructorTagModifier = map toLower, A.fieldLabelModifier = drop 1, A.omitNothingFields = True}

schemaOptions :: SchemaOptions
schemaOptions :: SchemaOptions
schemaOptions = Options -> SchemaOptions
fromAesonOptions Options
toJSONOptions