12 private DefaultInterpolatedStringHandler _builder;
13 private readonly List<string> _secretValues;
18 out
bool handlerIsValid)
20 _builder =
new(literalLength, formattedCount);
21 _secretValues =
new();
22 handlerIsValid =
true;
27 if (value.ContainsAnyOrdinalIgnoreCase(
"\n",
"\r"))
28 value = value.AsSingleLine();
32 public void AppendLiteral(
string value)
34 _builder.AppendLiteral(value);
37 public void AppendFormatted(
object? obj,
int alignment = 0,
string? format =
null)
39 if (obj is
string value)
41 value = value.AsSingleLine();
43 _secretValues.Add(value);
44 else if (format ==
"q")
45 (value, format) = (value.DoubleQuoteIfNeeded(),
null);
46 else if (format ==
"nq")
48 AppendFormatted(value, alignment, format);
50 else if (obj is IAbsolutePathHolder holder)
51 AppendFormatted(holder, alignment, format);
53 AppendFormatted(obj?.ToString(), alignment, format);
56 private void AppendFormatted(
string? value,
int alignment,
string? format)
58 _builder.AppendFormatted(value, alignment, format);
61 private void AppendFormatted(IAbsolutePathHolder? holder,
int alignment,
string? format)
63 _builder.AppendFormatted(holder?.Path, alignment, format ?? AbsolutePath.DoubleQuoteIfNeeded);
66 public void AppendFormatted(IEnumerable<IAbsolutePathHolder>? paths,
int alignment = 0,
string? format =
null)
68 if (paths ==
null)
return;
69 var list = paths.ToList();
70 for (var i = 0; i < list.Count; i++)
72 _builder.AppendFormatted(list[i], alignment, format ?? AbsolutePath.DoubleQuoteIfNeeded);
73 if (i + 1 < list.Count)
74 _builder.AppendLiteral(
" ");
78 public string ToStringAndClear()
80 var value = _builder.ToStringAndClear().AsSingleLine();
82 return value.Length > 1 && value.IndexOf(value:
'"', startIndex: 1) == value.Length - 1
83 ? value.TrimMatchingDoubleQuotes()
87 public Func<string, string> GetFilter()
89 var secretValues = _secretValues;
90 return x => secretValues.Aggregate(x, (arguments, value) => arguments.Replace(value,
"[REDACTED]"));