packages feed

ruler-0.4.0.0: src/Err.chs

-------------------------------------------------------------------------
-- Error
-------------------------------------------------------------------------

%%[1 hs module (Err)
%%]

%%[1 hs export (Err(..), mkPPErr, ppErrPPL, errLIsFatal, errFirst, mkTr)
%%]

%%[1 hs import (UHC.Util.Pretty, UHC.Util.Utils)
%%]

%%[1 hs import (Scanner( SPos, emptySPos ))
%%]

%%[1 hs import (UHC.Util.ParseErrPrettyPrint)
%%]

%%[1 hs import (UHC.Util.Nm, UHC.Util.Utils( maybeHd ))
%%]

%%[1 hs

-------------------------------------------------------------------------
-- Errors
-------------------------------------------------------------------------

data Err
  = Err_UndefNm      SPos String String [Nm]
  | Err_NoJdSpec     SPos String [Nm]
  | Err_NotInSel     SPos String [Nm]
  | Err_Dups         SPos String String [PP_Doc]
  | Err_MutDpds      SPos String String [PP_Doc]
  | Err_NoXXFor      SPos String String [Nm]
  | Err_Match        SPos String PP_Doc PP_Doc
  | Err_RlPost       SPos String Nm
  | Err_NotAEqnForm  SPos PP_Doc
  | Err_FileNotFound SPos String [String]
  | Err_PP                PP_Doc
  | Err_Tr                PP_Doc
  deriving Show

-------------------------------------------------------------------------
-- Pretty printing
-------------------------------------------------------------------------

ppErrPPL :: PP a => [a] -> PP_Doc
ppErrPPL = vlist . map pp

mkPPErr :: PP a => a -> Err
mkPPErr = Err_PP . pp

mkTr :: (PP a,PP m) => m -> a -> Err
mkTr m p = Err_Tr (pp m >|< ":" >#< pp p)

instance PP Err where
  pp (Err_UndefNm pos cx knd nmL)
    = ppErr pos ("In" >#< cx >#< knd >|< "(s) are undefined:" >#< ppCommas' nmL)
  pp (Err_Dups pos cx knd nmL)
    = ppErr pos (cx >#< "has duplicate" >#< knd >|< "s:" >#< ppCommas' nmL)
  pp (Err_MutDpds pos cx knd nmL)
    = ppErr pos (cx >#< "has mutually dependent" >#< knd >|< "s:" >#< ppCommas' nmL)
  pp (Err_NoXXFor pos cx knd nmL)
    = ppErr pos ("In" >#< cx >#< "a" >#< knd >#< "lacks for:" >#< ppCommas' nmL)
  pp (Err_NoJdSpec pos cx nmL)
    = ppErr pos ("In" >#< cx >#< "no judgespec for:" >#< ppCommas' nmL)
  pp (Err_NotInSel pos cx nmL)
    = ppErr pos ("In" >#< cx >#< "view is not in selection (implicitly defined by data):" >#< ppCommas' nmL)
  pp (Err_Match pos cx given reqd)
    = ppErr pos ("In" >#< cx >#< "could not match"
                 >-< indent 2
                       (    "scheme judgement expr:" >#< reqd
                        >-< "given view expr      :" >#< given
                       )
                )
  pp (Err_RlPost pos cx nm)
    = ppErr pos ("In" >#< cx >#< "conclusion lacks judgement for ruleset's scheme:" >#< pp nm)
  pp (Err_FileNotFound pos fp sp)
    = ppErr pos ("File not found"
                 >-< indent 2
                       (    "file name         :" >#< fp
                        >-< "searched locations:" >#< vlist (map (text.show) sp)
                       )
                )
  pp (Err_NotAEqnForm pos e)
    = ppWarn pos ("expr not of (AG rule) form ... = ...:" >#< e)
  pp (Err_PP e)
    = e
  pp (Err_Tr e)
    = ppTr e

-------------------------------------------------------------------------
-- Misc
-------------------------------------------------------------------------

errIsFatal :: Err -> Bool
errIsFatal (Err_NotAEqnForm _ _) = False
errIsFatal (Err_Tr          _  ) = False
errIsFatal _                     = True

errLIsFatal :: [Err] -> Bool
errLIsFatal es = not (null es) && any errIsFatal es

errFirst :: [[Err]] -> [Err]
errFirst = firstNotEmpty

%%]