packages feed

descript-lang-0.2.0.0: src/Descript/Misc/Build/Process/Diagnose.hs

{-# LANGUAGE DeriveFunctor #-}
{-# LANGUAGE DeriveFoldable #-}
{-# LANGUAGE DeriveTraversable #-}

-- | Diagnostics - errors, warnings, and the result of interpreting a
-- program.
module Descript.Misc.Build.Process.Diagnose
  ( DiagType (..)
  , Diagnostic (..)
  , getDiagType
  ) where

import Descript.Misc.Build.Process.Validate
import Descript.Misc.Ann
import Descript.Misc.Summary
import Data.Text (Text)
import qualified Data.Text as Text

-- | What type of diagnostic this is.
data DiagType
  = DiagProblemType
  | DiagEvalType
  deriving (Eq, Ord, Read, Show)

-- | Describes a piece of source - whether it's valid, what it
-- evaluates into, etc..
data Diagnostic an
  = DiagProblem (Problem an)
  | DiagEval an Text
  deriving (Eq, Ord, Read, Show, Functor, Foldable, Traversable)

instance Ann Diagnostic where
  getAnn (DiagProblem prob) = getAnn prob
  getAnn (DiagEval ann _) = ann

instance SummaryWithAnn Diagnostic where
  baseSummary (DiagProblem prob) = baseSummary prob
  baseSummary (DiagEval _ x) = Text.unpack x

instance (AnnSummary an) => Summary (Diagnostic an) where
  summary = summaryWithAnn

-- | Gets the diagnostic's type.
getDiagType :: Diagnostic an -> DiagType
getDiagType (DiagProblem _) = DiagProblemType
getDiagType (DiagEval _ _) = DiagEvalType