func()

in wstl1/mapping_language/transpiler/source.go [48:101]


func (t *transpiler) VisitSourceInput(ctx *parser.SourceInputContext) interface{} {
	// Parse the path.
	p := ctx.SourcePath().Accept(t).(pathSpec)

	if p.arg == "" && t.environment.name == "" {
		t.fail(ctx, fmt.Errorf("root mapping can't access source %q. It can only use vars or the input %q", p.index, rootEnvInputName))
	}

	if ctx.InlineFilter() != nil || ctx.ArrayMod() != nil {
		// Force a foreach.
		p.field = strings.TrimSuffix(p.field, "[]") + "[]"
	}

	var vs *mpb.ValueSource

	if (p.arg == "" && p.index != "") || ctx.DEST() != nil {
		// Index targets may not be known in the environment since they are not declared.
		vs = &mpb.ValueSource{
			Source: &mpb.ValueSource_FromDestination{
				FromDestination: p.index + p.arg + p.field,
			},
		}
	} else if vs = t.environment.readVar(p.arg+p.index, p.field); ctx.VAR() != nil && vs == nil {
		t.fail(ctx, fmt.Errorf("unable to find variable %q", p.arg))
	} else if vs = t.environment.readInput(p.arg+p.index, p.field); vs == nil {
		t.fail(ctx, fmt.Errorf("unable to find input %q", p.arg))
	}

	if ctx.InlineFilter() != nil {
		lambdaEnv := t.environment.newChild(fmt.Sprintf("$filter_%d_%d", ctx.GetStart().GetLine(), ctx.GetStart().GetColumn()), []string{foreachElementInputName}, []string{})
		t.pushEnv(lambdaEnv)
		t.environment.addMapping(&mpb.FieldMapping{
			Condition: ctx.InlineFilter().Accept(t).(*mpb.ValueSource),
			Target: &mpb.FieldMapping_TargetField{
				TargetField: ".",
			},
			ValueSource: t.environment.readInput("$", ""),
		})
		t.projectors = append(t.projectors, t.environment.generateProjector())
		t.popEnv()

		cs, err := lambdaEnv.generateCallsite(vs)
		if err != nil {
			t.fail(ctx, fmt.Errorf("unable to generate filter callsite: %v", err))
		}
		if ctx.ArrayMod() != nil {
			cs.Projector += ctx.ArrayMod().GetText()
		}

		return cs
	}

	return vs
}