module PursLoader.Options ( pscOptions , loaderSrcOption , loaderFFIOption ) where import Data.Array (concat) 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, fromMaybe) noPreludeOpt = "no-prelude" noOptsOpt = "no-opts" noMagicDoOpt = "no-magic-do" noTcoOpt = "no-tco" verboseErrorsOpt = "verbose-errors" outputOpt = "output" commentsOpt = "comments" noPrefixOpt = "no-prefix" requirePathOpt = "require-path" srcOpt = "src" ffiOpt = "ffi" 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 , requirePath :: NullOrUndefined String , src :: NullOrUndefined [String] , ffi :: NullOrUndefined [String] } instance isForeignOptions :: IsForeign Options where read obj = Options <$> ({ noPrelude: _ , noOpts: _ , noMagicDo: _ , noTco: _ , verboseErrors: _ , comments: _ , output: _ , noPrefix: _ , requirePath: _ , src: _ , ffi: _ } <$> 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 requirePathOpt obj <*> readProp srcOpt obj <*> readProp ffiOpt obj) class LoaderOption a where opt :: String -> NullOrUndefined a -> [String] instance booleanLoaderOption :: LoaderOption Boolean where opt key val = maybe [] (\a -> if a then ["--" ++ key] else []) (runNullOrUndefined val) instance stringLoaderOption :: LoaderOption String where opt key val = maybe [] (\a -> ["--" ++ key ++ "=" ++ a]) (runNullOrUndefined val) instance arrayLoaderOption :: (LoaderOption a) => LoaderOption [a] where opt key val = concat (opt key <$> (NullOrUndefined <<< Just) <$> (fromMaybe [] (runNullOrUndefined val))) pscOptions :: Foreign -> [String] pscOptions 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 <> opt requirePathOpt a.requirePath <> opt ffiOpt a.ffi loaderSrcOption :: Foreign -> Maybe [String] loaderSrcOption query = either (const Nothing) (\(Options a) -> runNullOrUndefined a.src) (read query) loaderFFIOption :: Foreign -> Maybe [String] loaderFFIOption query = either (const Nothing) (\(Options a) -> runNullOrUndefined a.ffi) (read query)