Exec implements the InterpretableV2 interface method.
(frame *ExecutionFrame)
| 938 | |
| 939 | // Exec implements the InterpretableV2 interface method. |
| 940 | func (fold *evalFold) Exec(frame *ExecutionFrame) ref.Val { |
| 941 | // Initialize the folder interface |
| 942 | f := newFolder(fold, frame) |
| 943 | defer releaseFolder(f) |
| 944 | |
| 945 | foldRange := fold.iterRange.Exec(frame) |
| 946 | if types.IsUnknownOrError(foldRange) { |
| 947 | return foldRange |
| 948 | } |
| 949 | if fold.iterVar2 != "" { |
| 950 | var foldable traits.Foldable |
| 951 | switch r := foldRange.(type) { |
| 952 | case traits.Mapper: |
| 953 | foldable = types.ToFoldableMap(r) |
| 954 | case traits.Lister: |
| 955 | foldable = types.ToFoldableList(r) |
| 956 | default: |
| 957 | return types.NewErrWithNodeID(fold.ID(), "unsupported comprehension range type: %T", foldRange) |
| 958 | } |
| 959 | foldable.Fold(f) |
| 960 | return f.evalResult() |
| 961 | } |
| 962 | |
| 963 | if !foldRange.Type().HasTrait(traits.IterableType) { |
| 964 | return types.ValOrErr(foldRange, "got '%T', expected iterable type", foldRange) |
| 965 | } |
| 966 | iterable := foldRange.(traits.Iterable) |
| 967 | return f.foldIterable(iterable) |
| 968 | } |
| 969 | |
| 970 | // Eval implements the Interpretable interface method. |
| 971 | func (fold *evalFold) Eval(ctx Activation) ref.Val { |
no test coverage detected