summaryrefslogtreecommitdiff
path: root/image/png/errors.ha
blob: 8f41ddbf4e2aac2eb8a164d4661a7e5b3c1b3ca3 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
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)));
};