@@ -680,30 +680,28 @@ private IntermediateResult evalType(ExecutionFrame frame, CelCall callExpr)
680
680
681
681
private IntermediateResult evalOptionalOr (ExecutionFrame frame , CelCall callExpr )
682
682
throws CelEvaluationException {
683
- CelExpr lhsExpr = callExpr .target ().get ();
684
- IntermediateResult lhsResult = evalInternal (frame , lhsExpr );
685
- if (!(lhsResult .value () instanceof Optional )) {
686
- throw CelEvaluationExceptionBuilder .newBuilder (
687
- "expected optional value, found: %s" , lhsResult .value ())
688
- .setErrorCode (CelErrorCode .INVALID_ARGUMENT )
689
- .setMetadata (metadata , lhsExpr .id ())
690
- .build ();
691
- }
692
-
693
- Optional <?> lhsOptionalValue = (Optional <?>) lhsResult .value ();
694
-
695
- if (lhsOptionalValue .isPresent ()) {
696
- // Short-circuit lhs if a value exists
697
- return lhsResult ;
698
- }
699
-
700
- return evalInternal (frame , callExpr .args ().get (0 ));
683
+ return evalOptionalOrInternal (frame , callExpr , /* unwrapOptional= */ false );
701
684
}
702
685
703
686
private IntermediateResult evalOptionalOrValue (ExecutionFrame frame , CelCall callExpr )
704
687
throws CelEvaluationException {
705
- CelExpr lhsExpr = callExpr .target ().get ();
688
+ return evalOptionalOrInternal (frame , callExpr , /* unwrapOptional= */ true );
689
+ }
690
+
691
+ private IntermediateResult evalOptionalOrInternal (
692
+ ExecutionFrame frame , CelCall callExpr , boolean unwrapOptional )
693
+ throws CelEvaluationException {
694
+ CelExpr lhsExpr =
695
+ callExpr
696
+ .target ()
697
+ .orElseThrow (
698
+ () -> new IllegalStateException ("Missing target for chained optional function" ));
706
699
IntermediateResult lhsResult = evalInternal (frame , lhsExpr );
700
+
701
+ if (isUnknownValue (lhsResult .value ())) {
702
+ return lhsResult ;
703
+ }
704
+
707
705
if (!(lhsResult .value () instanceof Optional )) {
708
706
throw CelEvaluationExceptionBuilder .newBuilder (
709
707
"expected optional value, found: %s" , lhsResult .value ())
@@ -716,7 +714,7 @@ private IntermediateResult evalOptionalOrValue(ExecutionFrame frame, CelCall cal
716
714
717
715
if (lhsOptionalValue .isPresent ()) {
718
716
// Short-circuit lhs if a value exists
719
- return IntermediateResult .create (lhsOptionalValue .get ());
717
+ return unwrapOptional ? IntermediateResult .create (lhsOptionalValue .get ()) : lhsResult ;
720
718
}
721
719
722
720
return evalInternal (frame , callExpr .args ().get (0 ));
0 commit comments