src/Microsoft.Azure.WebJobs.Extensions.Kafka/Output/StringArgumentBindingProvider.cs (79 lines of code) (raw):
// Copyright (c) .NET Foundation. All rights reserved.
// Licensed under the MIT License. See License.txt in the project root for license information.
using System;
using System.Collections.Generic;
using System.Reflection;
using System.Threading.Tasks;
using Microsoft.Azure.WebJobs.Host.Bindings;
namespace Microsoft.Azure.WebJobs.Extensions.Kafka
{
internal class StringArgumentBindingProvider : IKafkaProducerBindingProvider
{
public StringArgumentBindingProvider()
{
}
public IArgumentBinding<KafkaProducerEntity> TryCreate(ParameterInfo parameter)
{
if (!parameter.IsOut)
{
return null;
}
var parameterType = GetNonRefType(parameter.ParameterType);
if (parameterType != typeof(string) && parameterType != typeof(string[]))
{
return null;
}
return (parameterType.IsArray) ?
(IArgumentBinding<KafkaProducerEntity>)new StringArrayArgumentBinding() : new StringArgumentBinding();
}
private Type GetNonRefType(Type type) => type.IsByRef ? type.GetElementType() : type;
private class StringArgumentBinding : IArgumentBinding<KafkaProducerEntity>
{
public Type ValueType
{
get { return typeof(string); }
}
public Task<IValueProvider> BindAsync(KafkaProducerEntity value, ValueBindingContext context)
{
if (context == null)
{
throw new ArgumentNullException("context");
}
IValueProvider provider = new NonNullConverterValueBinder<string>(value,
new StringToKafkaEventDataConverter(), context.FunctionInstanceId);
return Task.FromResult(provider);
}
}
private class StringArrayArgumentBinding : IArgumentBinding<KafkaProducerEntity>
{
public Type ValueType
{
get { return typeof(string); }
}
public Task<IValueProvider> BindAsync(KafkaProducerEntity value, ValueBindingContext context)
{
if (context == null)
{
throw new ArgumentNullException("context");
}
IValueProvider provider = new NonNullArrayConverterValueBinder<string[]>(value,
new StringArrayToKafkaEventDataConverter(), context.FunctionInstanceId);
return Task.FromResult(provider);
}
}
internal class StringArrayToKafkaEventDataConverter : IConverter<string[], IKafkaEventData[]>
{
public IKafkaEventData[] Convert(string[] input)
{
var result = new KafkaEventData<string>[input?.Length ?? 0];
if (input != null)
{
for (int i = 0; i < input.Length; i++)
{
result[i] = new KafkaEventData<string>(input[i]);
}
}
return result;
}
}
}
}