File: opaque.ha

package info (click to toggle)
hare 0.26.0-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 7,352 kB
  • sloc: asm: 1,374; makefile: 123; sh: 117; lisp: 101
file content (41 lines) | stat: -rw-r--r-- 1,456 bytes parent folder | download
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
36
37
38
39
40
41
// SPDX-License-Identifier: MPL-2.0
// (c) Hare authors <https://harelang.org>

// An "opaque" error is used as a portable error type for an underlying error
// which is implementation-specific. It provides a function which can be used to
// produce a string describing the error, and a small storage area for arbitrary
// implementation-specific storage.
//
// The following example shows the usage of this type for custom errors:
//
// 	fn wraperror(err: myerror) error::opaque_ = {
// 		static assert(size(myerror) <= size(errors::opaque_data));
// 		let wrapped = errors::opaque_ { strerror = &opaque_strerror, ... };
// 		let myptr = &wrapped.data: *myerror;
// 		*myptr = err;
// 		return wrapped;
// 	};
//
// 	fn opaque_strerror(err: *errors::opaque_data) const str = {
// 		let ptr = &err: *myerr;
// 		return strerror(*ptr);
// 	};
//
// It is often useful to offer a function which unwraps an opaque error into
// your module's domain-specific error type, like so:
//
// 	export fn unwraperror(err: errors::opaque_) (myerror | void) = {
// 		if (err.strerror != &opaque_strerror) {
// 			return;
// 		};
// 		return *(&err.data: *myerror);
// 	};
export type opaque_ = !struct {
	strerror: *fn(op: *opaque_data) const str,
	data: opaque_data,
};

// Up to 24 bytes of arbitrary data that the opaque error type may use for
// domain-specific storage. The data is properly aligned (8 bytes) for any Hare
// type.
export type opaque_data = [3]u64;