{-# LANGUAGE LambdaCase #-}

module OptEnvConf.Casing
  ( -- * Casing
    toArgCase,
    toEnvCase,
    toConfigCase,

    -- * Internal
    toShellFunctionCase,
  )
where

import qualified Data.Char as Char

-- | Turn a string into arg case for option names
--
-- Example: @this-is-arg-case@
toArgCase :: String -> String
toArgCase :: String -> String
toArgCase = String -> String
toConfigCase

-- | Turn a string into env case for environment variable names
--
-- Example: @THIS_IS_ENV_CASE@
toEnvCase :: String -> String
toEnvCase :: String -> String
toEnvCase = (Char -> Char) -> String -> String
forall a b. (a -> b) -> [a] -> [b]
map (Char -> Char
Char.toUpper (Char -> Char) -> (Char -> Char) -> Char -> Char
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Char -> Char -> Char
spacer Char
'_')

-- | Turn a string into config case for configuration value names
--
-- Example: @this-is-config-case@
toConfigCase :: String -> String
toConfigCase :: String -> String
toConfigCase = (Char -> Char) -> String -> String
forall a b. (a -> b) -> [a] -> [b]
map (Char -> Char
Char.toLower (Char -> Char) -> (Char -> Char) -> Char -> Char
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Char -> Char -> Char
spacer Char
'-')

-- | Turn a string into a string that can be used as a shell function name (for completion)
--
-- Example: @this_is_shell_function_case@
toShellFunctionCase :: String -> String
toShellFunctionCase :: String -> String
toShellFunctionCase = (Char -> Char) -> String -> String
forall a b. (a -> b) -> [a] -> [b]
map (Char -> Char
Char.toLower (Char -> Char) -> (Char -> Char) -> Char -> Char
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Char -> Char -> Char
spacer Char
'_')

spacer :: Char -> Char -> Char
spacer :: Char -> Char -> Char
spacer Char
s = \case
  Char
'-' -> Char
s
  Char
'_' -> Char
s
  Char
'.' -> Char
s
  Char
' ' -> Char
s
  Char
'\t' -> Char
s
  Char
c -> Char
c