private static string ToString(this TargetCollection targets, bool listDependencies, bool listInputs, Palette p) { var value = new StringBuilder(); foreach (var target in targets.OrderBy(target => target.Name)) { value.AppendLine($"{p.Target}{target.Name}{p.Default}"); if (listDependencies) { var writeHeader = listInputs; var indent = writeHeader ? " " : " "; foreach (var dependency in target.Dependencies) { if (writeHeader) { value.AppendLine($" {p.Label}Dependencies:{p.Default}"); writeHeader = false; } value.AppendLine($"{indent}{p.Dependency}{dependency}{(targets.Contains(dependency) ? "" : $" {p.Failed}(missing)")}{p.Default}"); } } if (listInputs) { var writeHeader = listDependencies; var indent = writeHeader ? " " : " "; if (target is IHaveInputs hasInputs) { foreach (var input in hasInputs.Inputs) { if (writeHeader) { value.AppendLine($" {p.Label}Inputs:{p.Default}"); writeHeader = false; } value.AppendLine($"{indent}{p.Input}{input}{p.Default}"); } } } }
private string List(TargetCollection targets, List <string> rootTargets, int maxDepth, int maxDepthToShowInputs, bool listInputs) { var value = new StringBuilder(); foreach (var rootTarget in rootTargets) { Append(new List <string> { rootTarget }, new Stack <string>(), true, "", 0); } return(value.ToString()); void Append(List <string> names, Stack <string> seenTargets, bool isRoot, string previousPrefix, int depth) { if (depth > maxDepth) { return; } foreach (var item in names.Select((name, index) => new { name, index })) { var circularDependency = seenTargets.Contains(item.name); seenTargets.Push(item.name); try { var prefix = isRoot ? "" : $"{previousPrefix.Replace(p.TreeCorner, " ").Replace(p.TreeFork, p.TreeDown)}{(item.index == names.Count - 1 ? p.TreeCorner : p.TreeFork)}"; var isMissing = !targets.Contains(item.name); value.Append($"{p.Tree}{prefix}{(isRoot ? p.Target : p.Dependency)}{item.name}{p.Default}"); if (isMissing) { value.AppendLine($" {p.Failed}(missing){p.Default}"); continue; } if (circularDependency) { value.AppendLine($" {p.Failed}(circular dependency){p.Default}"); continue; } value.AppendLine(p.Default); var target = targets[item.name]; if (listInputs && depth <= maxDepthToShowInputs && target is IHaveInputs hasInputs) { foreach (var inputItem in hasInputs.Inputs.Select((input, index) => new { input, index })) { var inputPrefix = $"{prefix.Replace(p.TreeCorner, " ").Replace(p.TreeFork, p.TreeDown)}{(target.Dependencies.Any() && depth + 1 <= maxDepth ? p.TreeDown : " ")}"; value.AppendLine($"{p.Tree}{inputPrefix}{p.Input}{inputItem.input}{p.Default}"); } } Append(target.Dependencies, seenTargets, false, prefix, depth + 1); } finally { seenTargets.Pop(); } } } }
private string List(TargetCollection targets, List <string> rootTargets, int maxDepth, int maxDepthToShowInputs, bool listInputs, string startingPrefix) { var lines = new List <(string, string)>(); foreach (var rootTarget in rootTargets) { Append(new List <string> { rootTarget }, new Stack <string>(), true, "", 0); } var maxColumn1Width = lines.Max(line => Palette.StripColours(line.Item1).Length); return(string.Join("", lines.Select(line => $"{line.Item1.PadRight(maxColumn1Width + line.Item1.Length - Palette.StripColours(line.Item1).Length)} {line.Item2}{Environment.NewLine}"))); void Append(List <string> names, Stack <string> seenTargets, bool isRoot, string previousPrefix, int depth) { if (depth > maxDepth) { return; } foreach (var item in names.Select((name, index) => new { name, index })) { var circularDependency = seenTargets.Contains(item.name); seenTargets.Push(item.name); try { var prefix = isRoot ? startingPrefix ?? "" : $"{previousPrefix.Replace(p.TreeCorner, " ").Replace(p.TreeFork, p.TreeDown)}{(item.index == names.Count - 1 ? p.TreeCorner : p.TreeFork)}"; var isMissing = !targets.Contains(item.name); var line = $"{prefix}{p.Target}{item.name}"; if (isMissing) { lines.Add((line + $"{p.Reset} {p.Failed}(missing){p.Reset}", null)); continue; } if (circularDependency) { lines.Add((line + $"{p.Reset} {p.Failed}(circular dependency){p.Reset}", targets[item.name].Description)); continue; } lines.Add((line + p.Reset, targets[item.name].Description)); var target = targets[item.name]; if (listInputs && depth <= maxDepthToShowInputs && target is IHaveInputs hasInputs) { foreach (var inputItem in hasInputs.Inputs.Select((input, index) => new { input, index })) { var inputPrefix = $"{prefix.Replace(p.TreeCorner, " ").Replace(p.TreeFork, p.TreeDown)}{(target.Dependencies.Any() && depth + 1 <= maxDepth ? p.TreeDown : " ")}"; lines.Add(($"{inputPrefix}{p.Input}{inputItem.input}{p.Reset}", null)); } } Append(target.Dependencies, seenTargets, false, prefix, depth + 1); } finally { seenTargets.Pop(); } } } }