errors.odin 2.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  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 := ferr.(Platform_Error) or_else {}
  48. return v.err, v.err != 0
  49. }
  50. error_string :: proc(ferr: Error) -> string {
  51. switch ferr {
  52. case nil: return ""
  53. case .Invalid_Argument: return "invalid argument"
  54. case .Permission_Denied: return "permission denied"
  55. case .Exist: return "file already exists"
  56. case .Not_Exist: return "file does not exist"
  57. case .Closed: return "file already closed"
  58. case .Timeout: return "i/o timeout"
  59. case .EOF: return "eof"
  60. case .Unexpected_EOF: return "unexpected eof"
  61. case .Short_Write: return "short write"
  62. case .Invalid_Write: return "invalid write result"
  63. case .Short_Buffer: return "short buffer"
  64. case .No_Progress: return "multiple read calls return no data or error"
  65. case .Invalid_Whence: return "invalid whence"
  66. case .Invalid_Offset: return "invalid offset"
  67. case .Invalid_Unread: return "invalid unread"
  68. case .Negative_Read: return "negative read"
  69. case .Negative_Write: return "negative write"
  70. case .Negative_Count: return "negative count"
  71. case .Buffer_Full: return "buffer full"
  72. }
  73. if errno, ok := is_platform_error(ferr); ok {
  74. return _error_string(errno)
  75. }
  76. return "unknown error"
  77. }