55 lines
1.7 KiB
Go
55 lines
1.7 KiB
Go
package engine
|
||
|
||
import (
|
||
"encoding/json"
|
||
|
||
"git.yuntuo.hk/k2safe/orbit/weave/definition"
|
||
)
|
||
|
||
// PollOutcome 仅分类一次成功查询的业务结果,不代表查询请求的Pulse执行状态。
|
||
type PollOutcome string
|
||
|
||
const (
|
||
PollPending PollOutcome = "PENDING"
|
||
PollSucceeded PollOutcome = "SUCCEEDED"
|
||
PollFailed PollOutcome = "FAILED"
|
||
PollNeedsReview PollOutcome = "NEEDS_REVIEW"
|
||
)
|
||
|
||
// ClassifyPoll 解释固定定义中的结果映射;轮次/时限/信号竞态仍由持久化运行器决定。
|
||
func (p *Program) ClassifyPoll(key string, raw json.RawMessage) (PollOutcome, error) {
|
||
node, ok := p.nodes[key]
|
||
if !ok || node.Poll == nil {
|
||
return "", problem(key, "NOT_A_POLL_STEP")
|
||
}
|
||
result, err := classifyPoll(*node.Poll, raw)
|
||
if err != nil {
|
||
return "", problem(key, "POLL_RESULT_INVALID")
|
||
}
|
||
return result, nil
|
||
}
|
||
func classifyPoll(p definition.Poll, raw json.RawMessage) (PollOutcome, error) {
|
||
if err := definition.ValidateData(p.Task.ResultType, raw); err != nil {
|
||
return "", err
|
||
}
|
||
status, err := resolve(definition.Value{Kind: "REFERENCE", Reference: &definition.Reference{Source: "result", Path: p.StatusPath}}, definition.Type{Kind: "STRING"}, values{"result": raw})
|
||
if err != nil {
|
||
return "", err
|
||
}
|
||
var value string
|
||
if err := json.Unmarshal(status, &value); err != nil {
|
||
return "", err
|
||
}
|
||
for _, group := range []struct {
|
||
values []string
|
||
outcome PollOutcome
|
||
}{{p.Pending, PollPending}, {p.Succeeded, PollSucceeded}, {p.Failed, PollFailed}, {p.Review, PollNeedsReview}} {
|
||
for _, candidate := range group.values {
|
||
if value == candidate {
|
||
return group.outcome, nil
|
||
}
|
||
}
|
||
}
|
||
return "", problem("", "UNMAPPED_POLL_RESULT")
|
||
}
|