diff options
author | Lassi Pulkkinen <lassi@pulk.fi> | 2024-10-31 03:11:21 +0200 |
---|---|---|
committer | Lassi Pulkkinen <lassi@pulk.fi> | 2024-10-31 03:51:35 +0200 |
commit | ae44478b30d890fe0fb04022f44d474dcdcc3f9d (patch) | |
tree | 5f462459ae4b47d22114eed717d1382d08cf4dfe /image/png/errors.ha |
Diffstat (limited to 'image/png/errors.ha')
-rw-r--r-- | image/png/errors.ha | 35 |
1 files changed, 35 insertions, 0 deletions
diff --git a/image/png/errors.ha b/image/png/errors.ha new file mode 100644 index 0000000..8f41ddb --- /dev/null +++ b/image/png/errors.ha @@ -0,0 +1,35 @@ +use errors; +use io; + +// Invalid PNG data was encountered. +export type invalid = !void; + +// PNG data using unsupported features was encountered. +export type unsupported = !void; + +// All errors which could be returned from this module. +export type error = !(io::error | invalid | unsupported); + +// Returns a human-friendly error string. +export fn strerror(err: error) const str = { + match (err) { + case let err: io::error => + return io::strerror(err); + case invalid => + return "Invalid PNG format"; + case unsupported => + return "Provided PNG file requires unsupported features"; + }; +}; + +fn wraperror(err: (invalid | unsupported)) errors::opaque_ = { + static assert(size((invalid | unsupported)) <= size(errors::opaque_data)); + let wrapped = errors::opaque_ { strerror = &opaque_strerror, ... }; + let ptr = &wrapped.data: *error; + *ptr = err; + return wrapped; +}; + +fn opaque_strerror(err: *errors::opaque_data) const str = { + return strerror(*(err: *(invalid | unsupported))); +}; |