planCreateObj generates an object construction Interpretable.
(expr ast.Expr)
| 588 | |
| 589 | // planCreateObj generates an object construction Interpretable. |
| 590 | func (p *planBuilder) planCreateStruct(expr ast.Expr) (InterpretableV2, error) { |
| 591 | obj := expr.AsStruct() |
| 592 | typeName, defined := p.resolveTypeName(obj.TypeName()) |
| 593 | if !defined { |
| 594 | return nil, fmt.Errorf("unknown type: %s", obj.TypeName()) |
| 595 | } |
| 596 | objFields := obj.Fields() |
| 597 | optionals := make([]bool, len(objFields)) |
| 598 | fields := make([]string, len(objFields)) |
| 599 | vals := make([]InterpretableV2, len(objFields)) |
| 600 | hasOptionals := false |
| 601 | for i, f := range objFields { |
| 602 | field := f.AsStructField() |
| 603 | fields[i] = field.Name() |
| 604 | val, err := p.plan(field.Value()) |
| 605 | if err != nil { |
| 606 | return nil, err |
| 607 | } |
| 608 | vals[i] = val |
| 609 | optionals[i] = field.IsOptional() |
| 610 | hasOptionals = hasOptionals || field.IsOptional() |
| 611 | } |
| 612 | return &evalObj{ |
| 613 | id: expr.ID(), |
| 614 | typeName: typeName, |
| 615 | fields: fields, |
| 616 | vals: vals, |
| 617 | optionals: optionals, |
| 618 | hasOptionals: hasOptionals, |
| 619 | provider: p.provider, |
| 620 | }, nil |
| 621 | } |
| 622 | |
| 623 | // planComprehension generates an Interpretable fold operation. |
| 624 | func (p *planBuilder) planComprehension(expr ast.Expr) (InterpretableV2, error) { |
no test coverage detected