module PursLoader.Options ( pscOptions , loaderSrcOption , loaderFFIOption , Options() , output ) where import Prelude (Unit(), (<>), (<$>), (<<<), (++), (<*>), ($), const, id) 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 :: String , noPrefix :: NullOrUndefined Boolean , requirePath :: String , src :: NullOrUndefined (Array String) , ffi :: NullOrUndefined (Array String) } output :: Options -> String output (Options o) = o.output 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 <*> (maybe "output" id <<< runNullOrUndefined <$> readProp outputOpt obj) <*> readProp noPrefixOpt obj <*> readProp srcOpt obj <*> readProp ffiOpt obj) class LoaderOption a where opt :: String -> NullOrUndefined a -> Array 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 (Array a) where opt key val = concat (opt key <$> (NullOrUndefined <<< Just) <$> (fromMaybe [] (runNullOrUndefined val))) pscOptions :: Options -> Array String pscOptions (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 (NullOrUndefined $ Just a.output) <> opt noPrefixOpt a.noPrefix <> opt requirePathOpt (NullOrUndefined $ Just a.requirePath) <> opt ffiOpt a.ffi loaderSrcOption :: Foreign -> Maybe (Array String) loaderSrcOption query = either (const Nothing) (\(Options a) -> runNullOrUndefined a.src) (read query) loaderFFIOption :: Foreign -> Maybe (Array String) loaderFFIOption query = either (const Nothing) (\(Options a) -> runNullOrUndefined a.ffi) (read query)