aboutsummaryrefslogtreecommitdiff
path: root/core/os/os2/errors.odin
blob: 8dcfe8dd05f79fa0c18203ebfc68ea61ecfe8150 (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
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
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
package os2

import "core:io"

General_Error :: enum u32 {
	Invalid_Argument,

	Permission_Denied,
	Exist,
	Not_Exist,
	Closed,

	Timeout,
}

Platform_Error :: struct {
	err: i32,
}

Error :: union {
	General_Error,
	io.Error,
	Platform_Error,
}
#assert(size_of(Error) == size_of(u64));

Path_Error :: struct {
	op:   string,
	path: string,
	err:  Error,
}

Link_Error :: struct {
	op:  string,
	old: string,
	new: string,
	err: Error,
}

path_error_delete :: proc(perr: Maybe(Path_Error)) {
	if err, ok := perr.?; ok {
		context.allocator = error_allocator();
		delete(err.op);
		delete(err.path);
	}
}

link_error_delete :: proc(lerr: Maybe(Link_Error)) {
	if err, ok := lerr.?; ok {
		context.allocator = error_allocator();
		delete(err.op);
		delete(err.old);
		delete(err.new);
	}
}



is_platform_error :: proc(ferr: Error) -> (err: i32, ok: bool) {
	v := ferr.(Platform_Error) or_else {};
	return v.err, v.err != 0;
}


error_string :: proc(ferr: Error) -> string {
	switch ferr {
	case nil:                return "";
	case .Invalid_Argument:  return "invalid argument";
	case .Permission_Denied: return "permission denied";
	case .Exist:             return "file already exists";
	case .Not_Exist:         return "file does not exist";
	case .Closed:            return "file already closed";
	case .Timeout:           return "i/o timeout";
	case .EOF:               return "eof";
	case .Unexpected_EOF:    return "unexpected eof";
	case .Short_Write:       return "short write";
	case .Invalid_Write:     return "invalid write result";
	case .Short_Buffer:      return "short buffer";
	case .No_Progress:       return "multiple read calls return no data or error";
	case .Invalid_Whence:    return "invalid whence";
	case .Invalid_Offset:    return "invalid offset";
	case .Invalid_Unread:    return "invalid unread";
	case .Negative_Read:     return "negative read";
	case .Negative_Write:    return "negative write";
	case .Negative_Count:    return "negative count";
	case .Buffer_Full:       return "buffer full";
	}

	if errno, ok := is_platform_error(ferr); ok {
		return _error_string(errno);
	}

	return "unknown error";
}