changed error handling

This commit is contained in:
Luna 2025-07-19 04:03:24 +02:00
parent 5cdd4f8835
commit 1d370096d9

View file

@ -4,14 +4,16 @@
#include <errno.h> #include <errno.h>
#include <print> #include <print>
#include <fcntl.h> #include <fcntl.h>
#include <expected>
namespace file_reader namespace file_reader
{ {
enum RESULT enum class RESULT
{ {
READ_CORRECT, //read was as expected READ_CORRECT, //read was as expected
READ_INCOMPLETE, //read is incomplete (probably because of the file ending) READ_INCOMPLETE, //read is incomplete (probably because of the file ending)
READ_FILE_ENDED //cannot read because there's not more file to read READ_FILE_ENDED, //cannot read because there's not more file to read
READ_FAILED
}; };
class file_reader class file_reader
@ -70,11 +72,11 @@ namespace file_reader
} }
int extra_size = 0; int extra_size = 0;
template<typename ...T> template<typename ...T>
std::pair<size_t, RESULT> read_from_tuple(std::tuple<T...> &in) std::expected<size_t, RESULT> read_from_tuple(std::tuple<T...> &in)
{ {
RESULT ret = READ_CORRECT; RESULT ret = RESULT::READ_CORRECT;
if (file_size_remaining <= 0 && buf.size <= 0) if (file_size_remaining <= 0 && buf.size <= 0)
return std::make_pair(0, READ_FILE_ENDED); return std::unexpected( RESULT::READ_FILE_ENDED);
constexpr std::size_t size_tuple = sizeof...(T); constexpr std::size_t size_tuple = sizeof...(T);
int size = 0; int size = 0;
@ -97,7 +99,7 @@ namespace file_reader
else if (file_size_remaining + buf.size > file_size_remaining + buf.size) else if (file_size_remaining + buf.size > file_size_remaining + buf.size)
{ {
extra_to_read = file_size_remaining + buf.size; extra_to_read = file_size_remaining + buf.size;
ret = READ_INCOMPLETE; ret = RESULT::READ_INCOMPLETE;
} }
char *new_read = (char *)calloc(size + extra_size, sizeof(char)); char *new_read = (char *)calloc(size + extra_size, sizeof(char));
total_read_size = extra_to_read + extra_size; total_read_size = extra_to_read + extra_size;
@ -116,7 +118,7 @@ namespace file_reader
if (res == 0) if (res == 0)
{ {
if (read_done != extra_to_read + extra_size) if (read_done != extra_to_read + extra_size)
ret = READ_INCOMPLETE; ret = RESULT::READ_INCOMPLETE;
total_read_size = read_done; total_read_size = read_done;
size = total_read_size; size = total_read_size;
break; break;
@ -135,15 +137,15 @@ namespace file_reader
read_comp(size_tuple, par_buf, in); read_comp(size_tuple, par_buf, in);
buf.size = prev_size; buf.size = prev_size;
buf.remove(0, size); buf.remove(0, size);
return std::make_pair(size, ret); return size;
} }
template <typename T> template <typename T>
std::pair<size_t, RESULT> read_buffer(T *buffer, int size) std::expected<size_t, RESULT> read_buffer(T *buffer, int size)
{ {
RESULT ret = READ_CORRECT; RESULT ret = RESULT::READ_CORRECT;
if (file_size_remaining <= 0 && buf.size <= 0) if (file_size_remaining <= 0 && buf.size <= 0)
return std::make_pair(0, READ_FILE_ENDED); return std::unexpected(RESULT::READ_FILE_ENDED);
size_t total_read_size = 0; size_t total_read_size = 0;
if (size > buf.size) if (size > buf.size)
{ {
@ -156,7 +158,7 @@ namespace file_reader
else if (file_size_remaining + buf.size > file_size_remaining + buf.size) else if (file_size_remaining + buf.size > file_size_remaining + buf.size)
{ {
extra_to_read = file_size_remaining + buf.size; extra_to_read = file_size_remaining + buf.size;
ret = READ_INCOMPLETE; ret = RESULT::READ_INCOMPLETE;
} }
char *new_read = (char *)calloc(size + extra_size, sizeof(char)); char *new_read = (char *)calloc(size + extra_size, sizeof(char));
total_read_size = extra_to_read + extra_size; total_read_size = extra_to_read + extra_size;
@ -175,7 +177,7 @@ namespace file_reader
if (res == 0) if (res == 0)
{ {
if (read_done != extra_to_read + extra_size) if (read_done != extra_to_read + extra_size)
ret = READ_INCOMPLETE; ret = RESULT::READ_INCOMPLETE;
total_read_size = read_done; total_read_size = read_done;
size = total_read_size; size = total_read_size;
break; break;
@ -187,7 +189,7 @@ namespace file_reader
} }
std::memcpy(buffer, buf.data, size); std::memcpy(buffer, buf.data, size);
buf.remove(0, size); buf.remove(0, size);
return std::make_pair(size, ret); return size;
} }
private: private:
buffer<char> buf; buffer<char> buf;