Skip to content

Instantly share code, notes, and snippets.

@ufcpp
Created January 14, 2023 01:45
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save ufcpp/9d885ec3f0e62d78dea2b248a272d0cb to your computer and use it in GitHub Desktop.
Save ufcpp/9d885ec3f0e62d78dea2b248a272d0cb to your computer and use it in GitHub Desktop.
IfTrue/IfFalse interpolated string handler
using System.Globalization;
using System.Runtime.CompilerServices;
Thread.CurrentThread.CurrentCulture = CultureInfo.InvariantCulture;
static string m(bool condition) => string.Create(
CultureInfo.GetCultureInfo("fr-fr"),
$"direct: {1.5} or {1:c}, nested: {If(condition, $"{1.5}", $"{1:C}")}");
Console.WriteLine(m(true));
Console.WriteLine(m(false));
static string If(bool condition,
[InterpolatedStringHandlerArgument(nameof(condition))] IfTrueInterpolatedStringHandler thenHandler,
[InterpolatedStringHandlerArgument(nameof(condition))] IfFalseInterpolatedStringHandler elseHandler)
=> condition ? thenHandler.ToStringAndClear() : elseHandler.ToStringAndClear();
[InterpolatedStringHandler]
public ref struct IfTrueInterpolatedStringHandler
{
private DefaultInterpolatedStringHandler _inner;
public IfTrueInterpolatedStringHandler(int literalLength, int formattedCount, bool condition, out bool shouldAppend)
{
shouldAppend = condition;
if (!condition) return;
_inner = new DefaultInterpolatedStringHandler(literalLength, formattedCount);
}
public IfTrueInterpolatedStringHandler(int literalLength, int formattedCount, bool condition, out bool shouldAppend, IFormatProvider? provider)
{
shouldAppend = condition;
if (!condition) return;
_inner = new DefaultInterpolatedStringHandler(literalLength, formattedCount, provider);
}
public string ToStringAndClear() => _inner.ToStringAndClear();
public void AppendLiteral(string value) => _inner.AppendLiteral(value);
public void AppendFormatted(string? value) => _inner.AppendFormatted(value);
public void AppendFormatted(scoped ReadOnlySpan<char> value) => _inner.AppendFormatted(value);
public void AppendFormatted(object? value, int align = 0, string? format = null) => _inner.AppendFormatted(value, align, format);
public void AppendFormatted(string? value, int align = 0, string? format = null) => _inner.AppendFormatted(value, align, format);
public void AppendFormatted(scoped ReadOnlySpan<char> value, int align = 0, string? format = null) => _inner.AppendFormatted(value, align, format);
public void AppendFormatted<T>(T value) => _inner.AppendFormatted(value);
public void AppendFormatted<T>(T value, string? format) => _inner.AppendFormatted(value, format);
public void AppendFormatted<T>(T value, int align) => _inner.AppendFormatted(value, align);
public void AppendFormatted<T>(T value, int align, string? format) => _inner.AppendFormatted(value, align, format);
}
[InterpolatedStringHandler]
public ref struct IfFalseInterpolatedStringHandler
{
private DefaultInterpolatedStringHandler _inner;
public IfFalseInterpolatedStringHandler(int literalLength, int formattedCount, bool condition, out bool shouldAppend)
{
shouldAppend = !condition;
if (condition) return;
_inner = new DefaultInterpolatedStringHandler(literalLength, formattedCount);
}
public IfFalseInterpolatedStringHandler(int literalLength, int formattedCount, bool condition, out bool shouldAppend, IFormatProvider? provider)
{
shouldAppend = !condition;
if (condition) return;
_inner = new DefaultInterpolatedStringHandler(literalLength, formattedCount, provider);
}
public string ToStringAndClear() => _inner.ToStringAndClear();
public void AppendLiteral(string value) => _inner.AppendLiteral(value);
public void AppendFormatted(string? value) => _inner.AppendFormatted(value);
public void AppendFormatted(scoped ReadOnlySpan<char> value) => _inner.AppendFormatted(value);
public void AppendFormatted(object? value, int align = 0, string? format = null) => _inner.AppendFormatted(value, align, format);
public void AppendFormatted(string? value, int align = 0, string? format = null) => _inner.AppendFormatted(value, align, format);
public void AppendFormatted(scoped ReadOnlySpan<char> value, int align = 0, string? format = null) => _inner.AppendFormatted(value, align, format);
public void AppendFormatted<T>(T value) => _inner.AppendFormatted(value);
public void AppendFormatted<T>(T value, string? format) => _inner.AppendFormatted(value, format);
public void AppendFormatted<T>(T value, int align) => _inner.AppendFormatted(value, align);
public void AppendFormatted<T>(T value, int align, string? format) => _inner.AppendFormatted(value, align, format);
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment