Files
orbit/weave/engine/poll.go

55 lines
1.7 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
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")
}