// Copyright Epic Games, Inc. All Rights Reserved.
using EpicGames.Core;
using Microsoft.Extensions.Logging;
using System.Text.RegularExpressions;
#nullable enable
namespace AutomationUtils.Matchers
{
///
/// Matcher log output from zen cli in plain progress
///
class ZenCliEventMatcher : ILogEventMatcher
{
static readonly Regex s_pattern = new Regex(
@"\[.*\]\s?\[(?warning|error|info)\]\s?(\[(?\S+)\:(?\d+)\])?(?.*)");
public LogEventMatch? Match(ILogCursor input)
{
if (input.TryMatch(s_pattern, out Match? match))
{
LogEventBuilder builder = new LogEventBuilder(input);
builder.Annotate(match.Groups["severity"], LogEventMarkup.Severity);
string file = match.Groups["file"].Value;
string line = match.Groups["line"].Value;
if (!string.IsNullOrEmpty(file) && !string.IsNullOrEmpty(line))
{
builder.AnnotateSourceFile(match.Groups["file"], "");
builder.Annotate(match.Groups["line"], LogEventMarkup.LineNumber);
}
LogLevel level = match.Groups["severity"].Value switch
{
"error" => LogLevel.Error,
"warning" => LogLevel.Information, // we do not want to annotate warnings from zencli as warnings as that causes too much noise - handled retries are warnings but failed retries are already errors
_ => LogLevel.Information,
};
return builder.ToMatch(LogEventPriority.Low, level, KnownLogEvents.ZenCli_Event);
}
return null;
}
}
}