packages feed

moffy-samples-gtk4-run-0.1.0.0: src/Stopgap/System/GLib/Error/Io.hsc

{-# LANGUAGE ImportQualifiedPost #-}
{-# LANGUAGE CApiFFI #-}
{-# LANGUAGE TemplateHaskell #-}
{-# LANGUAGE BlockArguments #-}
{-# LANGUAGE PatternSynonyms #-}
{-# OPTIONS_GHC -Wall -fno-warn-tabs #-}

module Stopgap.System.GLib.Error.Io where

import Foreign.C.Enum
import Control.Exception
import Control.Exception.Hierarchy
import Data.Word

import Stopgap.System.GLib.Error qualified as G.Error
import Stopgap.System.GLib.Error qualified

#include <gtk/gtk.h>

enum "I_" ''#{type GFileError} [''Show, ''Read] [
	("Failed", #{const G_IO_ERROR_FAILED}),
	("NotFound", #{const G_IO_ERROR_NOT_FOUND}),

	("PermissionDenied", #{const G_IO_ERROR_PERMISSION_DENIED})
	]

data I = I { iCode :: I_, iMessage :: String }

instance Show I where
	show (I c msg) = "Error: " ++ show c ++ " " ++ msg

exceptionHierarchy (Just ''G.Error.E) $ ExType ''I

foreign import capi "gtk/gtk.h value G_IO_ERROR" c_G_IO_ERROR :: #{type GQuark}

mkEFun :: G.Error.DomainCode -> String -> IO (Maybe G.Error.E)
mkEFun (d, c) msg = do
	let	d0 = c_G_IO_ERROR
	pure if d == d0
	then Just . G.Error.E $ I (I_ $ fromIntegral c) msg
	else Nothing