1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
|
module PursLoader.Options
( pscMakeOptions
, pscMakeDefaultOutput
, pscMakeOutputOption
) 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"
pscMakeDefaultOutput = "output"
newtype Options
= Options { noPrelude :: NullOrUndefined Boolean
, noOpts :: NullOrUndefined Boolean
, noMagicDo :: NullOrUndefined Boolean
, noTco :: NullOrUndefined Boolean
, verboseErrors :: NullOrUndefined Boolean
, output :: NullOrUndefined String
}
instance isForeignOptions :: IsForeign Options where
read obj = (\a b c d e f ->
Options { noPrelude: a
, noOpts: b
, noMagicDo: c
, noTco: d
, verboseErrors: e
, output: f
}) <$> readProp noPreludeOpt obj
<*> readProp noOptsOpt obj
<*> readProp noMagicDoOpt obj
<*> readProp noTcoOpt obj
<*> readProp verboseErrorsOpt obj
<*> readProp outputOpt obj
booleanOpt :: String -> NullOrUndefined Boolean -> [String]
booleanOpt key opt = maybe [] (\a -> if a then ["--" ++ key] else []) (runNullOrUndefined opt)
stringOpt :: String -> NullOrUndefined String -> [String]
stringOpt 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) = booleanOpt noPreludeOpt a.noPrelude <>
booleanOpt noOptsOpt a.noOpts <>
booleanOpt noMagicDoOpt a.noMagicDo <>
booleanOpt noTcoOpt a.noTco <>
booleanOpt verboseErrorsOpt a.verboseErrors <>
stringOpt outputOpt a.output
|