module System.Zfs.Errors where

import System.Zfs.Lowlevel

data ZError = EzInitFailed
            | EzNoMem
            | EzBadProp
            | EzPropReadOnly
            | EzPropType
            | EzPropNonInherit
            | EzPropSpace
            | EzBadType
            | EzBusy
            | EzExists
            | EzNoEnt
            | EzBadStream
            | EzDsReadonly
            | EzVolTooBig
            | EzInvalidName
            | EzBadRestore
            | EzBadBackup
            | EzBadTarget
            | EzNoDevice
            | EzBadDev
            | EzNoReplicas
            | EzResilvering
            | EzBadVersion
            | EzPoolUnavail
            | EzDevOverflow
            | EzBadPath
            | EzCrossTarget
            | EzZoned
            | EzMountFailed
            | EzUmountFailed
            | EzUnshareNfsFailed
            | EzShareNfsFailed
            | EzPerm
            | EzNoSpc
            | EzFault
            | EzIO
            | EzIntr
            | EzIsSpare
            | EzInvalConfig
            | EzRecursive
            | EzNoHistory
            | EzPoolProps
            | EzPoolNotSup
            | EzPoolInvalArg
            deriving Show

errnoToZError :: Int -> ZError
errnoToZError errno = case errno of
  2000 -> EzNoMem
  2001 -> EzBadProp
  2002 -> EzPropReadOnly
  2003 -> EzPropType
  2004 -> EzPropNonInherit
  2005 -> EzPropSpace
  2006 -> EzBadType
  2007 -> EzBusy
  2008 -> EzExists
  2009 -> EzNoEnt
  2010 -> EzBadStream
  2011 -> EzDsReadonly
  2012 -> EzVolTooBig
  2013 -> EzInvalidName
  2014 -> EzBadRestore
  2015 -> EzBadBackup
  2016 -> EzBadTarget
  2017 -> EzNoDevice
  2018 -> EzBadDev
  2019 -> EzNoReplicas
  2020 -> EzResilvering
  2021 -> EzBadVersion
  2022 -> EzPoolUnavail
  2023 -> EzDevOverflow
  2024 -> EzBadPath
  2025 -> EzCrossTarget
  2026 -> EzZoned
  2027 -> EzMountFailed
  2028 -> EzUmountFailed
  2029 -> EzUnshareNfsFailed
  2030 -> EzShareNfsFailed
  2031 -> EzPerm
  2032 -> EzNoSpc
  2033 -> EzFault
  2034 -> EzIO
  2035 -> EzIntr
  2036 -> EzIsSpare
  2037 -> EzInvalConfig
  2038 -> EzRecursive
  2039 -> EzNoHistory
  2040 -> EzPoolProps
  2041 -> EzPoolNotSup
  2042 -> EzPoolInvalArg
  _ -> error (show errno)

-- Evaluate errno and throw an error
yieldZError :: LibzfsHandlePtr -> IO (Either ZError a)
yieldZError z = do
  errno <- libzfs_errno z
  return $ Left $ errnoToZError errno