summaryrefslogtreecommitdiff
path: root/image/png/errors.ha
diff options
context:
space:
mode:
Diffstat (limited to 'image/png/errors.ha')
-rw-r--r--image/png/errors.ha35
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)));
+};