using Sdt.Config; namespace Sdt.Core; public sealed class WorkflowPlanner : IWorkflowPlanner { public List ResolvePlan( WorkflowDefinition workflow, IReadOnlyDictionary allWorkflows) { var visited = new HashSet(StringComparer.OrdinalIgnoreCase); var plan = new List(); Visit(workflow, allWorkflows, visited, plan); return plan; } private static void Visit( WorkflowDefinition workflow, IReadOnlyDictionary allWorkflows, HashSet visited, List plan) { if (!visited.Add(workflow.Id)) return; foreach (var depId in workflow.DependsOn) { if (allWorkflows.TryGetValue(depId, out var dep)) Visit(dep, allWorkflows, visited, plan); } if (workflow.Steps.Count > 0) plan.Add(workflow); } }