func newKvtGroup()

in plugins/wasm-go/extensions/transformer/main.go [1270:1382]


func newKvtGroup(rules []TransformRule, typ string) (g []kvtOperation, isChange bool, withMapKvt bool, err error) {
	g = []kvtOperation{}
	for _, r := range rules {
		var prams []Param
		switch typ {
		case "headers":
			prams = r.headers
		case "querys":
			prams = r.querys
		case "body":
			prams = r.body
		}

		var kvtOp kvtOperation
		switch r.operate {
		case "remove":
			kvtOp.kvtOpType = RemoveK
		case "rename":
			kvtOp.kvtOpType = RenameK
		case "map":
			kvtOp.kvtOpType = MapK
		case "replace":
			kvtOp.kvtOpType = ReplaceK
		case "dedupe":
			kvtOp.kvtOpType = DedupeK
		case "add":
			kvtOp.kvtOpType = AddK
		case "append":
			kvtOp.kvtOpType = AppendK
		default:
			return nil, false, false, errors.Wrap(err, "invalid operation type")
		}
		for _, p := range prams {
			switch r.operate {
			case "remove":
				key := p.removeParam.key
				if typ == "headers" {
					key = strings.ToLower(key)
				}
				kvtOp.removeKvtGroup = append(kvtOp.removeKvtGroup, removeKvt{key})
			case "rename":
				if typ == "headers" {
					p.renameParam.oldKey = strings.ToLower(p.renameParam.oldKey)
					p.renameParam.newKey = strings.ToLower(p.renameParam.newKey)
				}
				kvtOp.renameKvtGroup = append(kvtOp.renameKvtGroup, renameKvt{p.renameParam.oldKey, p.renameParam.newKey, p.valueType})
			case "map":
				if typ == "headers" {
					p.mapParam.toKey = strings.ToLower(p.mapParam.toKey)
				}
				kvtOp.mapSource = r.mapSource
				if kvtOp.mapSource == "self" {
					kvtOp.mapSource = typ
					r.mapSource = typ
				}
				if kvtOp.mapSource == "headers" {
					p.mapParam.fromKey = strings.ToLower(p.mapParam.fromKey)
				}

				kvtOp.mapKvtGroup = append(kvtOp.mapKvtGroup, mapKvt{p.mapParam.fromKey, p.mapParam.toKey})
			case "dedupe":
				if typ == "headers" {
					p.dedupeParam.key = strings.ToLower(p.dedupeParam.key)
				}
				kvtOp.dedupeKvtGroup = append(kvtOp.dedupeKvtGroup, dedupeKvt{p.dedupeParam.key, p.dedupeParam.strategy})
			case "replace":
				if typ == "headers" {
					p.replaceParam.key = strings.ToLower(p.replaceParam.key)
				}
				var rg *reg
				if p.hostPattern != "" || p.pathPattern != "" {
					rg, err = newReg(p.hostPattern, p.pathPattern)
					if err != nil {
						return nil, false, false, errors.Wrap(err, "failed to new reg")
					}
				}
				kvtOp.replaceKvtGroup = append(kvtOp.replaceKvtGroup, replaceKvt{p.replaceParam.key, p.replaceParam.newValue, p.valueType, rg})
			case "add":
				if typ == "headers" {
					p.addParam.key = strings.ToLower(p.addParam.key)
				}
				var rg *reg
				if p.hostPattern != "" || p.pathPattern != "" {
					rg, err = newReg(p.hostPattern, p.pathPattern)
					if err != nil {
						return nil, false, false, errors.Wrap(err, "failed to new reg")
					}
				}
				kvtOp.addKvtGroup = append(kvtOp.addKvtGroup, addKvt{p.addParam.key, p.addParam.value, p.valueType, rg})
			case "append":
				if typ == "headers" {
					p.appendParam.key = strings.ToLower(p.appendParam.key)
				}
				var rg *reg
				if p.hostPattern != "" || p.pathPattern != "" {
					rg, err = newReg(p.hostPattern, p.pathPattern)
					if err != nil {
						return nil, false, false, errors.Wrap(err, "failed to new reg")
					}
				}
				kvtOp.appendKvtGroup = append(kvtOp.appendKvtGroup, appendKvt{p.appendParam.key, p.appendParam.appendValue, p.valueType, rg})
			}
		}
		isChange = isChange || len(kvtOp.removeKvtGroup) != 0 ||
			len(kvtOp.renameKvtGroup) != 0 || len(kvtOp.replaceKvtGroup) != 0 ||
			len(kvtOp.addKvtGroup) != 0 || len(kvtOp.appendKvtGroup) != 0 ||
			len(kvtOp.mapKvtGroup) != 0 || len(kvtOp.dedupeKvtGroup) != 0
		withMapKvt = withMapKvt || len(kvtOp.mapKvtGroup) != 0
		g = append(g, kvtOp)
	}

	return g, isChange, withMapKvt, nil
}