#nullable enable using Bit.Core.AdminConsole.Errors; using Bit.Core.AdminConsole.Shared.Validation; namespace Bit.Core.Models.Commands; public class CommandResult(IEnumerable errors) { public CommandResult(string error) : this([error]) { } public bool Success => ErrorMessages.Count == 0; public bool HasErrors => ErrorMessages.Count > 0; public List ErrorMessages { get; } = errors.ToList(); public CommandResult() : this(Array.Empty()) { } } public class Failure : CommandResult { protected Failure(IEnumerable errorMessages) : base(errorMessages) { } public Failure(string errorMessage) : base(errorMessage) { } } public class Success : CommandResult { } public abstract class CommandResult; public class Success(T value) : CommandResult { public T Value { get; } = value; } public class Failure(IEnumerable errorMessages) : CommandResult { public List ErrorMessages { get; } = errorMessages.ToList(); public Error[] Errors { get; set; } = []; public string ErrorMessage => string.Join(" ", ErrorMessages); public Failure(string error) : this([error]) { } public Failure(IEnumerable> errors) : this(errors.Select(e => e.Message)) { Errors = errors.ToArray(); } public Failure(Error error) : this([error.Message]) { Errors = [error]; } } public class Partial : CommandResult { public T[] Successes { get; set; } = []; public Error[] Failures { get; set; } = []; public Partial(IEnumerable successfulItems, IEnumerable> failedItems) { Successes = successfulItems.ToArray(); Failures = failedItems.ToArray(); } } public static class CommandResultExtensions { /// /// This is to help map between the InvalidT ValidationResult and the FailureT CommandResult types. /// /// /// This is the invalid type from validating the object. /// This function will map between the two types for the inner ErrorT /// Invalid object's type /// Failure object's type /// public static CommandResult MapToFailure(this Invalid invalidResult, Func mappingFunction) => new Failure(invalidResult.Errors.Select(errorA => errorA.ToError(mappingFunction(errorA.ErroredValue)))); }