package orbit import ( "context" "errors" ) // WorkflowRef 构造输入或已完成步骤的字段引用;合法作用域及类型在发布时由服务端校验。 func WorkflowRef(source string, path ...string) WorkflowValue { return WorkflowValue{Kind: "REFERENCE", Reference: &WorkflowReference{Source: source, Path: append([]string(nil), path...)}} } // CreateWorkflowDefinition 幂等创建稳定定义身份,不自动发布或启动流程。 func (c *Client) CreateWorkflowDefinition(ctx context.Context, key string, in CreateWorkflowDefinitionRequest) (WorkflowDefinitionResult, error) { var out WorkflowDefinitionResult err := c.call(ctx, "POST", "/v1/workflow-definitions", key, in, &out) return out, err } func (c *Client) GetWorkflowDefinition(ctx context.Context, id string) (WorkflowDefinition, error) { var out WorkflowDefinition if !validID(id) { return out, errors.New("invalid definition id") } err := c.call(ctx, "GET", "/v1/workflow-definitions/"+id, "", nil, &out) return out, err } // PublishWorkflowVersion 冻结规则;网络结果不明时保留原定义ID、版本、内容、原因和幂等键重报。 func (c *Client) PublishWorkflowVersion(ctx context.Context, id, key string, in PublishWorkflowVersionRequest) (WorkflowVersionResult, error) { var out WorkflowVersionResult if !validID(id) { return out, errors.New("invalid definition id") } err := c.call(ctx, "POST", "/v1/workflow-definitions/"+id+"/versions", key, in, &out) return out, err } func (c *Client) GetWorkflowVersion(ctx context.Context, id, version string) (WorkflowVersion, error) { var out WorkflowVersion if !validID(id) || !workflowVersionName(version) { return out, errors.New("invalid definition id or version") } err := c.call(ctx, "GET", "/v1/workflow-definitions/"+id+"/versions/"+version, "", nil, &out) return out, err } func workflowVersionName(s string) bool { if len(s) == 0 || len(s) > 64 { return false } for i, r := range s { if !(r >= 'a' && r <= 'z' || r >= 'A' && r <= 'Z' || r >= '0' && r <= '9' || i > 0 && (r == '_' || r == '.' || r == '-')) { return false } } return true }