packages feed

hjugement-cli-0.0.0.20190621: src/Hjugement/CLI.hs

{-# LANGUAGE AllowAmbiguousTypes #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE NoMonomorphismRestriction #-}
{-# LANGUAGE TypeApplications #-}
{-# LANGUAGE NamedFieldPuns #-}
{-# LANGUAGE UndecidableInstances #-}
{-# OPTIONS_GHC -Wno-missing-signatures #-}
{-# OPTIONS_GHC -Wno-unused-imports #-}
module Hjugement.CLI where

import Control.Applicative (Applicative(..), Alternative(..))
import Control.Monad (Monad(..))
import Data.Bool
import Data.Either (Either(..))
import Data.Function (($), (.))
import Data.Functor ((<$>), (<$))
import Data.Int (Int)
import Data.List.NonEmpty (NonEmpty(..))
import Data.Maybe (Maybe(..), fromMaybe)
import Data.Ord (Ord(..))
import Data.Semigroup (Semigroup(..))
import Data.String (String)
import Data.Text (Text)
import Data.Void (Void)
import Symantic.CLI as CLI
import System.Environment (getArgs)
import System.IO (IO, FilePath, print, stderr, putStrLn)
import Text.Show (Show(..))
import Type.Reflection (Typeable)
import qualified Data.Set as Set
import qualified Data.Text as Text
import qualified Data.Text.Lazy.IO as TL
import qualified Data.Version as Version
import qualified Paths_hjugement_cli as Hjugement
import qualified Symantic.Document as Doc
import qualified System.IO as IO

import Hjugement.CLI.Utils
import Hjugement.CLI.Registrar
import Hjugement.CLI.Trustee
import Hjugement.CLI.MkElection

progname :: Text
progname = "hjugement"
version :: Text
version =
	progname <> "-" <>
	Text.pack (Version.showVersion Hjugement.version)

api =
	program "hjugement" $
		(api_options <?> api_command) <!>
		api_help True <!>
		api_version

api_command =
	rule "COMMAND" $
		api_registrar <!>
		api_trustee <!>
		api_mkelection
run_command opts =
	run_registrar opts :!:
	run_trustee opts :!:
	(run_mkelection :!: run_help api_mkelection)

api_version =
	"Print the version."
	`helps`
	tagged (TagLong "version") nothing
	<.> response @Doc

parseAPI = parser @Void @Doc api $
	run_command :!:
	run_help api :!:
	run_version
	where
	run_version =
		return (Doc.from version <> Doc.newline)