acadia/lib/glacier/status/status.h

78 lines
1.9 KiB
C++

#pragma once
#include "glacier/status/error.h"
#include "glacier/string/string.h"
namespace glcr {
class Status {
public:
static Status Ok() { return {}; }
Status(ErrorCode code) : code_(code), message_() {}
Status(ErrorCode code, StringView message) : code_(code), message_(message) {}
explicit operator bool() const { return ok(); }
bool ok() const { return code_ == OK; }
ErrorCode code() const { return code_; }
StringView message() const { return message_; }
private:
ErrorCode code_;
String message_;
Status() : code_(OK) {}
};
inline Status InvalidArgument(StringView message) {
return Status(INVALID_ARGUMENT, message);
}
inline Status NotFound(StringView message) {
return Status(NOT_FOUND, message);
}
inline Status PermissionDenied(StringView message) {
return Status(PERMISSION_DENIED, message);
}
inline Status NullPtr(StringView message) { return Status(NULL_PTR, message); }
inline Status Empty(StringView message) { return Status(EMPTY, message); }
inline Status AlreadyExists(StringView message) {
return Status(ALREADY_EXISTS, message);
}
inline Status BufferSize(StringView message) {
return Status(BUFFER_SIZE, message);
}
inline Status FailedPrecondition(StringView message) {
return Status(FAILED_PRECONDITION, message);
}
inline Status Internal(StringView message) { return Status(INTERNAL, message); }
inline Status Unimplemented(StringView message) {
return Status(UNIMPLEMENTED, message);
}
inline Status Exhausted(StringView message) {
return Status(EXHAUSTED, message);
}
inline Status InvalidResponse(StringView message) {
return Status(INVALID_RESPONSE, message);
}
#define RETURN_ERROR(expr) \
{ \
glcr::Status _tmp_err = expr; \
if (!_tmp_err) { \
return _tmp_err; \
} \
}
} // namespace glcr