module Buffet.Test.ParseArguments
  ( get
  ) where

import qualified Buffet.Ir.Ir as Ir
import qualified Buffet.Test.Configuration as Configuration
import qualified Buffet.Toolbox.ExceptionTools as ExceptionTools
import qualified Control.Exception as Exception
import qualified Data.Map.Strict as Map
import qualified Data.Text as T
import qualified Data.Yaml as Yaml
import Prelude (FilePath, IO, Show, ($), (.), maybe, mconcat, pure, show)

data Exception =
  Exception FilePath Yaml.ParseException

instance Show Exception where
  show :: Exception -> String
show (Exception String
path ParseException
exception) =
    [String] -> String
forall a. Monoid a => [a] -> a
mconcat [String
path, String
":\n", ParseException -> String
Yaml.prettyPrintParseException ParseException
exception]

instance Exception.Exception Exception

get :: Configuration.Configuration -> IO (Map.Map Ir.Option T.Text)
get :: Configuration -> IO (Map Option Text)
get =
  IO (Map Option Text)
-> (String -> IO (Map Option Text))
-> Maybe String
-> IO (Map Option Text)
forall b a. b -> (a -> b) -> Maybe a -> b
maybe
    (Map Option Text -> IO (Map Option Text)
forall (f :: * -> *) a. Applicative f => a -> f a
pure Map Option Text
forall k a. Map k a
Map.empty)
    (\String
file ->
       (ParseException -> Exception)
-> IO (Either ParseException (Map Option Text))
-> IO (Map Option Text)
forall e a b. Exception e => (a -> e) -> IO (Either a b) -> IO b
ExceptionTools.eitherThrow (String -> ParseException -> Exception
Exception String
file) (IO (Either ParseException (Map Option Text))
 -> IO (Map Option Text))
-> IO (Either ParseException (Map Option Text))
-> IO (Map Option Text)
forall a b. (a -> b) -> a -> b
$ String -> IO (Either ParseException (Map Option Text))
forall a. FromJSON a => String -> IO (Either ParseException a)
Yaml.decodeFileEither String
file) (Maybe String -> IO (Map Option Text))
-> (Configuration -> Maybe String)
-> Configuration
-> IO (Map Option Text)
forall b c a. (b -> c) -> (a -> b) -> a -> c
.
  Configuration -> Maybe String
Configuration.arguments