in plugins/wasm-go/extensions/api-workflow/main.go [47:153]
func parseConfig(json gjson.Result, c *PluginConfig, log wrapper.Log) error {
edges := make([]Edge, 0)
nodes := make(map[string]Node)
var err error
// env
env := json.Get("env")
// timeout
c.Env.Timeout = uint32(env.Get("timeout").Int())
if c.Env.Timeout == 0 {
c.Env.Timeout = DefaultTimeout
}
// max_depth
c.Env.MaxDepth = uint32(env.Get("max_depth").Int())
if c.Env.MaxDepth == 0 {
c.Env.MaxDepth = DefaultMaxDepth
}
// workflow
workflow := json.Get("workflow")
if !workflow.Exists() {
return errors.New("workflow is empty")
}
// workflow.edges
edges_ := workflow.Get("edges")
if edges_.Exists() && edges_.IsArray() {
for _, w := range edges_.Array() {
task := Task{}
edge := Edge{}
edge.Source = w.Get("source").String()
if edge.Source == "" {
return errors.New("source is empty")
}
edge.Target = w.Get("target").String()
if edge.Target == "" {
return errors.New("target is empty")
}
edge.Task = &task
edge.Conditional = w.Get("conditional").String()
edges = append(edges, edge)
}
}
c.Workflow.Edges = edges
// workflow.nodes
nodes_ := workflow.Get("nodes")
if nodes_.Exists() && nodes_.IsArray() {
for _, value := range nodes_.Array() {
node := Node{}
node.Name = value.Get("name").String()
if node.Name == "" {
return errors.New("tool name is empty")
}
node.ServiceName = value.Get("service_name").String()
if node.ServiceName == "" {
return errors.New("tool service name is empty")
}
node.ServicePort = value.Get("service_port").Int()
if node.ServicePort == 0 {
if strings.HasSuffix(node.ServiceName, ".static") {
// use default logic port which is 80 for static service
node.ServicePort = 80
} else {
return errors.New("tool service port is empty")
}
}
node.ServiceDomain = value.Get("service_domain").String()
node.ServicePath = value.Get("service_path").String()
if node.ServicePath == "" {
node.ServicePath = "/"
}
node.ServiceMethod = value.Get("service_method").String()
if node.ServiceMethod == "" {
return errors.New("service_method is empty")
}
serviceHeaders := value.Get("service_headers")
if serviceHeaders.Exists() && serviceHeaders.IsArray() {
serviceHeaders_ := []ServiceHeader{}
err = ejson.Unmarshal([]byte(serviceHeaders.Raw), &serviceHeaders_)
node.ServiceHeaders = serviceHeaders_
}
node.ServiceBodyTmpl = value.Get("service_body_tmpl").String()
serviceBodyReplaceKeys := value.Get("service_body_replace_keys")
if serviceBodyReplaceKeys.Exists() && serviceBodyReplaceKeys.IsArray() {
serviceBodyReplaceKeys_ := []BodyReplaceKeyPair{}
err = ejson.Unmarshal([]byte(serviceBodyReplaceKeys.Raw), &serviceBodyReplaceKeys_)
node.ServiceBodyReplaceKeys = serviceBodyReplaceKeys_
if err != nil {
return fmt.Errorf("unmarshal service body replace keys failed, err:%v", err)
}
}
nodes[node.Name] = node
}
c.Workflow.Nodes = nodes
// workflow.WorkflowExecStatus
c.Workflow.WorkflowExecStatus, err = initWorkflowExecStatus(c)
log.Debugf("init status : %v", c.Workflow.WorkflowExecStatus)
if err != nil {
log.Errorf("init workflow exec status failed, err:%v", err)
return fmt.Errorf("init workflow exec status failed, err:%v", err)
}
}
log.Debugf("config : %v", c)
return nil
}