< Summary

Information
Class: MyNet.UI.Extensions.UiBuilder
Assembly: MyNet.UI
File(s): https://raw.githubusercontent.com/sandre58/MyNet/85372080fe102cd9ee155ceab49ae000e7f66103/src/MyNet.UI/Extensions/UiBuilder.cs
Tag: 323_28699572109
Line coverage
58%
Covered lines: 21
Uncovered lines: 15
Coverable lines: 36
Total lines: 135
Line coverage: 58.3%
Branch coverage
66%
Covered branches: 4
Total branches: 6
Branch coverage: 66.6%
Method coverage

Feature is only available for sponsors

Upgrade to PRO version

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity Line coverage
.ctor(...)50%22100%
WithSupportedCultures(...)100%11100%
ConfigureDialogs(...)100%210%
ConfigureViewLocators(...)100%210%
ConfigureNavigation(...)100%210%
ConfigureNotifications(...)100%210%
ConfigureToasting(...)100%210%
AddShellPreferences()100%11100%
Apply()75%44100%

File(s)

https://raw.githubusercontent.com/sandre58/MyNet/85372080fe102cd9ee155ceab49ae000e7f66103/src/MyNet.UI/Extensions/UiBuilder.cs

#LineLine coverage
 1// -----------------------------------------------------------------------
 2// <copyright file="UiBuilder.cs" company="Stéphane ANDRE">
 3// Copyright (c) Stéphane ANDRE. All rights reserved.
 4// </copyright>
 5// -----------------------------------------------------------------------
 6
 7using System;
 8using System.Collections.Generic;
 9using System.Globalization;
 10using Microsoft.Extensions.DependencyInjection;
 11using MyNet.Globalization;
 12using MyNet.Humanizer;
 13using MyNet.UI.Dialogs;
 14using MyNet.UI.Loading;
 15using MyNet.UI.Locators;
 16using MyNet.UI.Locators.Conventions;
 17using MyNet.UI.Navigation;
 18using MyNet.UI.Notifications;
 19using MyNet.UI.Notifications.Processors;
 20using MyNet.UI.Toasting;
 21using MyNet.UI.Toasting.Settings;
 22using MyNet.UI.ViewModels;
 23
 24namespace MyNet.UI.Extensions;
 25
 26/// <summary>
 27/// Configures optional UI registrations inside <c>AddUi(Action&lt;UiBuilder&gt;)</c>.
 28/// </summary>
 29public sealed class UiBuilder(IServiceCollection services)
 30{
 31    private Action<DialogServiceBuilder>? _configureDialogs;
 32    private Action<ITypeResolver>? _configureViewLocators;
 33    private Action<IServiceCollection>? _configureNavigation;
 34    private Action<IList<INotificationProcessor>>? _configureNotifications;
 35    private Action<ToastManagerOptions>? _configureToasting;
 36    private bool _shellPreferences;
 37
 38    /// <summary>
 39    /// Gets the underlying service collection.
 40    /// </summary>
 641    public IServiceCollection Services { get; } = services ?? throw new ArgumentNullException(nameof(services));
 42
 43    /// <summary>
 44    /// Sets cultures offered in shell chrome (e.g. status bar language selector).
 45    /// </summary>
 46    public UiBuilder WithSupportedCultures(IEnumerable<CultureInfo>? supportedCultures)
 47    {
 348        SupportedCultures = supportedCultures;
 349        return this;
 50    }
 51
 52    /// <summary>
 53    /// Registers a platform dialog presenter, file dialog service, or other dialog overrides.
 54    /// </summary>
 55    public UiBuilder ConfigureDialogs(Action<DialogServiceBuilder> configure)
 56    {
 057        ArgumentNullException.ThrowIfNull(configure);
 058        _configureDialogs = configure;
 059        return this;
 60    }
 61
 62    /// <summary>
 63    /// Registers manual ViewModel ↔ View mappings on the type resolver.
 64    /// </summary>
 65    public UiBuilder ConfigureViewLocators(Action<ITypeResolver> configure)
 66    {
 067        ArgumentNullException.ThrowIfNull(configure);
 068        _configureViewLocators = configure;
 069        return this;
 70    }
 71
 72    /// <summary>
 73    /// Adds navigation guards or middleware after the core navigation stack is registered.
 74    /// </summary>
 75    public UiBuilder ConfigureNavigation(Action<IServiceCollection> configure)
 76    {
 077        ArgumentNullException.ThrowIfNull(configure);
 078        _configureNavigation = configure;
 079        return this;
 80    }
 81
 82    /// <summary>
 83    /// Customizes notification processors applied before publication.
 84    /// </summary>
 85    public UiBuilder ConfigureNotifications(Action<IList<INotificationProcessor>> configure)
 86    {
 087        ArgumentNullException.ThrowIfNull(configure);
 088        _configureNotifications = configure;
 089        return this;
 90    }
 91
 92    /// <summary>
 93    /// Customizes toast manager options.
 94    /// </summary>
 95    public UiBuilder ConfigureToasting(Action<ToastManagerOptions> configure)
 96    {
 097        ArgumentNullException.ThrowIfNull(configure);
 098        _configureToasting = configure;
 099        return this;
 100    }
 101
 102    /// <summary>
 103    /// Registers preferences page view models used by the shell preferences workspace.
 104    /// </summary>
 105    public UiBuilder AddShellPreferences()
 106    {
 3107        _shellPreferences = true;
 3108        return this;
 109    }
 110
 111    internal IEnumerable<CultureInfo>? SupportedCultures { get; private set; }
 112
 113    internal void Apply()
 114    {
 6115        Services.AddGlobalization()
 6116            .AddLocalization()
 6117            .AddInflection()
 6118            .AddHumanizer()
 6119            .AddBusy()
 6120            .AddNavigation();
 121
 6122        _configureNavigation?.Invoke(Services);
 123
 6124        Services.AddViewLocators(_configureViewLocators)
 6125            .AddDialogs(_configureDialogs)
 6126            .AddNotifications(_configureNotifications)
 6127            .AddToasting(_configureToasting)
 6128            .AddShell(SupportedCultures)
 6129            .AddUiTranslations();
 130
 6131        if (_shellPreferences)
 3132            Services.AddShellPreferences();
 6133    }
 134}
 135