packages feed

descript-lang-0.2.0.0: src/Descript/Build/Error.hs

{-# LANGUAGE GeneralizedNewtypeDeriving #-}

-- | Organizes build results.
module Descript.Build.Error
  ( BuildError (..)
  , BuildResult
  , BuildResultT
  ) where

import Descript.Misc
import Data.Semigroup

-- | Any type of build error.
data BuildError
  = BuildParseError (ParseError Char)
  | BuildExpectedProgramError
  | BuildValidateError [Problem SrcAnn]
  | BuildCompileError CompileError
  deriving (Eq, Read, Show)

-- | A final result from building (parsing, interpreting, and
-- outputting) a source. If the build succeeded, contains  the output.
-- If the build failed, contains the error.
type BuildResult a = Result BuildError a

-- | A stacked 'BuildResult'.
type BuildResultT u a = ResultT BuildError u a

-- | When combined, takes the earlier error.
instance Semigroup BuildError where
  BuildParseError x <> BuildParseError y = BuildParseError $ x <> y
  BuildParseError x <> _ = BuildParseError x
  BuildExpectedProgramError <> _ = BuildExpectedProgramError
  BuildValidateError xs <> BuildValidateError ys = BuildValidateError $ xs <> ys
  BuildValidateError xs <> _ = BuildValidateError xs
  BuildCompileError x <> _ = BuildCompileError x

instance FileSummary BuildError where
  summaryF file (BuildParseError err) = parseErrorSummary file err
  summaryF _ BuildExpectedProgramError = "expected a program, given a module"
  summaryF _ (BuildValidateError probs) = validateErrorSummary probs
  summaryF _ (BuildCompileError err) = "compile error: " ++ summary err