Skip to content

Commit 11a0add

Browse files
Support collection of model-type bindings for out-of-proc workers (#8948)
* Collection support changes
1 parent a4a3ba5 commit 11a0add

File tree

4 files changed

+76
-0
lines changed

4 files changed

+76
-0
lines changed

src/WebJobs.Script.Grpc/MessageExtensions/GrpcMessageConversionExtensions.cs

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,7 @@ public static ValueTask<TypedData> ToRpc(this object value, ILogger logger, Grpc
5656
string str => new TypedData() { String = str },
5757
double dbl => new TypedData() { Double = dbl },
5858
ParameterBindingData bindingData => bindingData.ToModelBindingData(),
59+
ParameterBindingData[] bindingDataArray => bindingDataArray.ToModelBindingDataArray(),
5960
byte[][] arrBytes when IsTypedDataCollectionSupported(capabilities) => arrBytes.ToRpcByteArray(),
6061
string[] arrStr when IsTypedDataCollectionSupported(capabilities) => arrStr.ToRpcStringArray(
6162
ShouldIncludeEmptyEntriesInMessagePayload(capabilities)),
@@ -84,6 +85,21 @@ internal static TypedData ToModelBindingData(this ParameterBindingData data)
8485
return typedData;
8586
}
8687

88+
internal static TypedData ToModelBindingDataArray(this ParameterBindingData[] dataArray)
89+
{
90+
var collectionModelBindingData = new CollectionModelBindingData();
91+
92+
foreach (ParameterBindingData element in dataArray)
93+
{
94+
if (element != null)
95+
{
96+
collectionModelBindingData.ModelBindingData.Add(element.ToModelBindingData().ModelBindingData);
97+
}
98+
}
99+
100+
return new TypedData() { CollectionModelBindingData = collectionModelBindingData };
101+
}
102+
87103
internal static async Task<TypedData> ToRpcHttp(this HttpRequest request, ILogger logger, GrpcCapabilities capabilities)
88104
{
89105
var http = new RpcHttp()

src/WebJobs.Script/Binding/ExtensionBinding.cs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -111,6 +111,10 @@ public override async Task BindAsync(BindingContext context)
111111
{
112112
await BindStringAsync(context);
113113
}
114+
else if (_binding.DefaultType == typeof(ParameterBindingData[]))
115+
{
116+
await BindCollectionAsync<ParameterBindingData>(context);
117+
}
114118
else if (_binding.DefaultType == typeof(ParameterBindingData))
115119
{
116120
await BindParameterBindingDataAsync(context);

src/WebJobs.Script/Binding/FunctionBinding.cs

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
using System.Collections.ObjectModel;
88
using System.Dynamic;
99
using System.IO;
10+
using System.Linq;
1011
using System.Reflection.Emit;
1112
using System.Text;
1213
using System.Threading.Tasks;
@@ -221,6 +222,12 @@ internal static async Task BindStringAsync(BindingContext context)
221222
context.Value = str;
222223
}
223224

225+
internal static async Task BindCollectionAsync<T>(BindingContext context)
226+
{
227+
T[] bindingList = await context.Binder.BindAsync<T[]>(context.Attributes);
228+
context.Value = bindingList;
229+
}
230+
224231
internal static async Task BindParameterBindingDataAsync(BindingContext context)
225232
{
226233
var parameterBindingData = await context.Binder.BindAsync<ParameterBindingData>(context.Attributes);

test/WebJobs.Script.Tests/Workers/Rpc/GrpcMessageConversionExtensionsTests.cs

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -711,5 +711,54 @@ public void ToModelBindingData_Creates_Valid_BindingData()
711711

712712
Assert.Equal(typedData.ModelBindingData, returned_typedata.ModelBindingData);
713713
}
714+
715+
[Fact]
716+
public void ToModelBindingDataArray_Creates_Valid_BindingData()
717+
{
718+
var logger = MockNullLoggerFactory.CreateLogger();
719+
var capabilities = new GrpcCapabilities(logger);
720+
721+
var binaryData = new BinaryData("hello world");
722+
var parameterBindingData = new ParameterBindingData("1.0", "CosmosDB", binaryData, "application/json");
723+
var parameterBindingDataArray = new ParameterBindingData[] { parameterBindingData, parameterBindingData };
724+
725+
TypedData returned_typedData = parameterBindingDataArray.ToModelBindingDataArray();
726+
727+
var modelBindingData = new ModelBindingData
728+
{
729+
Version = parameterBindingData.Version,
730+
ContentType = parameterBindingData.ContentType,
731+
Source = parameterBindingData.Source,
732+
Content = ByteString.CopyFrom(parameterBindingData.Content)
733+
};
734+
735+
var collectionModelBindingData = new CollectionModelBindingData();
736+
collectionModelBindingData.ModelBindingData.Add(modelBindingData);
737+
collectionModelBindingData.ModelBindingData.Add(modelBindingData);
738+
739+
TypedData typedData = new TypedData();
740+
typedData.CollectionModelBindingData = collectionModelBindingData;
741+
742+
Assert.Equal(2, returned_typedData.CollectionModelBindingData.ModelBindingData.Count);
743+
Assert.Equal(typedData.CollectionModelBindingData.ModelBindingData.First(), returned_typedData.CollectionModelBindingData.ModelBindingData.First());
744+
}
745+
746+
[Fact]
747+
public void ToModelBindingData_EmptyAndNullArray_Creates_Valid_BindingData()
748+
{
749+
var parameterBindingDataEmptyArray = new ParameterBindingData[] { };
750+
var parameterBindingDataNullArray = new ParameterBindingData[] { null };
751+
752+
TypedData returned_emptyTypedData = parameterBindingDataEmptyArray.ToModelBindingDataArray();
753+
TypedData returned_nullTypedData = parameterBindingDataNullArray.ToModelBindingDataArray();
754+
755+
var collectionModelBindingData = new CollectionModelBindingData();
756+
757+
TypedData typedData = new TypedData();
758+
typedData.CollectionModelBindingData = collectionModelBindingData;
759+
760+
Assert.Equal(0, returned_emptyTypedData.CollectionModelBindingData.ModelBindingData.Count);
761+
Assert.Equal(0, returned_nullTypedData.CollectionModelBindingData.ModelBindingData.Count);
762+
}
714763
}
715764
}

0 commit comments

Comments
 (0)