module GHC.Types.SafeHaskell
( IsSafeImport
, SafeHaskellMode(..)
, IfaceTrustInfo
, getSafeMode
, setSafeMode
, noIfaceTrustInfo
)
where
import GHC.Prelude
import GHC.Utils.Binary
import GHC.Utils.Outputable
import Data.Word
type IsSafeImport = Bool
data SafeHaskellMode
= Sf_None
| Sf_Unsafe
| Sf_Trustworthy
| Sf_Safe
| Sf_SafeInferred
| Sf_Ignore
deriving (SafeHaskellMode -> SafeHaskellMode -> Bool
(SafeHaskellMode -> SafeHaskellMode -> Bool)
-> (SafeHaskellMode -> SafeHaskellMode -> Bool)
-> Eq SafeHaskellMode
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: SafeHaskellMode -> SafeHaskellMode -> Bool
== :: SafeHaskellMode -> SafeHaskellMode -> Bool
$c/= :: SafeHaskellMode -> SafeHaskellMode -> Bool
/= :: SafeHaskellMode -> SafeHaskellMode -> Bool
Eq)
instance Show SafeHaskellMode where
show :: SafeHaskellMode -> String
show SafeHaskellMode
Sf_None = String
"None"
show SafeHaskellMode
Sf_Unsafe = String
"Unsafe"
show SafeHaskellMode
Sf_Trustworthy = String
"Trustworthy"
show SafeHaskellMode
Sf_Safe = String
"Safe"
show SafeHaskellMode
Sf_SafeInferred = String
"Safe-Inferred"
show SafeHaskellMode
Sf_Ignore = String
"Ignore"
instance Outputable SafeHaskellMode where
ppr :: SafeHaskellMode -> SDoc
ppr = String -> SDoc
text (String -> SDoc)
-> (SafeHaskellMode -> String) -> SafeHaskellMode -> SDoc
forall b c a. (b -> c) -> (a -> b) -> a -> c
. SafeHaskellMode -> String
forall a. Show a => a -> String
show
newtype IfaceTrustInfo = TrustInfo SafeHaskellMode
getSafeMode :: IfaceTrustInfo -> SafeHaskellMode
getSafeMode :: IfaceTrustInfo -> SafeHaskellMode
getSafeMode (TrustInfo SafeHaskellMode
x) = SafeHaskellMode
x
setSafeMode :: SafeHaskellMode -> IfaceTrustInfo
setSafeMode :: SafeHaskellMode -> IfaceTrustInfo
setSafeMode = SafeHaskellMode -> IfaceTrustInfo
TrustInfo
noIfaceTrustInfo :: IfaceTrustInfo
noIfaceTrustInfo :: IfaceTrustInfo
noIfaceTrustInfo = SafeHaskellMode -> IfaceTrustInfo
setSafeMode SafeHaskellMode
Sf_None
trustInfoToNum :: IfaceTrustInfo -> Word8
trustInfoToNum :: IfaceTrustInfo -> Word8
trustInfoToNum IfaceTrustInfo
it
= case IfaceTrustInfo -> SafeHaskellMode
getSafeMode IfaceTrustInfo
it of
SafeHaskellMode
Sf_None -> Word8
0
SafeHaskellMode
Sf_Unsafe -> Word8
1
SafeHaskellMode
Sf_Trustworthy -> Word8
2
SafeHaskellMode
Sf_Safe -> Word8
3
SafeHaskellMode
Sf_SafeInferred -> Word8
4
SafeHaskellMode
Sf_Ignore -> Word8
0
numToTrustInfo :: Word8 -> IfaceTrustInfo
numToTrustInfo :: Word8 -> IfaceTrustInfo
numToTrustInfo Word8
0 = SafeHaskellMode -> IfaceTrustInfo
setSafeMode SafeHaskellMode
Sf_None
numToTrustInfo Word8
1 = SafeHaskellMode -> IfaceTrustInfo
setSafeMode SafeHaskellMode
Sf_Unsafe
numToTrustInfo Word8
2 = SafeHaskellMode -> IfaceTrustInfo
setSafeMode SafeHaskellMode
Sf_Trustworthy
numToTrustInfo Word8
3 = SafeHaskellMode -> IfaceTrustInfo
setSafeMode SafeHaskellMode
Sf_Safe
numToTrustInfo Word8
4 = SafeHaskellMode -> IfaceTrustInfo
setSafeMode SafeHaskellMode
Sf_SafeInferred
numToTrustInfo Word8
n = String -> IfaceTrustInfo
forall a. HasCallStack => String -> a
error (String -> IfaceTrustInfo) -> String -> IfaceTrustInfo
forall a b. (a -> b) -> a -> b
$ String
"numToTrustInfo: bad input number! (" String -> ShowS
forall a. [a] -> [a] -> [a]
++ Word8 -> String
forall a. Show a => a -> String
show Word8
n String -> ShowS
forall a. [a] -> [a] -> [a]
++ String
")"
instance Outputable IfaceTrustInfo where
ppr :: IfaceTrustInfo -> SDoc
ppr (TrustInfo SafeHaskellMode
Sf_None) = String -> SDoc
text String
"none"
ppr (TrustInfo SafeHaskellMode
Sf_Ignore) = String -> SDoc
text String
"none"
ppr (TrustInfo SafeHaskellMode
Sf_Unsafe) = String -> SDoc
text String
"unsafe"
ppr (TrustInfo SafeHaskellMode
Sf_Trustworthy) = String -> SDoc
text String
"trustworthy"
ppr (TrustInfo SafeHaskellMode
Sf_Safe) = String -> SDoc
text String
"safe"
ppr (TrustInfo SafeHaskellMode
Sf_SafeInferred) = String -> SDoc
text String
"safe-inferred"
instance Binary IfaceTrustInfo where
put_ :: BinHandle -> IfaceTrustInfo -> IO ()
put_ BinHandle
bh IfaceTrustInfo
iftrust = BinHandle -> Word8 -> IO ()
putByte BinHandle
bh (Word8 -> IO ()) -> Word8 -> IO ()
forall a b. (a -> b) -> a -> b
$ IfaceTrustInfo -> Word8
trustInfoToNum IfaceTrustInfo
iftrust
get :: BinHandle -> IO IfaceTrustInfo
get BinHandle
bh = BinHandle -> IO Word8
getByte BinHandle
bh IO Word8 -> (Word8 -> IO IfaceTrustInfo) -> IO IfaceTrustInfo
forall a b. IO a -> (a -> IO b) -> IO b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= (IfaceTrustInfo -> IO IfaceTrustInfo
forall a. a -> IO a
forall (m :: * -> *) a. Monad m => a -> m a
return (IfaceTrustInfo -> IO IfaceTrustInfo)
-> (Word8 -> IfaceTrustInfo) -> Word8 -> IO IfaceTrustInfo
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Word8 -> IfaceTrustInfo
numToTrustInfo)