module DDC.Core.Tetra.Convert.Exp.PrimError
        (convertPrimError)
where
import DDC.Core.Tetra.Convert.Exp.Base
import DDC.Core.Tetra.Convert.Error

import DDC.Core.Exp.Annot
import DDC.Core.Check                    (AnTEC(..))

import qualified DDC.Core.Tetra.Prim     as E
import qualified DDC.Core.Salt.Name      as A
import qualified DDC.Core.Salt.Runtime   as A


-- | Covnert a Tetra error primop to Salt.
convertPrimError
        :: Show a
        => ExpContext                   -- ^ The surrounding expression context.
        -> Context a                    -- ^ Types and values in the environment.
        -> Exp (AnTEC a E.Name) E.Name  -- ^ Expression to convert.
        -> Maybe (ConvertM a (Exp a A.Name))

convertPrimError _ectx ctx xx
 = let  convertX  = contextConvertExp ctx
        downArgX  = convertX ExpArg   ctx
   in   
        case xx of
        XApp a _ _
         | Just ( E.NameOpError E.OpErrorDefault True
                , [_, xStr, xLine]) <- takeXPrimApps xx
         -> Just $ do
                xStr'   <- downArgX xStr
                xLine'  <- downArgX xLine
                return $ A.xErrorDefault (annotTail a) xStr' xLine'

        _ -> Nothing