package main import ( "context" "encoding/json" "fmt" "github.com/oarkflow/jet" "github.com/oarkflow/mq" "github.com/oarkflow/mq/consts" v2 "github.com/oarkflow/mq/dag/v2" ) func main() { flow := v2.NewDAG("Multi-Step Form", "multi-step-form", func(taskID string, result mq.Result) { fmt.Printf("Final result for task %s: %s\n", taskID, string(result.Payload)) }) flow.AddNode(v2.Page, "FormStep1", "FormStep1", &FormStep1{}) flow.AddNode(v2.Page, "FormStep2", "FormStep2", &FormStep2{}) flow.AddNode(v2.Page, "FormResult", "FormResult", &FormResult{}) // Define edges flow.AddEdge(v2.Simple, "FormStep1", "FormStep1", "FormStep2") flow.AddEdge(v2.Simple, "FormStep2", "FormStep2", "FormResult") // Start the flow if flow.Error != nil { panic(flow.Error) } flow.Start(context.Background(), "0.0.0.0:8082") } type FormStep1 struct { v2.Operation } func (p *FormStep1) ProcessTask(ctx context.Context, task *mq.Task) mq.Result { bt := []byte(`
`) parser := jet.NewWithMemory(jet.WithDelims("{{", "}}")) inputData["task_id"] = ctx.Value("task_id") rs, err := parser.ParseTemplate(string(bt), inputData) if err != nil { fmt.Println("FormStep2", inputData) return mq.Result{Error: err, Ctx: ctx} } ctx = context.WithValue(ctx, consts.ContentType, consts.TypeHtml) inputData["html_content"] = rs bt, _ = json.Marshal(inputData) return mq.Result{Payload: bt, Ctx: ctx} } type FormResult struct { v2.Operation } func (p *FormResult) ProcessTask(ctx context.Context, task *mq.Task) mq.Result { // Load HTML template for results bt := []byte(`Name: {{ name }}
Age: {{ age }}
{{ if register_vote }}You have registered to vote!
{{ else }}You did not register to vote.
{{ end }} `) var inputData map[string]any if task.Payload != nil { if err := json.Unmarshal(task.Payload, &inputData); err != nil { return mq.Result{Error: err, Ctx: ctx} } } if inputData != nil { if isEligible, ok := inputData["register_vote"].(string); ok { inputData["register_vote"] = isEligible } else { inputData["register_vote"] = false } } parser := jet.NewWithMemory(jet.WithDelims("{{", "}}")) rs, err := parser.ParseTemplate(string(bt), inputData) if err != nil { return mq.Result{Error: err, Ctx: ctx} } ctx = context.WithValue(ctx, consts.ContentType, consts.TypeHtml) inputData["html_content"] = rs bt, _ = json.Marshal(inputData) return mq.Result{Payload: bt, Ctx: ctx} }