module DDC.Build.Pipeline.Error
        (Error (..)) 
where
import DDC.Base.Pretty
import qualified DDC.Core.Salt          as Salt
import qualified DDC.Core.Load          as CL
import Control.DeepSeq


data Error
        = ErrorSaltLoad    (CL.Error Salt.Name)

        -- | Error converting the module to Disciple Core Salt.
        | forall err. Pretty err => ErrorSaltConvert !err

        -- | Error converting the module to Disciple Core Lite.
        | forall err. Pretty err => ErrorLiteConvert !err

        -- | Error when loading a module.
        --   Blame it on the user.
        | forall err. Pretty err => ErrorLoad !err

        -- | Error when type checking a transformed module.
        --   Blame it on the compiler.
        | forall err. Pretty err => ErrorLint !err


instance Pretty Error where
 ppr err
  = case err of
        ErrorSaltLoad err'
         -> vcat [ text "Type error when loading Salt module."
                 , indent 2 (ppr err') ]

        ErrorSaltConvert err'
         -> vcat [ text "Fragment violation when converting Salt module to C code."
                 , indent 2 (ppr err') ]

        ErrorLiteConvert err'
         -> vcat [ text "Fragment violation when converting Lite module to Salt module."
                 , indent 2 (ppr err') ]

        ErrorLoad err'
         -> vcat [ text "Error loading module"
                 , indent 2 (ppr err') ]

        ErrorLint err'
         -> vcat [ text "Error in transformed module."
                 , indent 2 (ppr err') ]

instance NFData Error