di 0.1.0
Loading...
Searching...
No Matches
string_error.h
Go to the documentation of this file.
1#pragma once
2
9#include "di/format/format.h"
12#include "di/format/prelude.h"
14#include "di/platform/prelude.h"
15#include "di/types/prelude.h"
21
22namespace di::vocab {
24public:
25 StringError() = default;
26
27 constexpr explicit StringError(String value) : m_value(di::make_box<String>(di::move(value))) {}
28
29 constexpr auto empty() const { return !m_value; }
30
31 constexpr auto operator==(StringError const& other) const -> bool {
32 if (this->empty() != other.empty()) {
33 return false;
34 }
35 if (this->empty()) {
36 return true;
37 }
38 return *this->m_value == *other.m_value;
39 }
40
41 auto erased() const -> ErasedString {
42 if (!m_value) {
43 return "Success"_sv;
44 }
45 // TODO: use a reference counted string instead to avoid cloning().
46 return m_value->clone();
47 }
48
49private:
51 return true;
52 }
53
54 Box<String> m_value;
55};
56
57class StringErrorDomain;
58
60
61class StringErrorDomain final : public StatusCodeDomain {
62private:
63 using Base = StatusCodeDomain;
64
65public:
68
69 constexpr explicit StringErrorDomain(UniqueId id = 0x2b0b934342552b05) : Base(id) {}
70
73
74 auto operator=(StringErrorDomain const&) -> StringErrorDomain& = default;
76
77 constexpr static auto get() -> StringErrorDomain const&;
78
79 auto name() const -> container::ErasedString override { return container::ErasedString(u8"String Error Domain"); }
80
81 auto payload_info() const -> PayloadInfo override {
82 return { sizeof(Value), sizeof(Value) + sizeof(StatusCodeDomain const*),
83 container::max(alignof(Value), alignof(StatusCodeDomain const*)) };
84 }
85
86protected:
87 constexpr auto do_failure(vocab::StatusCode<void> const& code) const -> bool override {
88 auto const& value = down_cast(code);
89 return !value.value().empty();
90 }
91
92 constexpr auto do_equivalent(vocab::StatusCode<void> const& a, vocab::StatusCode<void> const& b) const
93 -> bool override {
94 DI_ASSERT(a.domain() == *this);
95 return b.domain() == *this && down_cast(a).value() == down_cast(b).value();
96 }
97
98 constexpr auto do_convert_to_generic(vocab::StatusCode<void> const& a) const -> vocab::GenericCode override {
99 DI_ASSERT(a.domain() == *this);
100 return a.failure() ? platform::BasicError::InvalidArgument : platform::BasicError::Success;
101 }
102
103 constexpr auto do_message(vocab::StatusCode<void> const& code) const -> container::ErasedString override {
104 DI_ASSERT(code.domain() == *this);
105 return down_cast(code).value().erased();
106 }
107
108 constexpr void do_erased_destroy(StatusCode<void>& code, size_t) const override { down_cast(code).value() = {}; }
109
110private:
111 template<typename Domain>
113
114 constexpr auto down_cast(vocab::StatusCode<void> const& code) const -> StringErrorCode const& {
115 DI_ASSERT(code.domain() == *this);
116 return static_cast<StringErrorCode const&>(code);
117 }
118
119 constexpr auto down_cast(vocab::StatusCode<void>& code) const -> StringErrorCode& {
120 DI_ASSERT(code.domain() == *this);
121 return static_cast<StringErrorCode&>(code);
122 }
123};
124
125constexpr inline auto error_domain = StringErrorDomain {};
126
127constexpr auto StringErrorDomain::get() -> StringErrorDomain const& {
128 return error_domain;
129}
130
134
135namespace detail {
136 struct FormatError {
137 using Enc = di::String::Encoding;
138
139 template<concepts::Formattable... Args>
140 constexpr static auto operator()(fmt::FormatStringImpl<Enc, Args...> format, Args&&... args)
141 -> StringErrorCode {
142 return StringError(
144 }
145 };
146}
147}
148
149namespace di {
152
153constexpr inline auto format_error = vocab::detail::FormatError {};
154}
#define DI_ASSERT(...)
Definition assert_bool.h:7
StringError()=default
Definition erased_string.h:21
Definition format_context.h:8
Definition box.h:28
constexpr StatusCodeDomain(UniqueId id)
Definition status_code_domain.h:29
constexpr auto id() const
Definition status_code_domain.h:12
u64 UniqueId
Definition status_code_domain.h:10
Definition status_code_forward_declaration.h:11
Definition string_error.h:61
auto operator=(StringErrorDomain const &) -> StringErrorDomain &=default
auto name() const -> container::ErasedString override
Definition string_error.h:79
static constexpr auto get() -> StringErrorDomain const &
Definition string_error.h:127
constexpr auto do_failure(vocab::StatusCode< void > const &code) const -> bool override
Definition string_error.h:87
auto payload_info() const -> PayloadInfo override
Definition string_error.h:81
constexpr void do_erased_destroy(StatusCode< void > &code, size_t) const override
Definition string_error.h:108
StringErrorDomain(StringErrorDomain const &)=default
friend class di::vocab::StatusCode
Definition string_error.h:112
auto operator=(StringErrorDomain &&) -> StringErrorDomain &=default
constexpr auto do_equivalent(vocab::StatusCode< void > const &a, vocab::StatusCode< void > const &b) const -> bool override
Definition string_error.h:92
constexpr StringErrorDomain(UniqueId id=0x2b0b934342552b05)
Definition string_error.h:69
StringErrorDomain(StringErrorDomain &&)=default
Base::UniqueId UniqueId
Definition string_error.h:67
constexpr auto do_message(vocab::StatusCode< void > const &code) const -> container::ErasedString override
Definition string_error.h:103
StringError Value
Definition string_error.h:66
constexpr auto do_convert_to_generic(vocab::StatusCode< void > const &a) const -> vocab::GenericCode override
Definition string_error.h:98
Definition string_error.h:23
auto erased() const -> ErasedString
Definition string_error.h:41
constexpr StringError(String value)
Definition string_error.h:27
constexpr friend auto tag_invoke(Tag< concepts::trivially_relocatable >, InPlaceType< StringError >) -> bool
Definition string_error.h:50
constexpr auto empty() const
Definition string_error.h:29
constexpr auto operator==(StringError const &other) const -> bool
Definition string_error.h:31
Definition formattable.h:9
Definition sequence.h:12
string::StringImpl< string::Utf8Encoding > String
Definition string.h:11
constexpr auto max
Definition max.h:49
detail::FormatStringImpl< Enc, meta::TypeIdentity< Args >... > FormatStringImpl
Definition format_string_impl.h:70
constexpr auto make_format_args(Types &&... values)
Definition make_format_args.h:9
constexpr auto vformat_encoded
Definition vformat_encoded.h:35
__UINT8_TYPE__ u8
Definition integers.h:9
di::meta::Decay< decltype(T)> Tag
Definition tag_invoke.h:28
Definition lazy.h:165
constexpr auto make_box
Definition box.h:171
StatusCode< platform::GenericDomain > GenericCode
Definition status_code_forward_declaration.h:13
vocab::StatusCode< StringErrorDomain > StringErrorCode
Definition string_error.h:59
constexpr auto error_domain
Definition string_error.h:125
Definition any_storable.h:9
constexpr auto format_error
Definition string_error.h:153
constexpr tag_invoke_detail::TagInvokeFn tag_invoke
Definition tag_invoke.h:22
constexpr auto format
Definition format.h:7
constexpr auto in_place
Definition in_place.h:8
Definition in_place_type.h:5
Definition status_code_domain.h:16