func()

in wstl1/mapping_engine/mapping/mapping.go [59:139]


func (w Whistler) EvaluateMapping(m *mappb.FieldMapping, args []jsonutil.JSONMetaNode, output *jsonutil.JSONToken, pctx *types.Context) error {
	if m.Condition != nil {
		var cb bool
		var err error
		if cb, err = checkCondition(m.Condition, args, output, pctx, w.accessor); err != nil {
			return errs.Wrap(errs.NewProtoLocation(m.Condition, m), err)
		}
		if !cb {
			return nil
		}
	}

	var src jsonutil.JSONMetaNode
	var err error
	if src, err = EvaluateValueSource(m.ValueSource, args, *output, pctx, w.accessor); err != nil {
		return errs.Wrap(errs.NewProtoLocation(m.ValueSource, m), err)
	}

	srcToken, err := jsonutil.NodeToToken(src)
	if err != nil {
		return err
	}
	srcToken = postProcessValue(srcToken)

	// Skip nil-check if target is var, since we still want to define the var even assign nil to it.
	// Once the var is used, and written to something else that isn't a var, that's when nil-check
	// will happen on this value.
	if _, isVar := m.Target.(*mappb.FieldMapping_TargetLocalVar); !isVar && isNil(srcToken) {
		return nil
	}

	// No target field defaults to self.
	if m.Target == nil {
		m.Target = &mappb.FieldMapping_TargetField{TargetField: ""}
	}

	iterateSrc := isSrcIteratable(m.ValueSource)

	switch t := m.Target.(type) {
	case *mappb.FieldMapping_TargetField:
		if err := writeField(srcToken, t.TargetField, output, false, iterateSrc, w.accessor); err != nil {
			return fmt.Errorf("could not write field %q: %v", t.TargetField, err)
		}
		return nil
	case *mappb.FieldMapping_TargetLocalVar:
		cval, name, err := getVar(t.TargetLocalVar, pctx)
		// Undefined var errors are safe to ignore here.
		if _, ok := err.(undefinedVarError); !ok && err != nil {
			return err
		}

		if cval != nil {
			cval = jsonutil.Deepcopy(cval)
		}

		field := strings.TrimPrefix(strings.TrimPrefix(t.TargetLocalVar, name), ".")
		// For variables, we allow to overwrite them without "!" except for array appending.
		forceOverwrite := !isSelectorArray(field)

		if err := writeField(srcToken, field, &cval, forceOverwrite, iterateSrc, w.accessor); err != nil {
			return err
		}

		err = pctx.Variables.Set(name, &cval)
		if err != nil {
			return fmt.Errorf("error setting var %q: %v", t.TargetLocalVar, err)
		}

		return nil
	case *mappb.FieldMapping_TargetObject:
		addObject(srcToken, t.TargetObject, pctx)
		return nil
	case *mappb.FieldMapping_TargetRootField:
		if err := writeField(srcToken, t.TargetRootField, pctx.Output, false, iterateSrc, w.accessor); err != nil {
			return fmt.Errorf("could not write root field %q: %v", t.TargetRootField, err)
		}
		return nil
	default:
		return fmt.Errorf("unknown target %T", m.Target)
	}
}