difftastic/vendored_parsers/tree-sitter-hare/example/opaque.ha

27 lines
958 B
Plaintext

// 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(error::opaque_data));
// let wrapped = opaque { strerror = &opaque_strerror, ... };
// let myptr = &wrapped.data: *myerror;
// *myptr = err;
// };
//
// fn opaque_strerror(err: *opaque_data) const str = {
// let ptr = &err: *myerr;
// return strerror(*ptr);
// };
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.
export type opaque_data = [24]u8;