94 lines
2.1 KiB
Go
94 lines
2.1 KiB
Go
package run
|
|
|
|
import (
|
|
"fmt"
|
|
"regexp"
|
|
"strconv"
|
|
"strings"
|
|
|
|
"git.iwork-ai.com/xdc/iqudo-top1/internal/model"
|
|
)
|
|
|
|
var pathTokenPattern = regexp.MustCompile(`^([A-Za-z][A-Za-z0-9_]*)(?:\[(\d+|\*)\])?$`)
|
|
|
|
func mapScenarioInput(fields []model.ScenarioField, input map[string]interface{}) map[string]interface{} {
|
|
mapped := make(map[string]interface{})
|
|
for _, field := range fields {
|
|
if field.SourcePath == "" {
|
|
continue
|
|
}
|
|
if value, ok := extractPath(input, field.SourcePath); ok {
|
|
mapped[field.FieldKey] = value
|
|
}
|
|
}
|
|
return mapped
|
|
}
|
|
|
|
func extractPath(root map[string]interface{}, path string) (interface{}, bool) {
|
|
parts := strings.Split(path, ".")
|
|
return walkPath(root, parts)
|
|
}
|
|
|
|
func walkPath(current interface{}, parts []string) (interface{}, bool) {
|
|
if len(parts) == 0 {
|
|
return current, true
|
|
}
|
|
match := pathTokenPattern.FindStringSubmatch(parts[0])
|
|
if match == nil {
|
|
return nil, false
|
|
}
|
|
object, ok := current.(map[string]interface{})
|
|
if !ok {
|
|
return nil, false
|
|
}
|
|
value, ok := object[match[1]]
|
|
if !ok {
|
|
return nil, false
|
|
}
|
|
if match[2] == "" {
|
|
return walkPath(value, parts[1:])
|
|
}
|
|
items, ok := value.([]interface{})
|
|
if !ok {
|
|
return nil, false
|
|
}
|
|
if match[2] == "*" {
|
|
values := make([]interface{}, 0)
|
|
for _, item := range items {
|
|
resolved, found := walkPath(item, parts[1:])
|
|
if !found {
|
|
continue
|
|
}
|
|
if nested, ok := resolved.([]interface{}); ok {
|
|
values = append(values, nested...)
|
|
} else {
|
|
values = append(values, resolved)
|
|
}
|
|
}
|
|
return values, len(values) > 0
|
|
}
|
|
index, err := strconv.Atoi(match[2])
|
|
if err != nil || index < 0 || index >= len(items) {
|
|
return nil, false
|
|
}
|
|
return walkPath(items[index], parts[1:])
|
|
}
|
|
|
|
func mergeValues(base map[string]interface{}, overrides map[string]interface{}) map[string]interface{} {
|
|
result := make(map[string]interface{}, len(base)+len(overrides))
|
|
for key, value := range base {
|
|
result[key] = value
|
|
}
|
|
for key, value := range overrides {
|
|
result[key] = value
|
|
}
|
|
return result
|
|
}
|
|
|
|
func validateExternalRef(value string) error {
|
|
if len(value) > 191 {
|
|
return fmt.Errorf("external_ref 不能超过191个字符")
|
|
}
|
|
return nil
|
|
}
|