module Language.Fortran.Vars.Errors
  ( invalidArg'
  , invalidArg
  )
where

import           Data.List                      ( foldl' )

-- | Given a function name and arguments, generate an
-- error message for invalid arguments
genError :: Show a => String -> [a] -> String
genError :: forall a. Show a => String -> [a] -> String
genError String
funcName [a]
args =
  let
    argMsg :: String
argMsg = case [a]
args of
      []     -> String
""
      [ a
x ]  -> String
" - " forall a. [a] -> [a] -> [a]
++ forall a. Show a => a -> String
show a
x
      a
x : [a]
xs -> String
"s - " forall a. [a] -> [a] -> [a]
++ forall (t :: * -> *) b a.
Foldable t =>
(b -> a -> b) -> b -> t a -> b
foldl' (\String
acc a
y -> String
acc forall a. [a] -> [a] -> [a]
++ String
", " forall a. [a] -> [a] -> [a]
++ forall a. Show a => a -> String
show a
y) (forall a. Show a => a -> String
show a
x) [a]
xs
  in  String
funcName forall a. [a] -> [a] -> [a]
++ String
" : invalid argument" forall a. [a] -> [a] -> [a]
++ String
argMsg

-- | Function to return an error case when an unappropriate arguemnt is
-- passed to some function or when some pattern match issue occurs
invalidArg' :: Show a => String -> [a] -> Either String b
invalidArg' :: forall a b. Show a => String -> [a] -> Either String b
invalidArg' String
funcName [a]
args = forall a b. a -> Either a b
Left forall a b. (a -> b) -> a -> b
$ forall a. Show a => String -> [a] -> String
genError String
funcName [a]
args

-- | Function to throw an error when an unappropriate arguemnt is
-- passed to some function or when some pattern match issue occurs
invalidArg :: Show a => String -> [a] -> b
invalidArg :: forall a b. Show a => String -> [a] -> b
invalidArg String
funcName [a]
args = forall a. HasCallStack => String -> a
error forall a b. (a -> b) -> a -> b
$ forall a. Show a => String -> [a] -> String
genError String
funcName [a]
args