diff options
| author | crobibero <cody@robibe.ro> | 2020-11-21 11:58:35 -0700 |
|---|---|---|
| committer | crobibero <cody@robibe.ro> | 2020-11-21 11:58:35 -0700 |
| commit | 40531db1aea0af90777c42275ec1cb55bb587030 (patch) | |
| tree | e13fa7d3697b57179218184255fb67ddb97030f7 /Jellyfin.Api/ModelBinders/NullableEnumModelBinder.cs | |
| parent | 05bd1383c141e165f0e72a5dd2ec626376cf33a2 (diff) | |
Add NullableEnumModelBinder and NullableEnumModelBinderProvider
Diffstat (limited to 'Jellyfin.Api/ModelBinders/NullableEnumModelBinder.cs')
| -rw-r--r-- | Jellyfin.Api/ModelBinders/NullableEnumModelBinder.cs | 47 |
1 files changed, 47 insertions, 0 deletions
diff --git a/Jellyfin.Api/ModelBinders/NullableEnumModelBinder.cs b/Jellyfin.Api/ModelBinders/NullableEnumModelBinder.cs new file mode 100644 index 000000000..5d296227e --- /dev/null +++ b/Jellyfin.Api/ModelBinders/NullableEnumModelBinder.cs @@ -0,0 +1,47 @@ +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 + { + var convertedValue = converter.ConvertFromString(valueProviderResult.FirstValue); + bindingContext.Result = ModelBindingResult.Success(convertedValue); + } + catch (FormatException e) + { + _logger.LogWarning(e, "Error converting value."); + } + } + + return Task.CompletedTask; + } + } +}
\ No newline at end of file |
