File: error.ha

package info (click to toggle)
hare 0.25.2-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 6,948 kB
  • sloc: asm: 1,264; makefile: 123; sh: 114; lisp: 101
file content (62 lines) | stat: -rw-r--r-- 1,617 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
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
// SPDX-License-Identifier: MPL-2.0
// (c) Hare authors <https://harelang.org>

use fmt;
use fs;
use io;
use time::chrono;

// All possible errors returned from this module.
export type error = !(
	invalid
	| insufficient
	| zfunresolved
	| parsefail
	| invalidtzif
	| tzdberror
	| chrono::tscmismatch
);

// Converts an [[error]] into a human-friendly string. The result may be
// statically allocated.
export fn strerror(err: error) const str = {
	static let buf: [92]u8 = [0...];
	match (err) {
	case insufficient =>
		return "Insufficient date information";
	case invalid =>
		return "Invalid date information";
	case let e: zfunresolved =>
		switch (e) {
		case zferror::GAP =>
			return "Failed to resolve zone-offset in a timezone transition overlap";
		case zferror::LAP =>
			return "Failed to resolve zone-offset in a timezone transition gap";
		};
	case let pf: parsefail =>
		const (bi, rn) = pf;
		def FMTMSG = "Date parsing failure for layout rune '{}' at byteindex {}";
		static let buf: [len(FMTMSG) + 3]u8 = [0...];
		return fmt::bsprintf(buf, FMTMSG, rn, bi)!;
	case invalidtzif =>
		return "Invalid TZif data";
	case let err: tzdberror =>
		static let buf: [1024]u8 = [0...];
		match (err) {
		case let err: fs::error =>
			return fmt::bsprintf(buf,
				"Timezone database error: {}",
				fs::strerror(err),
			)!;
		case let err: io::error =>
			return fmt::bsprintf(buf,
				"Timezone database error: {}",
				io::strerror(err),
			)!;
		case invalidtzif =>
			return "Timezone database error: Invalid TZif data";
		};
	case let err: chrono::tscmismatch =>
		return chrono::strerror(err);
	};
};