cppfig 0.1.0
Modern C++20 compile-time type-safe configuration library
Loading...
Searching...
No Matches
status.h
Go to the documentation of this file.
1#pragma once
2
3#include <cassert>
4#include <cstdint>
5#include <string>
6#include <string_view>
7#include <type_traits>
8#include <utility>
9#include <variant>
10
11namespace cppfig {
12
14enum class StatusCode : std::uint8_t {
15 kOk = 0,
19};
20
25class Status {
26public:
28 Status() = default;
29
32 : code_(code)
33 , message_(std::move(message))
34 {
35 }
36
38 [[nodiscard]] auto ok() const noexcept -> bool { return code_ == StatusCode::kOk; }
39
41 [[nodiscard]] auto code() const noexcept -> StatusCode { return code_; }
42
44 [[nodiscard]] auto message() const noexcept -> std::string_view { return message_; }
45
46private:
48 std::string message_;
49};
50
51// Factory functions
52
54[[nodiscard]] inline auto OkStatus() -> Status { return {}; }
55
57[[nodiscard]] inline auto NotFoundError(std::string message) -> Status
58{
59 return { StatusCode::kNotFound, std::move(message) };
60}
61
63[[nodiscard]] inline auto InvalidArgumentError(std::string message) -> Status
64{
65 return { StatusCode::kInvalidArgument, std::move(message) };
66}
67
69[[nodiscard]] inline auto InternalError(std::string message) -> Status
70{
71 return { StatusCode::kInternal, std::move(message) };
72}
73
74// Status-code checkers
75
77[[nodiscard]] inline auto IsNotFound(const Status& status) noexcept -> bool
78{
79 return status.code() == StatusCode::kNotFound;
80}
81
83[[nodiscard]] inline auto IsInvalidArgument(const Status& status) noexcept -> bool
84{
85 return status.code() == StatusCode::kInvalidArgument;
86}
87
89[[nodiscard]] inline auto IsInternal(const Status& status) noexcept -> bool
90{
91 return status.code() == StatusCode::kInternal;
92}
93
101template <typename T>
102class StatusOr {
103 static_assert(!std::is_same_v<T, Status>, "StatusOr<Status> is not allowed");
104
105public:
107 StatusOr(T value) // NOLINT(google-explicit-constructor)
108 : storage_(std::move(value))
109 {
110 }
111
120 StatusOr(Status status) // NOLINT(google-explicit-constructor)
121 : storage_(std::move(status))
122 {
123 assert(!std::get<Status>(storage_).ok() && "StatusOr must not be constructed from an OK status");
124 }
125
127 [[nodiscard]] auto ok() const noexcept -> bool { return std::holds_alternative<T>(storage_); }
128
132 [[nodiscard]] auto status() const& -> Status
133 {
134 if (ok()) {
135 return OkStatus();
136 }
137 return std::get<Status>(storage_);
138 }
139
141 [[nodiscard]] auto status() && -> Status
142 {
143 if (ok()) {
144 return OkStatus();
145 }
146 return std::get<Status>(std::move(storage_));
147 }
148
152 [[nodiscard]] auto value() const& -> const T& { return std::get<T>(storage_); }
153
157 [[nodiscard]] auto value() && -> T&& { return std::get<T>(std::move(storage_)); }
158
160 [[nodiscard]] auto operator*() const& -> const T& { return value(); }
161
163 [[nodiscard]] auto operator*() && -> T&& { return std::move(*this).value(); }
164
166 [[nodiscard]] auto operator->() const -> const T* { return &value(); }
167
168private:
169 std::variant<Status, T> storage_;
170};
171
172} // namespace cppfig
A value-or-error type, similar to std::expected (C++23).
Definition status.h:102
auto status() &&-> Status
Returns the error status (move).
Definition status.h:141
StatusOr(T value)
Constructs a StatusOr holding a value (implicit conversion).
Definition status.h:107
auto operator->() const -> const T *
Arrow operator for member access on the stored value.
Definition status.h:166
auto operator*() const &-> const T &
Dereferences to the stored value (const).
Definition status.h:160
auto value() &&-> T &&
Returns an rvalue reference to the value.
Definition status.h:157
auto value() const &-> const T &
Returns a const reference to the value.
Definition status.h:152
auto status() const &-> Status
Returns the error status.
Definition status.h:132
StatusOr(Status status)
Constructs a StatusOr holding an error status.
Definition status.h:120
auto operator*() &&-> T &&
Dereferences to the stored value (move).
Definition status.h:163
auto ok() const noexcept -> bool
Returns true if a value is present (no error).
Definition status.h:127
A lightweight status object carrying an error code and message.
Definition status.h:25
Status()=default
Constructs an OK status.
auto code() const noexcept -> StatusCode
Returns the error code.
Definition status.h:41
auto ok() const noexcept -> bool
Returns true if the status represents success.
Definition status.h:38
auto message() const noexcept -> std::string_view
Returns the error message (empty for OK status).
Definition status.h:44
Status(StatusCode code, std::string message)
Constructs a status with the given code and message.
Definition status.h:31
C++20 compile-time type-safe configuration library.
Definition conf.h:17
auto IsInternal(const Status &status) noexcept -> bool
Returns true if the status has code kInternal.
Definition status.h:89
StatusCode
Error codes used by cppfig operations.
Definition status.h:14
auto NotFoundError(std::string message) -> Status
Returns a NotFound error status.
Definition status.h:57
auto IsInvalidArgument(const Status &status) noexcept -> bool
Returns true if the status has code kInvalidArgument.
Definition status.h:83
auto IsNotFound(const Status &status) noexcept -> bool
Returns true if the status has code kNotFound.
Definition status.h:77
auto InternalError(std::string message) -> Status
Returns an Internal error status.
Definition status.h:69
auto OkStatus() -> Status
Returns an OK status.
Definition status.h:54
auto InvalidArgumentError(std::string message) -> Status
Returns an InvalidArgument error status.
Definition status.h:63