module Vulkan.Utils.Internal where

import           Control.Monad.IO.Class
import           GHC.IO                         ( throwIO )
import           GHC.IO.Exception               ( IOErrorType(..)
                                                , IOException(..)
                                                )
import           System.IO                      ( hPutStrLn
                                                , stderr
                                                )
import Language.Haskell.TH.Quote

----------------------------------------------------------------
-- Internal utils
----------------------------------------------------------------

unsatisfiedConstraints :: String -> IO a
unsatisfiedConstraints :: String -> IO a
unsatisfiedConstraints String
message =
  IOException -> IO a
forall e a. Exception e => e -> IO a
throwIO (IOException -> IO a) -> IOException -> IO a
forall a b. (a -> b) -> a -> b
$ Maybe Handle
-> IOErrorType
-> String
-> String
-> Maybe CInt
-> Maybe String
-> IOException
IOError Maybe Handle
forall a. Maybe a
Nothing IOErrorType
UnsatisfiedConstraints String
"" String
message Maybe CInt
forall a. Maybe a
Nothing Maybe String
forall a. Maybe a
Nothing

noSuchThing :: String -> IO a
noSuchThing :: String -> IO a
noSuchThing String
message =
  IOException -> IO a
forall e a. Exception e => e -> IO a
throwIO (IOException -> IO a) -> IOException -> IO a
forall a b. (a -> b) -> a -> b
$ Maybe Handle
-> IOErrorType
-> String
-> String
-> Maybe CInt
-> Maybe String
-> IOException
IOError Maybe Handle
forall a. Maybe a
Nothing IOErrorType
NoSuchThing String
"" String
message Maybe CInt
forall a. Maybe a
Nothing Maybe String
forall a. Maybe a
Nothing

sayErr :: MonadIO m => String -> m ()
sayErr :: String -> m ()
sayErr = IO () -> m ()
forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO (IO () -> m ()) -> (String -> IO ()) -> String -> m ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Handle -> String -> IO ()
hPutStrLn Handle
stderr

badQQ :: String -> QuasiQuoter
badQQ :: String -> QuasiQuoter
badQQ String
name = (String -> Q Exp)
-> (String -> Q Pat)
-> (String -> Q Type)
-> (String -> Q [Dec])
-> QuasiQuoter
QuasiQuoter (String -> String -> Q Exp
forall a. String -> a
bad String
"expression")
                         (String -> String -> Q Pat
forall a. String -> a
bad String
"pattern")
                         (String -> String -> Q Type
forall a. String -> a
bad String
"type")
                         (String -> String -> Q [Dec]
forall a. String -> a
bad String
"declaration")
 where
  bad :: String -> a
  bad :: String -> a
bad String
context =
    String -> a
forall a. HasCallStack => String -> a
error (String -> a) -> String -> a
forall a b. (a -> b) -> a -> b
$ String
"Can't use " String -> String -> String
forall a. Semigroup a => a -> a -> a
<> String
name String -> String -> String
forall a. Semigroup a => a -> a -> a
<> String
" quote in a " String -> String -> String
forall a. Semigroup a => a -> a -> a
<> String
context String -> String -> String
forall a. Semigroup a => a -> a -> a
<> String
" context"