errors.odin 2.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  1. package os2
  2. import "core:io"
  3. General_Error :: enum u32 {
  4. Invalid_Argument,
  5. Permission_Denied,
  6. Exist,
  7. Not_Exist,
  8. Closed,
  9. Timeout,
  10. }
  11. Platform_Error :: struct {
  12. err: i32,
  13. }
  14. Error :: union {
  15. General_Error,
  16. io.Error,
  17. Platform_Error,
  18. }
  19. #assert(size_of(Error) == size_of(u64));
  20. Path_Error :: struct {
  21. op: string,
  22. path: string,
  23. err: Error,
  24. }
  25. Link_Error :: struct {
  26. op: string,
  27. old: string,
  28. new: string,
  29. err: Error,
  30. }
  31. path_error_delete :: proc(perr: Maybe(Path_Error)) {
  32. if err, ok := perr.?; ok {
  33. context.allocator = error_allocator();
  34. delete(err.op);
  35. delete(err.path);
  36. }
  37. }
  38. link_error_delete :: proc(lerr: Maybe(Link_Error)) {
  39. if err, ok := lerr.?; ok {
  40. context.allocator = error_allocator();
  41. delete(err.op);
  42. delete(err.old);
  43. delete(err.new);
  44. }
  45. }
  46. is_platform_error :: proc(ferr: Error) -> (err: i32, ok: bool) {
  47. v: Platform_Error;
  48. if v, ok = ferr.(Platform_Error); ok {
  49. err = v.err;
  50. }
  51. return;
  52. }
  53. error_string :: proc(ferr: Error) -> string {
  54. switch ferr {
  55. case nil: return "";
  56. case .Invalid_Argument: return "invalid argument";
  57. case .Permission_Denied: return "permission denied";
  58. case .Exist: return "file already exists";
  59. case .Not_Exist: return "file does not exist";
  60. case .Closed: return "file already closed";
  61. case .Timeout: return "i/o timeout";
  62. case .EOF: return "eof";
  63. case .Unexpected_EOF: return "unexpected eof";
  64. case .Short_Write: return "short write";
  65. case .Invalid_Write: return "invalid write result";
  66. case .Short_Buffer: return "short buffer";
  67. case .No_Progress: return "multiple read calls return no data or error";
  68. case .Invalid_Whence: return "invalid whence";
  69. case .Invalid_Offset: return "invalid offset";
  70. case .Invalid_Unread: return "invalid unread";
  71. case .Negative_Read: return "negative read";
  72. case .Negative_Write: return "negative write";
  73. case .Negative_Count: return "negative count";
  74. case .Buffer_Full: return "buffer full";
  75. }
  76. if errno, ok := is_platform_error(ferr); ok {
  77. return _error_string(errno);
  78. }
  79. return "unknown error";
  80. }