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
}