< Summary

Information
Class: MyNet.UI.ViewModels.List.Filtering.FiltersViewModelBuilder<T>
Assembly: MyNet.UI
File(s): https://raw.githubusercontent.com/sandre58/MyNet/85372080fe102cd9ee155ceab49ae000e7f66103/src/MyNet.UI/ViewModels/List/Filtering/FiltersViewModelBuilder.cs
Tag: 323_28699572109
Line coverage
95%
Covered lines: 20
Uncovered lines: 1
Coverable lines: 21
Total lines: 88
Line coverage: 95.2%
Branch coverage
50%
Covered branches: 1
Total branches: 2
Branch coverage: 50%
Method coverage

Feature is only available for sponsors

Upgrade to PRO version

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity Line coverage
.ctor()100%11100%
.ctor(...)100%11100%
Create(...)100%11100%
OrGroup(...)100%11100%
AndGroup(...)100%210%
AddStringFilter(...)50%22100%
Build()100%11100%
AddGroup(...)100%11100%

File(s)

https://raw.githubusercontent.com/sandre58/MyNet/85372080fe102cd9ee155ceab49ae000e7f66103/src/MyNet.UI/ViewModels/List/Filtering/FiltersViewModelBuilder.cs

#LineLine coverage
 1// -----------------------------------------------------------------------
 2// <copyright file="FiltersViewModelBuilder.cs" company="Stéphane ANDRE">
 3// Copyright (c) Stéphane ANDRE. All rights reserved.
 4// </copyright>
 5// -----------------------------------------------------------------------
 6
 7using System;
 8using System.Linq.Expressions;
 9using MyNet.Primitives;
 10using MyNet.UI.ViewModels.List.Filtering.Filters;
 11
 12namespace MyNet.UI.ViewModels.List.Filtering;
 13
 14/// <summary>
 15/// Fluent builder used to create <see cref="FiltersViewModel{T}"/> instances.
 16/// </summary>
 17/// <typeparam name="T">The type of items to filter.</typeparam>
 18public sealed class FiltersViewModelBuilder<T>
 19{
 20    private readonly FilterGroupViewModel<T> _group;
 21
 22    /// <summary>
 23    /// Initializes a new instance of the <see cref="FiltersViewModelBuilder{T}"/> class with an empty root group.
 24    /// </summary>
 25    public FiltersViewModelBuilder()
 326        : this(new())
 27    {
 328    }
 29
 630    private FiltersViewModelBuilder(FilterGroupViewModel<T> group) => _group = group;
 31
 32    /// <summary>
 33    /// Creates and immediately builds a filters view model from a configuration action.
 34    /// </summary>
 35    public static FiltersViewModel<T> Create(Action<FiltersViewModelBuilder<T>> configure)
 36    {
 337        ArgumentNullException.ThrowIfNull(configure);
 38
 339        var builder = new FiltersViewModelBuilder<T>();
 340        configure(builder);
 341        return builder.Build();
 42    }
 43
 44    /// <summary>
 45    /// Adds a child group combined with <see cref="LogicalOperator.Or"/>.
 46    /// </summary>
 47    public FiltersViewModelBuilder<T> OrGroup(Action<FiltersViewModelBuilder<T>> configure) =>
 348        AddGroup(LogicalOperator.Or, configure);
 49
 50    /// <summary>
 51    /// Adds a child group combined with <see cref="LogicalOperator.And"/>.
 52    /// </summary>
 53    public FiltersViewModelBuilder<T> AndGroup(Action<FiltersViewModelBuilder<T>> configure) =>
 054        AddGroup(LogicalOperator.And, configure);
 55
 56    /// <summary>
 57    /// Adds a string filter to the current group.
 58    /// </summary>
 59    public FiltersViewModelBuilder<T> AddStringFilter(
 60        string propertyName,
 61        Expression<Func<T, string?>> property,
 62        Action<StringFilterViewModel<T>>? configure = null)
 63    {
 664        ArgumentNullException.ThrowIfNull(propertyName);
 665        ArgumentNullException.ThrowIfNull(property);
 66
 667        var filter = new StringFilterViewModel<T>(propertyName, property);
 668        configure?.Invoke(filter);
 669        _group.Add(filter);
 670        return this;
 71    }
 72
 73    /// <summary>
 74    /// Creates the configured <see cref="FiltersViewModel{T}"/>.
 75    /// </summary>
 376    public FiltersViewModel<T> Build() => new(_group);
 77
 78    private FiltersViewModelBuilder<T> AddGroup(LogicalOperator logicalOperator, Action<FiltersViewModelBuilder<T>> conf
 79    {
 380        ArgumentNullException.ThrowIfNull(configure);
 81
 382        var group = new FilterGroupViewModel<T> { Operator = logicalOperator };
 383        configure(new(group));
 384        _group.Add(group);
 385        return this;
 86    }
 87}
 88