module PursLoader.Options
( pscMakeOptions
, pscMakeDefaultOutput
, pscMakeOutputOption
, loaderSrcOption
) where
import Data.Either (either)
import Data.Foreign (Foreign(), F())
import Data.Foreign.Class (IsForeign, read, readProp)
import Data.Foreign.NullOrUndefined (NullOrUndefined(), runNullOrUndefined)
import Data.Maybe (Maybe(..), maybe)
noPreludeOpt = "no-prelude"
noOptsOpt = "no-opts"
noMagicDoOpt = "no-magic-do"
noTcoOpt = "no-tco"
verboseErrorsOpt = "verbose-errors"
outputOpt = "output"
commentsOpt = "comments"
noPrefixOpt = "no-prefix"
srcOpt = "src"
pscMakeDefaultOutput = "output"
newtype Options
= Options { noPrelude :: NullOrUndefined Boolean
, noOpts :: NullOrUndefined Boolean
, noMagicDo :: NullOrUndefined Boolean
, noTco :: NullOrUndefined Boolean
, verboseErrors :: NullOrUndefined Boolean
, comments :: NullOrUndefined Boolean
, output :: NullOrUndefined String
, noPrefix :: NullOrUndefined Boolean
, src :: NullOrUndefined [String]
}
instance isForeignOptions :: IsForeign Options where
read obj = Options <$> ({ noPrelude: _
, noOpts: _
, noMagicDo: _
, noTco: _
, verboseErrors: _
, comments: _
, output: _
, noPrefix: _
, src: _
} <$> readProp noPreludeOpt obj
<*> readProp noOptsOpt obj
<*> readProp noMagicDoOpt obj
<*> readProp noTcoOpt obj
<*> readProp verboseErrorsOpt obj
<*> readProp commentsOpt obj
<*> readProp outputOpt obj
<*> readProp noPrefixOpt obj
<*> readProp srcOpt obj)
class LoaderOption a where
opt :: String -> NullOrUndefined a -> [String]
instance booleanLoaderOption :: LoaderOption Boolean where
opt key opt = maybe [] (\a -> if a then ["--" ++ key] else [])
(runNullOrUndefined opt)
instance stringLoaderOption :: LoaderOption String where
opt key opt = maybe [] (\a -> ["--" ++ key ++ "=" ++ a])
(runNullOrUndefined opt)
pscMakeOutputOption :: Foreign -> Maybe String
pscMakeOutputOption query = either (const Nothing)
(\(Options a) -> runNullOrUndefined a.output)
(read query)
pscMakeOptions :: Foreign -> [String]
pscMakeOptions query = either (const []) fold parsed
where parsed = read query :: F Options
fold (Options a) = opt noPreludeOpt a.noPrelude <>
opt noOptsOpt a.noOpts <>
opt noMagicDoOpt a.noMagicDo <>
opt noTcoOpt a.noTco <>
opt verboseErrorsOpt a.verboseErrors <>
opt commentsOpt a.comments <>
opt outputOpt a.output <>
opt noPrefixOpt a.noPrefix
loaderSrcOption :: Foreign -> Maybe [String]
loaderSrcOption query = either (const Nothing)
(\(Options a) -> runNullOrUndefined a.src)
(read query)