{-# LANGUAGE DuplicateRecordFields #-} {-# LANGUAGE OverloadedStrings #-} {-# LANGUAGE TemplateHaskell #-} module Horizon.Gen.Nix.Options ( horizonGenNixOpts , horizonGenNixOptsInfo , InputFile (..) , HorizonOptions (..) , ) where import Data.Either.Combinators (mapLeft) import Data.Kind (Type) import Options.Applicative (Parser, ParserInfo, ReadM, eitherReader, help, helper, info, long, metavar, option, value) import Path (File, Path, Rel, mkRelFile, parseRelFile) import Path.Dhall () type InputFile :: Type newtype InputFile where MkInputFile :: { fromInputFile :: Path Rel File } -> InputFile deriving stock (Eq, Show) parseInputFile :: ReadM InputFile parseInputFile = eitherReader $ mapLeft show . fmap MkInputFile . parseRelFile defaultInputFile :: InputFile defaultInputFile = MkInputFile $(mkRelFile "horizon.dhall") inputFileOption :: Parser InputFile inputFileOption = option parseInputFile ( long "input-file" <> metavar "INPUT_FILE" <> value defaultInputFile <> help "The name of the input file." ) type HorizonOptions :: Type data HorizonOptions where MkHorizonOptions :: { optInputFile :: InputFile } -> HorizonOptions deriving stock (Eq, Show) horizonGenNixOpts :: Parser HorizonOptions horizonGenNixOpts = MkHorizonOptions <$> inputFileOption horizonGenNixOptsInfo :: ParserInfo HorizonOptions horizonGenNixOptsInfo = info (helper <*> horizonGenNixOpts) mempty