packages feed

ribosome-0.3.0.0: lib/Ribosome/Data/Errors.hs

{-# LANGUAGE TemplateHaskell #-}

module Ribosome.Data.Errors(
  ComponentName(..),
  Errors(..),
  Error(..),
  componentErrors,
  timestamp,
  report,
) where

import Control.Lens (makeClassy)
import Data.Default (Default)
import Data.Map (Map)
import qualified Data.Map as Map (toList)
import Data.Text.Prettyprint.Doc (Doc, Pretty(..), align, line, vsep, (<+>), (<>))
import Prelude hiding (error)

import Ribosome.Data.ErrorReport (ErrorReport(ErrorReport))

newtype ComponentName =
  ComponentName Text
  deriving (Eq, Ord, Show)

data Error =
  Error {
    _timestamp :: Int,
    _report :: ErrorReport
  }
  deriving (Eq, Show)

makeClassy ''Error

instance Pretty Error where
  pretty (Error stamp (ErrorReport _ lines' _)) =
    pretty stamp <+> align (vsep (pretty <$> lines'))

newtype Errors =
  Errors {
    _componentErrors :: Map ComponentName [Error]
    }
  deriving (Eq, Show, Default)

makeClassy ''Errors

prettyComponentErrors :: ComponentName -> [Error] -> Doc a
prettyComponentErrors (ComponentName name) errors' =
  line <> line <> pretty name <> ":" <> line <> vsep (pretty <$> errors')

instance Pretty Errors where
  pretty (Errors errors') =
    vsep (uncurry prettyComponentErrors <$> Map.toList errors')