namespace LaaProductionWeb.API.Models { using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc.ModelBinding; using System.Collections.Generic; using System.Linq; public class ModelResult { private readonly Dictionary errors; private ModelResult(bool succeeded) { this.Succeeded = succeeded; this.errors = new Dictionary(); } private ModelResult(T value) { this.Succeeded = true; this.Value = value; } public T Value { get; } public bool Succeeded { get; } public IReadOnlyDictionary ModelErrors => this.errors; public void AddModelError(string key, string value) { if (key != null) { this.errors[key] = value; } } public static implicit operator ModelResult(T value) => new ModelResult(value); public static implicit operator ModelResult(KeyValuePair error) { var validationResults = new ModelResult(false); validationResults.AddModelError(error.Key, error.Value); return validationResults; } public static implicit operator ModelResult(ModelStateDictionary modelState) { var validationResults = new ModelResult(false); if (modelState != null) { foreach (var entry in modelState) { var errorKey = entry.Key; var errorValue = entry.Value; if (errorValue.ValidationState == ModelValidationState.Invalid && errorValue.Errors.Any()) { validationResults.AddModelError(errorKey, errorValue.Errors.First().ErrorMessage); } } } return validationResults; } public static implicit operator ActionResult(ModelResult modelState) { if (modelState is null) { return new NotFoundResult(); } else if (modelState.Succeeded) { return new OkObjectResult(modelState.Value); } return new BadRequestObjectResult(modelState.errors); } } }