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))); };