using System; using System.ComponentModel; using System.Threading.Tasks; using Microsoft.AspNetCore.Mvc.ModelBinding; using Microsoft.Extensions.Logging; namespace Jellyfin.Api.ModelBinders { /// <summary> /// Nullable enum model binder. /// </summary> public class NullableEnumModelBinder : IModelBinder { private readonly ILogger<NullableEnumModelBinder> _logger; /// <summary> /// Initializes a new instance of the <see cref="NullableEnumModelBinder"/> class. /// </summary> /// <param name="logger">Instance of the <see cref="ILogger{NullableEnumModelBinder}"/> interface.</param> public NullableEnumModelBinder(ILogger<NullableEnumModelBinder> logger) { _logger = logger; } /// <inheritdoc /> public Task BindModelAsync(ModelBindingContext bindingContext) { var valueProviderResult = bindingContext.ValueProvider.GetValue(bindingContext.ModelName); var elementType = bindingContext.ModelType.GetElementType() ?? bindingContext.ModelType.GenericTypeArguments[0]; var converter = TypeDescriptor.GetConverter(elementType); if (valueProviderResult.Length != 0) { try { // REVIEW: This shouldn't be null here var convertedValue = converter.ConvertFromString(valueProviderResult.FirstValue!); bindingContext.Result = ModelBindingResult.Success(convertedValue); } catch (FormatException e) { _logger.LogDebug(e, "Error converting value."); } } return Task.CompletedTask; } } }