packages feed

i2c-bus-0.1.0: source-lib/I2C/Exception.hs

--------------------------------------------------------------------------------
-- | 
-- Module                  : I2C.Exception
-- SPDX-License-Identifier : MIT
-- Copyright               : karamellpelle@hotmail.com
-- Maintainer              : karamellpelle@hotmail.com
-- Stability               : experimental
--------------------------------------------------------------------------------
module I2C.Exception
(
    -- * Exception
    I2CErr (..),

    -- ** Utils 
    errI2C,
    fromIOException,
    showErrno,

) where

import Relude
import Relude.Extra.Newtype

import Foreign.C
import Foreign.C.Error (Errno)
import GHC.IO.Exception
import Text.Show qualified


--------------------------------------------------------------------------------
--  exception

-- | Exception type
data I2CErr = I2CErr Errno Text


instance Exception I2CErr where
    displayException = show


instance Show I2CErr where
    show (I2CErr errno text) = 
        "I2CErr " <> show (un @CInt errno) <> " " <> case text of
            "" -> toString $ showErrno errno
            _  -> toString $ text


-- | Create 'I2CErr' from 'Errno' and description
errI2C :: Errno -> Text -> I2CErr
errI2C = I2CErr

-- | Convert an 'IOException' to 'I2CErr'
fromIOException :: IOException -> I2CErr
fromIOException err = 
    errI2C (wrap @Errno $ ioe_errno err ?: 1) $ toText (displayException err)

-- | Convert 'Errno' to human readable name
showErrno :: Errno -> Text
showErrno errno = case un @CInt errno of
    -- linux/include/uapi/asm-generic/errno-base.h
    1   -> "Operation not permitted"
    2   -> "No such file or directory"
    3   -> "No such process"
    4   -> "Interrupted system call"
    5   -> "I/O error"
    6   -> "No such device or address"
    7   -> "Argument list too long"
    8   -> "Exec format error"
    9   -> "Bad file number"
    10  -> "No child processes"
    11  -> "Try again"
    12  -> "Out of memory"
    13  -> "Permission denied"
    14  -> "Bad address"
    15  -> "Block device required"
    16  -> "Device or resource busy"
    17  -> "File exists"
    18  -> "Cross-device link"
    19  -> "No such device"
    20  -> "Not a directory"
    21  -> "Is a directory"
    22  -> "Invalid argument"
    23  -> "File table overflow"
    24  -> "Too many open files"
    25  -> "Not a typewriter"
    26  -> "Text file busy"
    27  -> "File too large"
    28  -> "No space left on device"
    29  -> "Illegal seek"
    30  -> "Read-only file system"
    31  -> "Too many links"
    32  -> "Broken pipe"
    33  -> "Math argument out of domain of func"
    34  -> "Math result not representable"
    --  linux/include/uapi/asm-generic/errno.h
    35  -> "Resource deadlock would occur"
    36  -> "File name too long"
    37  -> "No record locks available"
    38  -> "Invalid system call number"
    39  -> "Directory not empty"
    40  -> "Too many symbolic links encountered"
    42  -> "No message of desired type"
    43  -> "Identifier removed"
    44  -> "Channel number out of range"
    45  -> "Level 2 not synchronized"
    46  -> "Level 3 halted"
    47  -> "Level 3 reset"
    48  -> "Link number out of range"
    49  -> "Protocol driver not attached"
    50  -> "No CSI structure available"
    51  -> "Level 2 halted"
    52  -> "Invalid exchange"
    53  -> "Invalid request descriptor"
    54  -> "Exchange full"
    55  -> "No anode"
    56  -> "Invalid request code"
    57  -> "Invalid slot"
    59  -> "Bad font file format"
    60  -> "Device not a stream"
    61  -> "No data available"
    62  -> "Timer expired"
    63  -> "Out of streams resources"
    64  -> "Machine is not on the network"
    65  -> "Package not installed"
    66  -> "Object is remote"
    67  -> "Link has been severed"
    68  -> "Advertise error"
    69  -> "Srmount error"
    70  -> "Communication error on send"
    71  -> "Protocol error"
    72  -> "Multihop attempted"
    73  -> "RFS specific error"
    74  -> "Not a data message"
    75  -> "Value too large for defined data type"
    76  -> "Name not unique on network"
    77  -> "File descriptor in bad state"
    78  -> "Remote address changed"
    79  -> "Can not access a needed shared library"
    80  -> "Accessing a corrupted shared library"
    81  -> ".lib section in a.out corrupted"
    82  -> "Attempting to link in too many shared libraries"
    83  -> "Cannot exec a shared library directly"
    84  -> "Illegal byte sequence"
    85  -> "Interrupted system call should be restarted"
    86  -> "Streams pipe error"
    87  -> "Too many users"
    88  -> "Socket operation on non-socket"
    89  -> "Destination address required"
    90  -> "Message too long"
    91  -> "Protocol wrong type for socket"
    92  -> "Protocol not available"
    93  -> "Protocol not supported"
    94  -> "Socket type not supported"
    95  -> "Operation not supported on transport endpoint"
    96  -> "Protocol family not supported"
    97  -> "Address family not supported by protocol"
    98  -> "Address already in use"
    99  -> "Cannot assign requested address"
    100 -> "Network is down"
    101 -> "Network is unreachable"
    102 -> "Network dropped connection because of reset"
    103 -> "Software caused connection abort"
    104 -> "Connection reset by peer"
    105 -> "No buffer space available"
    106 -> "Transport endpoint is already connected"
    107 -> "Transport endpoint is not connected"
    108 -> "Cannot send after transport endpoint shutdown"
    109 -> "Too many references: cannot splice"
    110 -> "Connection timed out"
    111 -> "Connection refused"
    112 -> "Host is down"
    113 -> "No route to host"
    114 -> "Operation already in progress"
    115 -> "Operation now in progress"
    116 -> "Stale file handle"
    117 -> "Structure needs cleaning"
    118 -> "Not a XENIX named type file"
    119 -> "No XENIX semaphores available"
    120 -> "Is a named type file"
    121 -> "Remote I/O error"
    122 -> "Quota exceeded"
    123 -> "No medium found"
    124 -> "Wrong medium type"
    125 -> "Operation Canceled"
    126 -> "Required key not available"
    127 -> "Key has expired"
    128 -> "Key has been revoked"
    129 -> "Key was rejected by service"
    130 -> "Owner died"
    131 -> "State not recoverable"
    132 -> "Operation not possible due to RF-kill"
    133 -> "Memory page has hardware error"
    n   -> show n