// Example: WaitForTaskComplete pattern // Use case: External service submits implementation task, waits for result package main import ( "context" "fmt" "time" "go.temporal.io/sdk/client" ) // WaitForTaskComplete - the core pattern // // 1. Build workflow spec for the task // 2. Submit to Temporal // 3. Block until completion or timeout // 4. Return result func WaitForTaskComplete( c client.Client, taskID string, repo string, timeout time.Duration, ) (map[string]interface{}, error) { ctx := context.Background() // Build spec for implementation task spec := map[string]interface{}{ "name": fmt.Sprintf("implement-%s", taskID), "input": map[string]interface{}{ "taskId": taskID, "repo": repo, }, "states": []map[string]interface{}{ { "name": "Clone", "type": "Task", "resource": "CloneRepoActivity", "parameters": map[string]interface{}{ "repo": repo, }, "next": "Analyze", }, { "name": "Analyze", "type": "Task", "resource": "AnalyzeCodeActivity", "parameters": map[string]interface{}{ "path": "${Clone.output.path}", }, "next": "SecurityScan", }, { "name": "SecurityScan", "type": "Task", "resource": "SecurityScanActivity", "parameters": map[string]interface{}{ "path": "${Clone.output.path}", }, "next": "Report", }, { "name": "Report", "type": "Task", "resource": "GenerateReportActivity", "parameters": map[string]interface{}{ "analysisResult": "${Analyze.output}", "securityResult": "${SecurityScan.output}", }, "end": true, }, }, } // Submit workflow workflowID := fmt.Sprintf("%s-%d", taskID, time.Now().UnixNano()) run, err := c.ExecuteWorkflow(ctx, client.StartWorkflowOptions{ ID: workflowID, TaskQueue: "poimen-taskqueue", }, "RoutingWorkflow", map[string]interface{}{"spec": spec}) if err != nil { return nil, fmt.Errorf("submit failed: %w", err) } fmt.Printf("[%s] Workflow started: %s\n", taskID, workflowID) // Wait for completion waitCtx, cancel := context.WithTimeout(ctx, timeout) defer cancel() var result map[string]interface{} if err := run.Get(waitCtx, &result); err != nil { return nil, fmt.Errorf("workflow failed: %w", err) } fmt.Printf("[%s] Workflow completed: %s\n", taskID, result["status"]) return result, nil } // Example usage in another service: // // func (s *MyService) ImplementTask(taskID string) error { // c, _ := client.Dial(client.Options{ // HostPort: "temporal-frontend.temporal:7233", // Namespace: "poimen-harness", // }) // defer c.Close() // // result, err := WaitForTaskComplete(c, taskID, "https://github.com/...", 30*time.Minute) // if err != nil { // return err // } // // // Process result // if result["status"] == "COMPLETED" { // report := result["stepResults"].(map[string]interface{})["Report"] // // Use report... // } // return nil // }