Coverage Report

Created: 2025-11-29 07:01

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/proc/self/cwd/internal/status_builder.h
Line
Count
Source
1
// Copyright 2021 Google LLC
2
//
3
// Licensed under the Apache License, Version 2.0 (the "License");
4
// you may not use this file except in compliance with the License.
5
// You may obtain a copy of the License at
6
//
7
//     https://www.apache.org/licenses/LICENSE-2.0
8
//
9
// Unless required by applicable law or agreed to in writing, software
10
// distributed under the License is distributed on an "AS IS" BASIS,
11
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
// See the License for the specific language governing permissions and
13
// limitations under the License.
14
15
#ifndef THIRD_PARTY_CEL_CPP_INTERNAL_STATUS_BUILDER_H_
16
#define THIRD_PARTY_CEL_CPP_INTERNAL_STATUS_BUILDER_H_
17
18
#include <type_traits>
19
#include <utility>
20
21
#include "absl/base/attributes.h"
22
#include "absl/status/status.h"
23
24
namespace cel::internal {
25
26
class StatusBuilder;
27
28
template <typename Fn, typename Arg, typename Expected>
29
inline constexpr bool StatusBuilderResultMatches =
30
    std::is_same_v<std::decay_t<std::invoke_result_t<Fn, Arg>>, Expected>;
31
32
template <typename Adaptor, typename Builder>
33
using StatusBuilderPurePolicy = std::enable_if_t<
34
    StatusBuilderResultMatches<Adaptor, Builder, StatusBuilder>,
35
    std::invoke_result_t<Adaptor, Builder>>;
36
37
template <typename Adaptor, typename Builder>
38
using StatusBuilderSideEffect =
39
    std::enable_if_t<StatusBuilderResultMatches<Adaptor, Builder, absl::Status>,
40
                     std::invoke_result_t<Adaptor, Builder>>;
41
42
template <typename Adaptor, typename Builder>
43
using StatusBuilderConversion = std::enable_if_t<
44
    !StatusBuilderResultMatches<Adaptor, Builder, StatusBuilder> &&
45
        !StatusBuilderResultMatches<Adaptor, Builder, absl::Status>,
46
    std::invoke_result_t<Adaptor, Builder>>;
47
48
class StatusBuilder final {
49
 public:
50
  StatusBuilder() = default;
51
52
1.41M
  explicit StatusBuilder(const absl::Status& status) : status_(status) {}
53
54
  StatusBuilder(const StatusBuilder&) = default;
55
56
  StatusBuilder(StatusBuilder&&) = default;
57
58
1.41M
  ~StatusBuilder() = default;
59
60
  StatusBuilder& operator=(const StatusBuilder&) = default;
61
62
  StatusBuilder& operator=(StatusBuilder&&) = default;
63
64
1.41M
  bool ok() const { return status_.ok(); }
65
66
0
  absl::StatusCode code() const { return status_.code(); }
67
68
0
  operator absl::Status() const& { return status_; }  // NOLINT
69
70
0
  operator absl::Status() && { return std::move(status_); }  // NOLINT
71
72
  template <typename Adaptor>
73
  auto With(
74
      Adaptor&& adaptor) & -> StatusBuilderPurePolicy<Adaptor, StatusBuilder&> {
75
    return std::forward<Adaptor>(adaptor)(*this);
76
  }
77
  template <typename Adaptor>
78
  ABSL_MUST_USE_RESULT auto With(
79
      Adaptor&&
80
          adaptor) && -> StatusBuilderPurePolicy<Adaptor, StatusBuilder&&> {
81
    return std::forward<Adaptor>(adaptor)(std::move(*this));
82
  }
83
84
  template <typename Adaptor>
85
  auto With(
86
      Adaptor&& adaptor) & -> StatusBuilderSideEffect<Adaptor, StatusBuilder&> {
87
    return std::forward<Adaptor>(adaptor)(*this);
88
  }
89
  template <typename Adaptor>
90
  ABSL_MUST_USE_RESULT auto With(
91
      Adaptor&&
92
          adaptor) && -> StatusBuilderSideEffect<Adaptor, StatusBuilder&&> {
93
    return std::forward<Adaptor>(adaptor)(std::move(*this));
94
  }
95
96
  template <typename Adaptor>
97
  auto With(
98
      Adaptor&& adaptor) & -> StatusBuilderConversion<Adaptor, StatusBuilder&> {
99
    return std::forward<Adaptor>(adaptor)(*this);
100
  }
101
  template <typename Adaptor>
102
  ABSL_MUST_USE_RESULT auto With(
103
      Adaptor&&
104
          adaptor) && -> StatusBuilderConversion<Adaptor, StatusBuilder&&> {
105
    return std::forward<Adaptor>(adaptor)(std::move(*this));
106
  }
107
108
 private:
109
  absl::Status status_;
110
};
111
112
}  // namespace cel::internal
113
114
#endif  // THIRD_PARTY_CEL_CPP_INTERNAL_STATUS_BUILDER_H_