// Copyright (c) 2025-2026 GeWuYou // SPDX-License-Identifier: Apache-2.0 using System; using System.Collections.Concurrent; using GFramework.Core.Abstractions.Logging; namespace GFramework.Godot.Logging; /// /// Provides cached Godot logger instances. /// public sealed class GodotLoggerFactoryProvider : ILoggerFactoryProvider { private readonly ConcurrentDictionary _loggers = new(StringComparer.Ordinal); private readonly Func _settingsProvider; /// /// Initializes a Godot logger provider with the default logger factory. /// public GodotLoggerFactoryProvider() : this(static () => GodotLoggerSettings.Default) { } /// /// Initializes a Godot logger provider with Godot-specific formatting options. /// /// The logger options. public GodotLoggerFactoryProvider(GodotLoggerOptions options) : this(CreateStaticSettingsProvider(options)) { } internal GodotLoggerFactoryProvider(Func settingsProvider) { _settingsProvider = settingsProvider ?? throw new ArgumentNullException(nameof(settingsProvider)); } /// /// Gets or sets the provider minimum level. /// public LogLevel MinLevel { get; set; } /// /// Creates a cached logger with the specified name. /// /// The logger name. /// A logger configured with . public ILogger CreateLogger(string name) { ArgumentNullException.ThrowIfNull(name); return _loggers.GetOrAdd( name, static (loggerName, provider) => new GodotLogger( loggerName, provider.GetOptions, () => provider.GetEffectiveMinLevel(loggerName)), this); } private GodotLoggerOptions GetOptions() { return _settingsProvider().Options; } private LogLevel GetEffectiveMinLevel(string categoryName) { return _settingsProvider().GetEffectiveMinLevel(categoryName, MinLevel); } private static Func CreateStaticSettingsProvider(GodotLoggerOptions options) { ArgumentNullException.ThrowIfNull(options); var settings = GodotLoggerSettings.FromOptions(options); return () => settings; } }