-----------------------------------------------------------------------------
-- |
-- Module      :  Language.VHDL.Error
-- Copyright   :  (c) SAM Group, KTH/ICT/ECS 2007-2008
-- License     :  BSD-style (see the file LICENSE)
-- 
-- Maintainer  :  christiaan.baaij@gmail.com
-- Stability   :  experimental
-- Portability :  portable
--
-- ForSyDe error-related types and functions.
--
-----------------------------------------------------------------------------
module Language.VHDL.Error 
 (VHDLErr(..),
  EProne,
  module Control.Monad.Error,
  module Debug.Trace) where

import Debug.Trace
import Control.Monad.Error 

-------------
-- VHDLErr
-------------

-- | All Errors thrown or displayed in ForSyDe
data VHDLErr = 
  -- Used in ForSyDe.Backend.VHDL.*
  -- | Empty VHDL identifier
  EmptyVHDLId                                |
  -- | Incorrect Basic VHDL Identifier
  IncVHDLBasId String                        |
  -- | Incorrect Extended VHDL Identifier
  IncVHDLExtId String                        |
  -- | Other Errors
  Other String

-- | Show errors
instance Show VHDLErr where
 show EmptyVHDLId = "Empty VHDL identifier"
 show (IncVHDLBasId id)  = "Incorrect VHDL basic identifier " ++ 
                           "`" ++ id ++ "'"
 show (IncVHDLExtId id)  = "Incorrect VHDL extended identifier " ++ 
                           "`" ++ id ++ "'"

--------------
-- Error Monad
--------------

-- | We make CLasHErr an instance of the Error class to be able to throw it
-- as an exception.
instance Error VHDLErr where
 noMsg  = Other "An Error has ocurred"
 strMsg = Other

-- | 'EProne' represents failure using Left CLasHErr  or a successful 
--   result of type a using Right a
-- 
--  'EProne' is implicitly an instance of 
--   ['MonadError']  (@Error e => MonadError e (Either e)@)
--   ['Monad']       (@Error e => Monad (Either e)@)
type EProne = Either VHDLErr
-- FIXME: Rethink Eprone so that it takes contexts in account