// errors — error type (a string) and a few sentinels. Plan 9 model: // the empty string means OK, a non-empty string is the message. type error = str; def eEOF: error = "eof"; def eShortRead: error = "short read"; def eShortWrite: error = "short write"; def eClosed: error = "closed"; def eInvalid: error = "invalid argument"; def ePerm: error = "permission denied"; def eNotFound: error = "not found"; def eExists: error = "already exists"; export fn isnil(e: error) bool = { return e.len == 0; }; // is — compare an error against a sentinel (or any other error). Pure // byte equality; same shape as strings.equal but kept here so callers // don't have to pull in strings just to compare. export fn is(e: error, want: error) bool = { if (e.len != want.len) { return false; }; let i: i32 = 0; for (i < e.len) { if (e[i] != want[i]) { return false; }; i += 1; }; return true; };