Nuke.Cola
Loading...
Searching...
No Matches
ArgumentStringHandlerEx.cs
1using System.Runtime.CompilerServices;
2using Nuke.Common;
3using Nuke.Common.IO;
4using Nuke.Common.Tooling;
5using Nuke.Common.Utilities;
6
8
9[InterpolatedStringHandler]
10public ref struct ArgumentStringHandlerEx
11{
12 private DefaultInterpolatedStringHandler _builder;
13 private readonly List<string> _secretValues;
14
16 int literalLength,
17 int formattedCount,
18 out bool handlerIsValid)
19 {
20 _builder = new(literalLength, formattedCount);
21 _secretValues = new();
22 handlerIsValid = true;
23 }
24
25 public static implicit operator ArgumentStringHandlerEx(string value)
26 {
27 if (value.ContainsAnyOrdinalIgnoreCase("\n", "\r"))
28 value = value.AsSingleLine();
29 return $"{value}";
30 }
31
32 public void AppendLiteral(string value)
33 {
34 _builder.AppendLiteral(value);
35 }
36
37 public void AppendFormatted(object? obj, int alignment = 0, string? format = null)
38 {
39 if (obj is string value)
40 {
41 value = value.AsSingleLine();
42 if (format == "r")
43 _secretValues.Add(value);
44 else if (format == "q")
45 (value, format) = (value.DoubleQuoteIfNeeded(), null);
46 else if (format == "nq")
47 format = null;
48 AppendFormatted(value, alignment, format);
49 }
50 else if (obj is IAbsolutePathHolder holder)
51 AppendFormatted(holder, alignment, format);
52 else
53 AppendFormatted(obj?.ToString(), alignment, format);
54 }
55
56 private void AppendFormatted(string? value, int alignment, string? format)
57 {
58 _builder.AppendFormatted(value, alignment, format);
59 }
60
61 private void AppendFormatted(IAbsolutePathHolder? holder, int alignment, string? format)
62 {
63 _builder.AppendFormatted(holder?.Path, alignment, format ?? AbsolutePath.DoubleQuoteIfNeeded);
64 }
65
66 public void AppendFormatted(IEnumerable<IAbsolutePathHolder>? paths, int alignment = 0, string? format = null)
67 {
68 if (paths == null) return;
69 var list = paths.ToList();
70 for (var i = 0; i < list.Count; i++)
71 {
72 _builder.AppendFormatted(list[i], alignment, format ?? AbsolutePath.DoubleQuoteIfNeeded);
73 if (i + 1 < list.Count)
74 _builder.AppendLiteral(" ");
75 }
76 }
77
78 public string ToStringAndClear()
79 {
80 var value = _builder.ToStringAndClear().AsSingleLine();
81
82 return value.Length > 1 && value.IndexOf(value: '"', startIndex: 1) == value.Length - 1
83 ? value.TrimMatchingDoubleQuotes()
84 : value;
85 }
86
87 public Func<string, string> GetFilter()
88 {
89 var secretValues = _secretValues;
90 return x => secretValues.Aggregate(x, (arguments, value) => arguments.Replace(value, "[REDACTED]"));
91 }
92}