in sdk/Sdk.Generators/FunctionMetadataProviderGenerator/FunctionMetadataProviderGenerator.Emitter.cs [108:158]
private static string AddFunctionMetadataInfo(IReadOnlyList<GeneratorFunctionMetadata> functionMetadata, CancellationToken cancellationToken)
{
var functionCount = 0;
var builder = new StringBuilder();
foreach (var function in functionMetadata)
{
cancellationToken.ThrowIfCancellationRequested();
// we're going to base variable names on Function[Num] because some function names have characters we can't use for a dotnet variable
var functionVariableName = "Function" + functionCount.ToString();
var functionBindingsListVarName = functionVariableName + "RawBindings";
var bindingInfo = BuildBindingInfo(functionBindingsListVarName, function.RawBindings);
builder.AppendLine(
$$"""
var {{functionBindingsListVarName}} = new List<string>();
{{bindingInfo}}
var {{functionVariableName}} = new DefaultFunctionMetadata
{
Language = "{{Constants.Languages.DotnetIsolated}}",
Name = "{{function.Name}}",
EntryPoint = "{{function.EntryPoint}}",
RawBindings = {{functionBindingsListVarName}},
""");
builder.Append(BuildRetryOptions(function.Retry));
builder.AppendLine($$"""
ScriptFile = "{{function.ScriptFile}}"
""");
builder.AppendLine($$""" };""");
builder.AppendLine($$""" metadataList.Add({{functionVariableName}});""");
functionCount++;
}
return builder.ToString();
}
private static string BuildBindingInfo(string bindingListVariableName, IList<IDictionary<string, object>> bindings)
{
var builder = new StringBuilder();
foreach (var binding in bindings)
{
var jsonBinding = JsonSerializer.Serialize(binding, _jsonOptions);
builder.AppendLine($""" {bindingListVariableName}.Add(@"{jsonBinding.Replace("\"", "\"\"")}");""");
}
return builder.ToString();
}