#pragma once #include #include namespace flog { template class PushResult { public: NODISCARD static PushResult success() noexcept { return PushResult(); } NODISCARD static PushResult failWithValue(T value) noexcept { return PushResult(std::move(std::optional(std::move(value)))); } NODISCARD bool isSuccessful() const noexcept { return !m_value.has_value(); } NODISCARD bool isFail() const noexcept { return m_value.has_value(); } void getValueIfFail(const std::function func) const { if (isFail()) { func(m_value.value()); } } NODISCARD T getValue() const { return m_value.value(); } PushResult(const PushResult &other) noexcept { m_value = other.m_value; } private: PushResult() noexcept = default; explicit PushResult(std::optional value) noexcept : m_value(std::move(value)) {} const std::optional m_value = std::nullopt; }; }