using System;
using System.ComponentModel;
using System.Reflection;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Mvc.ModelBinding;
namespace StardewModdingAPI.Web.Framework
{
/// Maps comma-delimited values to an parameter.
/// Derived from .
public class CommaDelimitedModelBinder : IModelBinder
{
/*********
** Public methods
*********/
/// Attempts to bind a model.
/// The model binding context.
public Task BindModelAsync(ModelBindingContext bindingContext)
{
// validate
if (bindingContext == null)
throw new ArgumentNullException(nameof(bindingContext));
// extract values
string modelName = bindingContext.ModelName;
ValueProviderResult valueProviderResult = bindingContext.ValueProvider.GetValue(modelName);
string[] values = valueProviderResult
.ToString()
.Split(new[] { ',' }, StringSplitOptions.RemoveEmptyEntries);
Type elementType = bindingContext.ModelType.GetTypeInfo().GenericTypeArguments[0];
if (values.Length == 0)
{
bindingContext.Result = ModelBindingResult.Success(Array.CreateInstance(elementType, 0));
return Task.CompletedTask;
}
// map values
TypeConverter converter = TypeDescriptor.GetConverter(elementType);
Array typedArray = Array.CreateInstance(elementType, values.Length);
try
{
for (int i = 0; i < values.Length; ++i)
{
string value = values[i];
object convertedValue = converter.ConvertFromString(value);
typedArray.SetValue(convertedValue, i);
}
}
catch (Exception exception)
{
bindingContext.ModelState.TryAddModelError(modelName, exception, bindingContext.ModelMetadata);
}
bindingContext.Result = ModelBindingResult.Success(typedArray);
return Task.CompletedTask;
}
}
}