using System; using GFramework.Core.Abstractions.Logging; using GFramework.Core.Logging; using Godot; namespace GFramework.Godot.Logging; /// /// Godot platform logger implementation. /// public sealed class GodotLogger : AbstractLogger { private readonly GodotLoggerOptions _options; /// /// Initializes a logger that preserves the historical fixed-format template. /// /// The logger name. /// The minimum enabled log level. public GodotLogger(string? name = null, LogLevel minLevel = LogLevel.Info) : this(name, GodotLoggerOptions.ForMinimumLevel(minLevel)) { } /// /// Initializes a logger with Godot-specific formatting options. /// /// The logger name. /// The logger options. public GodotLogger(string? name, GodotLoggerOptions options) : base(name ?? RootLoggerName, (options ?? throw new ArgumentNullException(nameof(options))).GetEffectiveMinLevel()) { _options = options; } /// /// Writes a log entry to Godot. /// /// The log level. /// The rendered message body. /// The optional exception. protected override void Write(LogLevel level, string message, Exception? exception) { var templateText = _options.Mode == GodotLoggerMode.Debug ? _options.DebugOutputTemplate : _options.ReleaseOutputTemplate; var context = new GodotLogRenderContext( DateTime.UtcNow, level, Name(), message, _options.GetColor(level)); var rendered = GodotLogTemplate.Parse(templateText).Render(context); if (_options.Mode == GodotLoggerMode.Debug) { WriteDebug(level, rendered); } else { GD.Print(rendered); } if (exception != null) { GD.PrintErr(exception.ToString()); } } private static void WriteDebug(LogLevel level, string rendered) { GD.PrintRich(rendered); switch (level) { case LogLevel.Fatal: case LogLevel.Error: GD.PushError(rendered); break; case LogLevel.Warning: GD.PushWarning(rendered); break; } } }