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;
}
}