public MessageTemplateOutputTokenRenderer(ConsoleTheme theme, PropertyToken token, IFormatProvider formatProvider)
        {
            _theme = theme ?? throw new ArgumentNullException(nameof(theme));
            _token = token ?? throw new ArgumentNullException(nameof(token));
            bool isLiteral = false, isJson = false;

            if (token.Format != null)
            {
                for (var i = 0; i < token.Format.Length; ++i)
                {
                    if (token.Format[i] == 'l')
                    {
                        isLiteral = true;
                    }
                    else if (token.Format[i] == 'j')
                    {
                        isJson = true;
                    }
                }
            }

            var valueFormatter = isJson
                ? (ThemedValueFormatter) new ThemedJsonValueFormatter(theme, formatProvider)
                : new ThemedDisplayValueFormatter(theme, formatProvider);

            _renderer = new ThemedMessageTemplateRenderer(theme, valueFormatter, isLiteral);
        }
        public MessageTemplateOutputTokenRenderer(RichTextBoxTheme theme, PropertyToken token, IFormatProvider formatProvider)
        {
            _theme = theme ?? throw new ArgumentNullException(nameof(theme));
            _token = token ?? throw new ArgumentNullException(nameof(token));

            var isLiteral = false;
            var isJson    = false;

            if (token.Format != null)
            {
                // ReSharper disable once ForCanBeConvertedToForeach
                for (var i = 0; i < token.Format.Length; ++i)
                {
                    switch (token.Format[i])
                    {
                    case 'l':
                        isLiteral = true;
                        break;

                    case 'j':
                        isJson = true;
                        break;
                    }
                }
            }

            var valueFormatter = isJson
                ? (ThemedValueFormatter) new ThemedJsonValueFormatter(theme, formatProvider)
                : new ThemedDisplayValueFormatter(theme, formatProvider);

            _renderer = new ThemedMessageTemplateRenderer(theme, valueFormatter, isLiteral);
        }
        static string Render(IFormatProvider formatProvider, string messageTemplate, params object[] properties)
        {
            var binder = new LoggerConfiguration().CreateLogger();

            binder.BindMessageTemplate(messageTemplate, properties, out var mt, out var props);
            var output   = new StringBuilder();
            var writer   = new StringWriter(output);
            var renderer = new ThemedMessageTemplateRenderer(ConsoleTheme.None,
                                                             new ThemedDisplayValueFormatter(ConsoleTheme.None, formatProvider), false);

            renderer.Render(mt, props.ToDictionary(p => p.Name, p => p.Value), writer);
            writer.Flush();
            return(output.ToString());
        }