packages feed

tonaparser-0.1.0.0: example/Main.hs

module Main where

import RIO

import Say (sayShow)
import TonaParser
  ( Parser
  , ParserMods(..)
  , (.||)
  , argLong
  , defParserMods
  , envVar
  , modify
  , optionalVal
  , requiredVal
  , withConfig
  )

data Bar = Bar
  { baz :: String
  } deriving Show

data Foo = Foo
  { foo :: Int
  , bar :: Bar
  } deriving Show

-- If environment variable "BAZ" exist, use the value
-- else if command line argument "--baz" exist, use the value
-- else use default value "baz"
barParser :: Parser Bar
barParser =
  Bar <$>
    optionalVal
      "Configuration for Bar.baz"
      (argLong "baz" .|| envVar "BAZ")
      "baz"

setPrefixBar :: Parser Bar -> Parser Bar
setPrefixBar =
  modify
    defParserMods
      { cmdLineLongMods = ("bar-" <>)
      , envVarMods = ("BAR_" <>)
      }

fooParser :: Parser Foo
fooParser = Foo
  <$> requiredVal
    "Configuration for Foo.foo"
    (argLong "foo" .|| envVar "FOO")
  <*> setPrefixBar barParser

modifyFoo :: Parser Foo -> Parser Foo
modifyFoo =
  modify
    defParserMods
      { cmdLineLongMods = longMods
      , envVarMods = envMods
      }
  where
    longMods "foo" = "new-foo"
    longMods a = a
    envMods "BAR_BAZ" = "NEW_BAR_BAZ"
    envMods a = a

main :: IO ()
main =
  withConfig (modifyFoo fooParser) $ \config ->
    sayShow $ config