31 private DefaultInterpolatedStringHandler _builder;
32 private readonly List<string> _secretValues;
36 return input.ToStringAndClear();
42 out
bool handlerIsValid)
44 _builder =
new(literalLength, formattedCount);
45 _secretValues =
new();
46 handlerIsValid =
true;
51 return $
"{value.AsSingleLine()}";
54 public void AppendLiteral(
string value)
56 _builder.AppendLiteral(value);
59 public void AppendFormatted(
object? obj,
int alignment = 0,
string? format =
null)
64 (value, format) = GetObjectString(value, alignment, format);
65 AppendFormatted(value, alignment, format);
67 case IAbsolutePathHolder holder: AppendFormatted(holder, alignment, format);
break;
68 case (
string,
""):
return;
69 case (
string,
null):
return;
70 case (
string param, {} arg and not
""):
71 (var stringArg, format) = GetObjectString(arg, alignment, format);
72 AppendFormatted(param + stringArg, alignment, format);
74 default: AppendFormatted(obj?.ToString(), alignment, format);
break;
78 private (
string output,
string? format) GetObjectString(
object? obj,
int alignment = 0,
string? format =
null)
83 value = value.AsSingleLine();
88 _secretValues.Add(value);
95 (value, format) = (value.DoubleQuoteIfNeeded(),
null);
101 (value, format) = (value.SingleQuoteIfNeeded(),
null);
104 case "nq": format =
null;
break;
106 return (value, format);
108 case IAbsolutePathHolder holder:
109 return (holder.Path, format ?? AbsolutePath.DoubleQuoteIfNeeded);
111 default:
return (obj?.ToString() ??
"", format);
115 private void AppendFormatted(
string? value,
int alignment,
string? format)
117 _builder.AppendFormatted(value, alignment, format);
120 private void AppendFormatted(IAbsolutePathHolder? holder,
int alignment,
string? format)
122 _builder.AppendFormatted(holder?.Path, alignment, format ?? AbsolutePath.DoubleQuoteIfNeeded);
125 public string ToStringAndClear()
127 var value = _builder.ToStringAndClear().AsSingleLine();
129 return value.Length > 1 && value.IndexOf(value:
'"', startIndex: 1) == value.Length - 1
130 ? value.TrimMatchingDoubleQuotes()
134 public Func<string, string> GetFilter()
136 var secretValues = _secretValues;
137 return x => secretValues.Aggregate(x, (arguments, value) => arguments.Replace(value,
"[REDACTED]"));