File: Model\ConsoleLogsFilters.cs
Web Access
Project: src\src\Aspire.Dashboard\Aspire.Dashboard.csproj (Aspire.Dashboard)
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
 
using System.Diagnostics.CodeAnalysis;
 
namespace Aspire.Dashboard.Model;
 
/// <summary>
/// Immutable filters for console logs. This type is serialized to browser storage.
/// </summary>
public sealed class ConsoleLogsFilters
{
    public static readonly ConsoleLogsFilters Default = new()
    {
        FilterAllLogsDate = null,
        FilterResourceLogsDates = new Dictionary<string, DateTime>()
    };
 
    private Dictionary<string, DateTime> _filterResourceLogsDates = default!;
 
    public required DateTime? FilterAllLogsDate { get; init; }
 
    public required IReadOnlyDictionary<string, DateTime> FilterResourceLogsDates
    {
        get => _filterResourceLogsDates;
        init
        {
            _filterResourceLogsDates = value is Dictionary<string, DateTime> newDictionary
                ? newDictionary
                : new Dictionary<string, DateTime>(value, StringComparers.ResourceName);
        }
    }
 
    /// <summary>
    /// Creates new filters with all logs cleared at the specified date.
    /// </summary>
    public static ConsoleLogsFilters CreateClearAll(DateTime clearDate) =>
        new() { FilterAllLogsDate = clearDate, FilterResourceLogsDates = new Dictionary<string, DateTime>() };
 
    /// <summary>
    /// Creates new filters based on this instance with a specific resource cleared at the specified date.
    /// </summary>
    public ConsoleLogsFilters WithResourceCleared(string resourceName, DateTime clearDate)
    {
        var newDictionary = new Dictionary<string, DateTime>(_filterResourceLogsDates, StringComparers.ResourceName)
        {
            [resourceName] = clearDate
        };
        return new ConsoleLogsFilters { FilterAllLogsDate = FilterAllLogsDate, FilterResourceLogsDates = newDictionary };
    }
 
    /// <summary>
    /// Tries to get the filter date for a specific resource.
    /// </summary>
    public bool TryGetResourceFilterDate(string resourceName, [NotNullWhen(true)] out DateTime? filterDate)
    {
        if (_filterResourceLogsDates.TryGetValue(resourceName, out var date))
        {
            filterDate = date;
            return true;
        }
 
        filterDate = null;
        return false;
    }
}