From b61b12aceb3c619367e3f6607d49f1adb58b0c3d Mon Sep 17 00:00:00 2001 From: Nicholas Blumhardt Date: Mon, 31 Aug 2026 17:30:30 +1000 Subject: [PATCH] Remove the redundant theme argument from template constructors --- demo/ThemingDemo/Program.cs | 10 ++-- src/Seq.Syntax/Compatibility/V1.cs | 16 +++---- .../Compilation/Linq/EventIdHash.cs | 2 +- .../Linq/LinqExpressionCompiler.cs | 2 +- .../Linq/ParameterReplacementVisitor.cs | 4 +- src/Seq.Syntax/Expressions/Operators.cs | 4 +- .../Expressions/Parsing/Combinators.cs | 11 ++--- .../Expressions/Parsing/ExpressionParser.cs | 2 +- .../Expressions/Parsing/ParserExtensions.cs | 6 +-- src/Seq.Syntax/Expressions/SeqExpression.cs | 12 ++--- .../Expressions/StaticMemberNameResolver.cs | 2 +- .../Encoding/TemplateOutputEncoder.cs | 16 +++---- .../Templates/ExpressionTemplate.cs | 46 ++++--------------- .../Templates/Parsing/TemplateParser.cs | 2 +- src/Seq.Syntax/Templates/Themes/AnsiTheme.cs | 6 +-- .../Seq.Syntax.Tests/Compatibility/V1Tests.cs | 6 +-- .../Templates/TemplateParserTests.cs | 2 +- .../Templates/ThemingTests.cs | 20 ++------ 18 files changed, 62 insertions(+), 107 deletions(-) diff --git a/demo/ThemingDemo/Program.cs b/demo/ThemingDemo/Program.cs index 3cf6f8d..a5d0d91 100644 --- a/demo/ThemingDemo/Program.cs +++ b/demo/ThemingDemo/Program.cs @@ -36,7 +36,7 @@ Section("No theme (the default identity encoder)"); RenderAll(new ExpressionTemplate(textTemplate), events); -foreach (var (name, theme) in new (string, TemplateTheme)[] +foreach (var (name, theme) in new[] { ("Code", TemplateTheme.Code), ("Grayscale", TemplateTheme.Grayscale), @@ -45,11 +45,11 @@ }) { Section($"TemplateTheme.{name}"); - RenderAll(new ExpressionTemplate(textTemplate, theme: theme), events); + RenderAll(new ExpressionTemplate(textTemplate, encoder: TemplateOutputEncoder.Ansi(theme)), events); } Section("Level styling and alignment across Seq's level vocabulary — {@Level,-12:t4} {@Level}"); -var levels = new ExpressionTemplate("{@Level,-12:t4} {@Level}\n", theme: TemplateTheme.Code); +var levels = new ExpressionTemplate("{@Level,-12:t4} {@Level}\n", encoder: TemplateOutputEncoder.Ansi(TemplateTheme.Code)); foreach (var spelling in new[] { "trace", "verbose", "dbug", "info", "notice", "warn", "eror", "fatal", "critical", "emerg", "alert", "panic", "OK" }) levels.Format(Event("-", level: spelling), Console.Out); @@ -69,7 +69,7 @@ "{#end}" + " {@Message}\n" + "{@Exception}", - theme: melon); + encoder: TemplateOutputEncoder.Ansi(melon)); mel.Format(Event("Host listening at {ListenUri}", new { ListenUri = "https://hello-world.local", SourceContext = "ThemingDemo.Program" }), Console.Out); @@ -85,7 +85,7 @@ Section("Terminal safety: themed output strips event-derived control characters"); var hostile = Event("Deleting {Path}", new { Path = "\x1b[33;1mC:\\WINDOWS\x1b[0m" }, level: "Warning"); -new ExpressionTemplate("[{@Level:u3}] {@Message}\n", theme: TemplateTheme.Code).Format(hostile, Console.Out); +new ExpressionTemplate("[{@Level:u3}] {@Message}\n", encoder: TemplateOutputEncoder.Ansi(TemplateTheme.Code)).Format(hostile, Console.Out); Section("TemplateOutputEncoder.Html: content is escaped; unsafe() passes markup through"); var htmlTemplate = new ExpressionTemplate( diff --git a/src/Seq.Syntax/Compatibility/V1.cs b/src/Seq.Syntax/Compatibility/V1.cs index ddb77c2..4bae914 100644 --- a/src/Seq.Syntax/Compatibility/V1.cs +++ b/src/Seq.Syntax/Compatibility/V1.cs @@ -41,9 +41,9 @@ public static bool TryCompileExpression( [MaybeNullWhen(false)] out CompiledExpression result, [MaybeNullWhen(true)] out string error) { - if (expression == null) throw new ArgumentNullException(nameof(expression)); - if (nameResolver == null) throw new ArgumentNullException(nameof(nameResolver)); - + ArgumentNullException.ThrowIfNull(expression); + ArgumentNullException.ThrowIfNull(nameResolver); + var expressionParser = new ExpressionParser(); if (!expressionParser.TryParse(expression, out var root, out error)) { @@ -64,14 +64,11 @@ public static bool TryParseTemplate( string template, CultureInfo? culture, NameResolver? nameResolver, - TemplateTheme? theme, TemplateOutputEncoder? encoder, [MaybeNullWhen(false)] out ExpressionTemplate result, [MaybeNullWhen(true)] out string error) { - if (template == null) throw new ArgumentNullException(nameof(template)); - - var outputEncoder = ExpressionTemplate.CreateOutputEncoder(theme, encoder); + ArgumentNullException.ThrowIfNull(template); var templateParser = new TemplateParser(); if (!templateParser.TryParse(template, out var parsed, out error)) @@ -84,12 +81,13 @@ public static bool TryParseTemplate( var planned = TemplateLocalNameBinder.BindLocalValueNames(parsed); + encoder ??= TemplateOutputEncoder.Default; result = new ExpressionTemplate( TemplateCompiler.Compile( planned, culture, - TemplateFunctionNameResolver.Build(WithV1Functions(nameResolver), planned, outputEncoder.HasEscaper), - outputEncoder)); + TemplateFunctionNameResolver.Build(WithV1Functions(nameResolver), planned, encoder.HasEscaper), + encoder)); return true; } diff --git a/src/Seq.Syntax/Expressions/Compilation/Linq/EventIdHash.cs b/src/Seq.Syntax/Expressions/Compilation/Linq/EventIdHash.cs index 133724d..c610e93 100644 --- a/src/Seq.Syntax/Expressions/Compilation/Linq/EventIdHash.cs +++ b/src/Seq.Syntax/Expressions/Compilation/Linq/EventIdHash.cs @@ -34,7 +34,7 @@ public static class EventIdHash /// Murmur32 by default, and we should probably head in the same direction here. public static uint Compute(string messageTemplate) { - if (messageTemplate == null) throw new ArgumentNullException(nameof(messageTemplate)); + ArgumentNullException.ThrowIfNull(messageTemplate); // Jenkins one-at-a-time https://en.wikipedia.org/wiki/Jenkins_hash_function unchecked diff --git a/src/Seq.Syntax/Expressions/Compilation/Linq/LinqExpressionCompiler.cs b/src/Seq.Syntax/Expressions/Compilation/Linq/LinqExpressionCompiler.cs index 07c38c9..4d52067 100644 --- a/src/Seq.Syntax/Expressions/Compilation/Linq/LinqExpressionCompiler.cs +++ b/src/Seq.Syntax/Expressions/Compilation/Linq/LinqExpressionCompiler.cs @@ -145,7 +145,7 @@ class LinqExpressionCompiler : SeqExpressionTransformer public static Evaluatable Compile(Expression expression, CultureInfo? formatProvider, NameResolver nameResolver) { - if (expression == null) throw new ArgumentNullException(nameof(expression)); + ArgumentNullException.ThrowIfNull(expression); var compiler = new LinqExpressionCompiler(formatProvider, nameResolver); var body = compiler.Transform(expression); return LX.Lambda(body, compiler.Context).Compile(); diff --git a/src/Seq.Syntax/Expressions/Compilation/Linq/ParameterReplacementVisitor.cs b/src/Seq.Syntax/Expressions/Compilation/Linq/ParameterReplacementVisitor.cs index cfa472e..cae0e77 100644 --- a/src/Seq.Syntax/Expressions/Compilation/Linq/ParameterReplacementVisitor.cs +++ b/src/Seq.Syntax/Expressions/Compilation/Linq/ParameterReplacementVisitor.cs @@ -28,8 +28,8 @@ public static Expression ReplaceParameters(LambdaExpression lambda, params Param ParameterReplacementVisitor(ParameterExpression[] from, ParameterExpression[] to) { - if (from == null) throw new ArgumentNullException(nameof(from)); - if (to == null) throw new ArgumentNullException(nameof(to)); + ArgumentNullException.ThrowIfNull(from); + ArgumentNullException.ThrowIfNull(to); if (from.Length != to.Length) throw new InvalidOperationException("Mismatched parameter lists"); _from = from; _to = to; diff --git a/src/Seq.Syntax/Expressions/Operators.cs b/src/Seq.Syntax/Expressions/Operators.cs index 3581c96..abd1dc1 100644 --- a/src/Seq.Syntax/Expressions/Operators.cs +++ b/src/Seq.Syntax/Expressions/Operators.cs @@ -107,8 +107,8 @@ static class Operators public static bool SameOperator(string op1, string op2) { - if (op1 == null) throw new ArgumentNullException(nameof(op1)); - if (op2 == null) throw new ArgumentNullException(nameof(op2)); + ArgumentNullException.ThrowIfNull(op1); + ArgumentNullException.ThrowIfNull(op2); return OperatorComparer.Equals(op1, op2); } diff --git a/src/Seq.Syntax/Expressions/Parsing/Combinators.cs b/src/Seq.Syntax/Expressions/Parsing/Combinators.cs index d55346c..d41755c 100644 --- a/src/Seq.Syntax/Expressions/Parsing/Combinators.cs +++ b/src/Seq.Syntax/Expressions/Parsing/Combinators.cs @@ -25,13 +25,10 @@ public static TokenListParser ChainModified modify, Func apply) { - if (@operator == null) - throw new ArgumentNullException(nameof (@operator)); - if (operand == null) - throw new ArgumentNullException(nameof (operand)); - if (modify == null) throw new ArgumentNullException(nameof(modify)); - if (apply == null) - throw new ArgumentNullException(nameof (apply)); + ArgumentNullException.ThrowIfNull(@operator); + ArgumentNullException.ThrowIfNull(operand); + ArgumentNullException.ThrowIfNull(modify); + ArgumentNullException.ThrowIfNull(apply); return input => { diff --git a/src/Seq.Syntax/Expressions/Parsing/ExpressionParser.cs b/src/Seq.Syntax/Expressions/Parsing/ExpressionParser.cs index dd709d5..e933918 100644 --- a/src/Seq.Syntax/Expressions/Parsing/ExpressionParser.cs +++ b/src/Seq.Syntax/Expressions/Parsing/ExpressionParser.cs @@ -33,7 +33,7 @@ public Expression Parse(string expression) public bool TryParse(string filterExpression, [MaybeNullWhen(false)] out Expression root, [MaybeNullWhen(true)] out string error) { - if (filterExpression == null) throw new ArgumentNullException(nameof(filterExpression)); + ArgumentNullException.ThrowIfNull(filterExpression); var tokenList = _tokenizer.TryTokenize(filterExpression); if (!tokenList.HasValue) diff --git a/src/Seq.Syntax/Expressions/Parsing/ParserExtensions.cs b/src/Seq.Syntax/Expressions/Parsing/ParserExtensions.cs index b138cf5..50a9042 100644 --- a/src/Seq.Syntax/Expressions/Parsing/ParserExtensions.cs +++ b/src/Seq.Syntax/Expressions/Parsing/ParserExtensions.cs @@ -21,9 +21,9 @@ static class ParserExtensions { public static TokenListParser SelectCatch(this TokenListParser parser, Func trySelector, string errorMessage) { - if (parser == null) throw new ArgumentNullException(nameof(parser)); - if (trySelector == null) throw new ArgumentNullException(nameof(trySelector)); - if (errorMessage == null) throw new ArgumentNullException(nameof(errorMessage)); + ArgumentNullException.ThrowIfNull(parser); + ArgumentNullException.ThrowIfNull(trySelector); + ArgumentNullException.ThrowIfNull(errorMessage); return input => { diff --git a/src/Seq.Syntax/Expressions/SeqExpression.cs b/src/Seq.Syntax/Expressions/SeqExpression.cs index 717c1f8..1744cf3 100644 --- a/src/Seq.Syntax/Expressions/SeqExpression.cs +++ b/src/Seq.Syntax/Expressions/SeqExpression.cs @@ -39,7 +39,7 @@ public static CompiledExpression Compile(string expression, CultureInfo? formatProvider = null, NameResolver? nameResolver = null) { - if (expression == null) throw new ArgumentNullException(nameof(expression)); + ArgumentNullException.ThrowIfNull(expression); if (!TryCompileImpl(expression, formatProvider, nameResolver, out var filter, out var error)) throw new ArgumentException(error); @@ -62,7 +62,7 @@ public static bool TryCompile( // ReSharper disable once OutParameterValueIsAlwaysDiscarded.Global [MaybeNullWhen(true)] out string error) { - if (expression == null) throw new ArgumentNullException(nameof(expression)); + ArgumentNullException.ThrowIfNull(expression); return TryCompileImpl(expression, null, null, out result, out error); } @@ -85,8 +85,8 @@ public static bool TryCompile(string expression, [MaybeNullWhen(false)] out CompiledExpression result, [MaybeNullWhen(true)] out string error) { - if (expression == null) throw new ArgumentNullException(nameof(expression)); - if (nameResolver == null) throw new ArgumentNullException(nameof(nameResolver)); + ArgumentNullException.ThrowIfNull(expression); + ArgumentNullException.ThrowIfNull(nameResolver); return TryCompileImpl(expression, formatProvider, nameResolver, out result, out error); } @@ -118,7 +118,7 @@ static bool TryCompileImpl(string expression, // ReSharper disable once UnusedMember.Global public static string EscapeLikeExpressionContent(string text) { - if (text == null) throw new ArgumentNullException(nameof(text)); + ArgumentNullException.ThrowIfNull(text); return EscapeStringContent(text) .Replace("%", "%%") .Replace("_", "__"); @@ -131,7 +131,7 @@ public static string EscapeLikeExpressionContent(string text) /// The text with any special values escaped. public static string EscapeStringContent(string text) { - if (text == null) throw new ArgumentNullException(nameof(text)); + ArgumentNullException.ThrowIfNull(text); return text.Replace("'", "''"); } diff --git a/src/Seq.Syntax/Expressions/StaticMemberNameResolver.cs b/src/Seq.Syntax/Expressions/StaticMemberNameResolver.cs index 220eeda..0647b64 100644 --- a/src/Seq.Syntax/Expressions/StaticMemberNameResolver.cs +++ b/src/Seq.Syntax/Expressions/StaticMemberNameResolver.cs @@ -30,7 +30,7 @@ public class StaticMemberNameResolver : NameResolver /// A with public static members implementing runtime functions. public StaticMemberNameResolver(Type type) { - if (type == null) throw new ArgumentNullException(nameof(type)); + ArgumentNullException.ThrowIfNull(type); _methods = type .GetTypeInfo() diff --git a/src/Seq.Syntax/Templates/Encoding/TemplateOutputEncoder.cs b/src/Seq.Syntax/Templates/Encoding/TemplateOutputEncoder.cs index e32d6e4..e50de65 100644 --- a/src/Seq.Syntax/Templates/Encoding/TemplateOutputEncoder.cs +++ b/src/Seq.Syntax/Templates/Encoding/TemplateOutputEncoder.cs @@ -17,13 +17,9 @@ namespace Seq.Syntax.Templates.Encoding; /// -/// Encodes template output. Template evaluation produces a sequence of runs, each classified by -/// a and as either content (event-derived text) or -/// markup (text the template author controls: literal template text, padding, and -/// unsafe() output). The theme, when present, delimits every run; the escaper, when -/// present, transforms content — and only content — before it is written. +/// Applies theming and/or content escaping to template output. /// -public class TemplateOutputEncoder +public sealed class TemplateOutputEncoder { static readonly TemplateThemeStyle[] Styles = Enum.GetValues(); @@ -34,8 +30,8 @@ public class TemplateOutputEncoder /// /// Construct a . /// - /// Optionally, a theme delimiting classified output runs. - /// Optionally, an escaper applied to event-derived content. + /// If specified, inserts theming delimiters before and after template elements for output. + /// If specified, applies escaping to content substituted into template holes. public TemplateOutputEncoder(TemplateTheme? theme = null, TemplateOutputEscaper? escaper = null) { Theme = theme; @@ -55,9 +51,9 @@ public TemplateOutputEncoder(TemplateTheme? theme = null, TemplateOutputEscaper? /// control characters or ANSI escape sequences into the terminal. /// /// The theme to apply. - public static TemplateOutputEncoder Ansi(TemplateTheme theme) + public static TemplateOutputEncoder Ansi(TemplateTheme? theme) { - if (theme == null) throw new ArgumentNullException(nameof(theme)); + ArgumentNullException.ThrowIfNull(theme); return new TemplateOutputEncoder(theme, TemplateOutputEscaper.Terminal); } diff --git a/src/Seq.Syntax/Templates/ExpressionTemplate.cs b/src/Seq.Syntax/Templates/ExpressionTemplate.cs index eaede48..cb4724e 100644 --- a/src/Seq.Syntax/Templates/ExpressionTemplate.cs +++ b/src/Seq.Syntax/Templates/ExpressionTemplate.cs @@ -19,7 +19,6 @@ using Seq.Syntax.Templates.Compilation.NameResolution; using Seq.Syntax.Templates.Encoding; using Seq.Syntax.Templates.Parsing; -using Seq.Syntax.Templates.Themes; using System.Text.Json.Nodes; // ReSharper disable MemberCanBePrivate.Global, UnusedMember.Global @@ -45,8 +44,8 @@ public static bool TryParse( [MaybeNullWhen(false)] out ExpressionTemplate result, [MaybeNullWhen(true)] out string error) { - if (template == null) throw new ArgumentNullException(nameof(template)); - return TryParse(template, null, null, null, null, out result, out error); + ArgumentNullException.ThrowIfNull(template); + return TryParse(template, null, null, null, out result, out error); } /// @@ -59,24 +58,17 @@ public static bool TryParse( /// A description of the error, if unsuccessful. /// Optionally, a /// with which to resolve function names that appear in the template. - /// Optionally, a theme for ANSI terminal output; shorthand for - /// encoder: TemplateOutputEncoder.Ansi(theme), and exclusive with . /// Optionally, an encoder applying a theme and/or escaper to template output. /// true if the template was well-formed. - /// Both and - /// are supplied. public static bool TryParse( string template, CultureInfo? culture, NameResolver? nameResolver, - TemplateTheme? theme, TemplateOutputEncoder? encoder, [MaybeNullWhen(false)] out ExpressionTemplate result, [MaybeNullWhen(true)] out string error) { - if (template == null) throw new ArgumentNullException(nameof(template)); - - var outputEncoder = CreateOutputEncoder(theme, encoder); + ArgumentNullException.ThrowIfNull(template); var templateParser = new TemplateParser(); if (!templateParser.TryParse(template, out var parsed, out error)) @@ -87,12 +79,13 @@ public static bool TryParse( var planned = TemplateLocalNameBinder.BindLocalValueNames(parsed); + encoder ??= TemplateOutputEncoder.Default; result = new ExpressionTemplate( TemplateCompiler.Compile( planned, culture, - TemplateFunctionNameResolver.Build(nameResolver, planned, outputEncoder.HasEscaper), - outputEncoder)); + TemplateFunctionNameResolver.Build(nameResolver, planned, encoder.HasEscaper), + encoder)); return true; } @@ -110,21 +103,14 @@ internal ExpressionTemplate(CompiledTemplate compiled) /// embedded values. /// Optionally, a /// with which to resolve function names that appear in the template. - /// Optionally, a theme for ANSI terminal output; shorthand for - /// encoder: TemplateOutputEncoder.Ansi(theme), and exclusive with . /// Optionally, an encoder applying a theme and/or escaper to template output. - /// Both and - /// are supplied, or the template is malformed. public ExpressionTemplate( string template, CultureInfo? culture = null, NameResolver? nameResolver = null, - TemplateTheme? theme = null, TemplateOutputEncoder? encoder = null) { - if (template == null) throw new ArgumentNullException(nameof(template)); - - var outputEncoder = CreateOutputEncoder(theme, encoder); + ArgumentNullException.ThrowIfNull(template); var templateParser = new TemplateParser(); if (!templateParser.TryParse(template, out var parsed, out var error)) @@ -132,26 +118,14 @@ public ExpressionTemplate( var planned = TemplateLocalNameBinder.BindLocalValueNames(parsed); + encoder ??= TemplateOutputEncoder.Default; _compiled = TemplateCompiler.Compile( planned, culture, - TemplateFunctionNameResolver.Build(nameResolver, planned, outputEncoder.HasEscaper), - outputEncoder); - } - - internal static TemplateOutputEncoder CreateOutputEncoder(TemplateTheme? theme, TemplateOutputEncoder? encoder) - { - if (theme != null && encoder != null) - throw new ArgumentException( - $"Supply either `theme` or `encoder`, but not both. A theme is combined with a custom escaper by constructing a {nameof(TemplateOutputEncoder)} directly."); - - if (theme != null) - return TemplateOutputEncoder.Ansi(theme); - - return encoder ?? TemplateOutputEncoder.Default; + TemplateFunctionNameResolver.Build(nameResolver, planned, encoder.HasEscaper), + encoder); } - /// /// Format into . /// diff --git a/src/Seq.Syntax/Templates/Parsing/TemplateParser.cs b/src/Seq.Syntax/Templates/Parsing/TemplateParser.cs index 3a85d84..c4a0e92 100644 --- a/src/Seq.Syntax/Templates/Parsing/TemplateParser.cs +++ b/src/Seq.Syntax/Templates/Parsing/TemplateParser.cs @@ -30,7 +30,7 @@ public bool TryParse( [MaybeNullWhen(false)] out Template parsed, [MaybeNullWhen(true)] out string error) { - if (template == null) throw new ArgumentNullException(nameof(template)); + ArgumentNullException.ThrowIfNull(template); var tokenList = _tokenizer.TryTokenize(template); if (!tokenList.HasValue) diff --git a/src/Seq.Syntax/Templates/Themes/AnsiTheme.cs b/src/Seq.Syntax/Templates/Themes/AnsiTheme.cs index 92c11c6..715f2f5 100644 --- a/src/Seq.Syntax/Templates/Themes/AnsiTheme.cs +++ b/src/Seq.Syntax/Templates/Themes/AnsiTheme.cs @@ -32,7 +32,7 @@ public class AnsiTheme : TemplateTheme /// When is . public AnsiTheme(IReadOnlyDictionary ansiStyles) { - if (ansiStyles is null) throw new ArgumentNullException(nameof(ansiStyles)); + ArgumentNullException.ThrowIfNull(ansiStyles); _ansiStyles = ansiStyles.ToDictionary(kv => kv.Key, kv => kv.Value); } @@ -45,8 +45,8 @@ public AnsiTheme(IReadOnlyDictionary ansiStyles) /// When either argument is . public AnsiTheme(AnsiTheme baseTheme, IReadOnlyDictionary ansiStyles) { - if (baseTheme is null) throw new ArgumentNullException(nameof(baseTheme)); - if (ansiStyles is null) throw new ArgumentNullException(nameof(ansiStyles)); + ArgumentNullException.ThrowIfNull(baseTheme); + ArgumentNullException.ThrowIfNull(ansiStyles); _ansiStyles = new Dictionary(baseTheme._ansiStyles); foreach (var (style, ansiStyle) in ansiStyles) _ansiStyles[style] = ansiStyle; diff --git a/test/Seq.Syntax.Tests/Compatibility/V1Tests.cs b/test/Seq.Syntax.Tests/Compatibility/V1Tests.cs index b07b961..4db67bb 100644 --- a/test/Seq.Syntax.Tests/Compatibility/V1Tests.cs +++ b/test/Seq.Syntax.Tests/Compatibility/V1Tests.cs @@ -69,7 +69,7 @@ public void LevelDefaultsToInformationWhenAbsent() Assert.Equal("false", RenderV1("@l = 'Warning'", evt)); Assert.Equal("\"Information\"", RenderV1("ToString(@l)", evt)); - Assert.True(V1.TryParseTemplate("{@l}|{@l:u3}", null, null, null, null, out var template, out var error), error); + Assert.True(V1.TryParseTemplate("{@l}|{@l:u3}", null, null, null, out var template, out var error), error); var output = new StringWriter(); template.Format(evt, output); Assert.Equal("Information|INF", output.ToString()); @@ -94,7 +94,7 @@ public void RenderingsAreComputedFromFormattedMessageTemplateHoles() Assert.Equal("[\"12.35\"]", RenderV1("@r", evt)); Assert.Equal("\"12.35\"", RenderV1("@r[0]", evt)); - Assert.True(V1.TryParseTemplate("{#each r in @r}[{r}]{#end}", CultureInfo.InvariantCulture, null, null, null, out var template, out var error), error); + Assert.True(V1.TryParseTemplate("{#each r in @r}[{r}]{#end}", CultureInfo.InvariantCulture, null, null, out var template, out var error), error); var output = new StringWriter(); template.Format(evt, output); Assert.Equal("[12.35]", output.ToString()); @@ -131,7 +131,7 @@ public void TemplatesRenderV1BuiltInNames() { var evt = Some.InformationEvent("Hello, {Name}!", "nblumhardt"); - Assert.True(V1.TryParseTemplate("{@m} for {@p['Name']}", null, null, null, null, out var template, out var error), error); + Assert.True(V1.TryParseTemplate("{@m} for {@p['Name']}", null, null, null, out var template, out var error), error); var output = new StringWriter(); template.Format(evt, output); diff --git a/test/Seq.Syntax.Tests/Templates/TemplateParserTests.cs b/test/Seq.Syntax.Tests/Templates/TemplateParserTests.cs index 9bae4d7..97678a1 100644 --- a/test/Seq.Syntax.Tests/Templates/TemplateParserTests.cs +++ b/test/Seq.Syntax.Tests/Templates/TemplateParserTests.cs @@ -21,7 +21,7 @@ public class TemplateParserTests "Syntax error (line 1, column 14): unexpected `}`, expected alignment and width.")] public void ErrorsAreReported(string input, string error) { - Assert.False(ExpressionTemplate.TryParse(input, null, null, null, null, out _, out var actual)); + Assert.False(ExpressionTemplate.TryParse(input, null, null, null, out _, out var actual)); Assert.Equal(error, actual); } diff --git a/test/Seq.Syntax.Tests/Templates/ThemingTests.cs b/test/Seq.Syntax.Tests/Templates/ThemingTests.cs index d6a835a..7f7ac20 100644 --- a/test/Seq.Syntax.Tests/Templates/ThemingTests.cs +++ b/test/Seq.Syntax.Tests/Templates/ThemingTests.cs @@ -9,9 +9,9 @@ namespace Seq.Syntax.Tests.Templates; public class ThemingTests { - static string Render(string template, JsonObject evt, TemplateTheme? theme = null, TemplateOutputEncoder? encoder = null) + static string Render(string template, JsonObject evt, TemplateOutputEncoder? encoder = null) { - var compiled = new ExpressionTemplate(template, theme: theme, encoder: encoder); + var compiled = new ExpressionTemplate(template, encoder: encoder); var output = new StringWriter(); compiled.Format(evt, output); return output.ToString(); @@ -178,23 +178,13 @@ public void UnsafeUnderThemeWithoutEscaperIsRejected() Assert.Throws(() => RenderMarked("{unsafe(A)}", MessageEvent("-"))); } - [Fact] - public void SupplyingBothThemeAndEncoderThrows() - { - Assert.Throws(() => - new ExpressionTemplate("-", theme: TemplateTheme.Code, encoder: TemplateOutputEncoder.Html)); - - Assert.Throws(() => - ExpressionTemplate.TryParse("-", null, null, TemplateTheme.Code, TemplateOutputEncoder.Html, out _, out _)); - } - [Fact] public void TruncatedMessageRecoversNeutralStyling() { var evt = MessageEvent(string.Concat(Enumerable.Repeat("{A}", 200))); evt["A"] = new string('x', 1000); - var actual = Render("{@Message}", evt, theme: TemplateTheme.Code); + var actual = Render("{@Message}", evt, encoder: TemplateOutputEncoder.Ansi(TemplateTheme.Code)); Assert.Equal(16 * 1024 + "\x1b[0m".Length, actual.Length); Assert.EndsWith("\x1b[0m", actual); @@ -211,7 +201,7 @@ public void CustomAnsiThemesOverrideBaseThemeStyles() var evt = MessageEvent("{A}"); evt["A"] = "x"; - Assert.Equal("\x1b[38;5;159mx\x1b[0m", Render("{@Message}", evt, theme: custom)); + Assert.Equal("\x1b[38;5;159mx\x1b[0m", Render("{@Message}", evt, encoder: TemplateOutputEncoder.Ansi(custom))); } const string Hostile = "\x1b[31m