MCPcopy Create free account
hub / github.com/cel-expr/cel-cpp / DoEvaluate

Method DoEvaluate

eval/eval/create_list_step.cc:71–122  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

69}
70
71absl::Status CreateListStep::DoEvaluate(ExecutionFrame* frame,
72 Value* result) const {
73 auto args = frame->value_stack().GetSpan(list_size_);
74
75 for (const auto& arg : args) {
76 if (arg.IsError()) {
77 *result = arg;
78 return absl::OkStatus();
79 }
80 }
81
82 if (frame->enable_unknowns()) {
83 absl::optional<UnknownValue> unknown_set =
84 frame->attribute_utility().IdentifyAndMergeUnknowns(
85 args, frame->value_stack().GetAttributeSpan(list_size_),
86 /*use_partial=*/true);
87 if (unknown_set.has_value()) {
88 *result = std::move(*unknown_set);
89 return absl::OkStatus();
90 }
91 }
92
93 ListValueBuilderPtr builder = NewListValueBuilder(frame->arena());
94 builder->Reserve(args.size());
95
96 for (size_t i = 0; i < args.size(); ++i) {
97 const auto& arg = args[i];
98 if (optional_indices_.contains(static_cast<int32_t>(i))) {
99 if (auto optional_arg = arg.AsOptional(); optional_arg) {
100 if (!optional_arg->HasValue()) {
101 continue;
102 }
103 Value optional_arg_value;
104 optional_arg->Value(&optional_arg_value);
105 if (optional_arg_value.IsError()) {
106 // Error should never be in optional, but better safe than sorry.
107 *result = std::move(optional_arg_value);
108 return absl::OkStatus();
109 }
110 CEL_RETURN_IF_ERROR(builder->Add(std::move(optional_arg_value)));
111 } else {
112 *result = cel::TypeConversionError(arg.GetTypeName(), "optional_type");
113 return absl::OkStatus();
114 }
115 } else {
116 CEL_RETURN_IF_ERROR(builder->Add(arg));
117 }
118 }
119
120 *result = std::move(*builder).Build();
121 return absl::OkStatus();
122}
123
124absl::flat_hash_set<int32_t> MakeOptionalIndicesSet(
125 const cel::ListExpr& create_list_expr) {

Callers

nothing calls this directly

Calls 15

TypeConversionErrorFunction · 0.85
GetSpanMethod · 0.80
GetAttributeSpanMethod · 0.80
HasValueMethod · 0.80
IsErrorMethod · 0.45
enable_unknownsMethod · 0.45
has_valueMethod · 0.45
arenaMethod · 0.45
ReserveMethod · 0.45
sizeMethod · 0.45
AsOptionalMethod · 0.45

Tested by

no test coverage detected