aboutsummaryrefslogtreecommitdiff
path: root/Jellyfin.Api/ModelBinders/CommaDelimitedArrayModelBinder.cs
diff options
context:
space:
mode:
authorBond-009 <bond.009@outlook.com>2025-02-14 04:24:55 +0100
committerGitHub <noreply@github.com>2025-02-13 20:24:55 -0700
commit2db0750abbcb3994a6d6163652566fe5e0e7c7b7 (patch)
treec5783a3b7ef68c09a363569218c8ba850e4d1549 /Jellyfin.Api/ModelBinders/CommaDelimitedArrayModelBinder.cs
parentfb69b976bf45e44a44b2569cd60dd72b3abeb6b3 (diff)
Make the JsonConverters for delimited arrays more generic (#13396)
* Make the JsonConverters for delimited arrays more generic Also adds some tests for serialization (with different types) as we didn't have any before. * Ignore warnings
Diffstat (limited to 'Jellyfin.Api/ModelBinders/CommaDelimitedArrayModelBinder.cs')
-rw-r--r--Jellyfin.Api/ModelBinders/CommaDelimitedArrayModelBinder.cs89
1 files changed, 0 insertions, 89 deletions
diff --git a/Jellyfin.Api/ModelBinders/CommaDelimitedArrayModelBinder.cs b/Jellyfin.Api/ModelBinders/CommaDelimitedArrayModelBinder.cs
deleted file mode 100644
index 3e3604b2a..000000000
--- a/Jellyfin.Api/ModelBinders/CommaDelimitedArrayModelBinder.cs
+++ /dev/null
@@ -1,89 +0,0 @@
-using System;
-using System.Collections.Generic;
-using System.ComponentModel;
-using System.Threading.Tasks;
-using Microsoft.AspNetCore.Mvc.ModelBinding;
-using Microsoft.Extensions.Logging;
-
-namespace Jellyfin.Api.ModelBinders;
-
-/// <summary>
-/// Comma delimited array model binder.
-/// Returns an empty array of specified type if there is no query parameter.
-/// </summary>
-public class CommaDelimitedArrayModelBinder : IModelBinder
-{
- private readonly ILogger<CommaDelimitedArrayModelBinder> _logger;
-
- /// <summary>
- /// Initializes a new instance of the <see cref="CommaDelimitedArrayModelBinder"/> class.
- /// </summary>
- /// <param name="logger">Instance of the <see cref="ILogger{CommaDelimitedArrayModelBinder}"/> interface.</param>
- public CommaDelimitedArrayModelBinder(ILogger<CommaDelimitedArrayModelBinder> 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 > 1)
- {
- var typedValues = GetParsedResult(valueProviderResult.Values, elementType, converter);
- bindingContext.Result = ModelBindingResult.Success(typedValues);
- }
- else
- {
- var value = valueProviderResult.FirstValue;
-
- if (value is not null)
- {
- var splitValues = value.Split(',', StringSplitOptions.RemoveEmptyEntries);
- var typedValues = GetParsedResult(splitValues, elementType, converter);
- bindingContext.Result = ModelBindingResult.Success(typedValues);
- }
- else
- {
- var emptyResult = Array.CreateInstance(elementType, 0);
- bindingContext.Result = ModelBindingResult.Success(emptyResult);
- }
- }
-
- return Task.CompletedTask;
- }
-
- private Array GetParsedResult(IReadOnlyList<string> values, Type elementType, TypeConverter converter)
- {
- var parsedValues = new object?[values.Count];
- var convertedCount = 0;
- for (var i = 0; i < values.Count; i++)
- {
- try
- {
- parsedValues[i] = converter.ConvertFromString(values[i].Trim());
- convertedCount++;
- }
- catch (FormatException e)
- {
- _logger.LogDebug(e, "Error converting value.");
- }
- }
-
- var typedValues = Array.CreateInstance(elementType, convertedCount);
- var typedValueIndex = 0;
- for (var i = 0; i < parsedValues.Length; i++)
- {
- if (parsedValues[i] is not null)
- {
- typedValues.SetValue(parsedValues[i], typedValueIndex);
- typedValueIndex++;
- }
- }
-
- return typedValues;
- }
-}