packages feed

settei-formats-0.2.0.0: src/Settei/Formats/Optparse.hs

{-# LANGUAGE ImportQualifiedPost #-}

-- |
-- Module: Settei.Formats.Optparse
-- Description: Reusable @--config FORMAT:PATH@ options for tagged multi-format inputs.
module Settei.Formats.Optparse
  ( configInputOption,
    configInputOptions,
    configInputReader,
  )
where

import Control.Applicative qualified as Applicative
import Options.Applicative (Mod, OptionFields, Parser)
import Options.Applicative qualified as Options
import Settei.Formats

-- | 'Options.ReadM' for the @FORMAT:PATH@ grammar of 'parseConfigInput'.
configInputReader :: Options.ReadM ConfigInput
configInputReader = Options.eitherReader parseConfigInput

-- | Parse zero or more tagged inputs using caller-supplied option metadata.
configInputOption :: Mod OptionFields ConfigInput -> Parser [ConfigInput]
configInputOption modifiers =
  Applicative.many (Options.option configInputReader modifiers)

-- | Parse zero or more default @--config FORMAT:PATH@ occurrences.
configInputOptions :: Parser [ConfigInput]
configInputOptions =
  configInputOption
    ( Options.long "config"
        <> Options.metavar "FORMAT:PATH"
        <> Options.help "Load yaml:PATH, kdl:PATH, or dhall:PATH in occurrence order"
    )