/// <remarks> /// note: protobuf does not support circular file references, so this possibility isn't considered. /// </remarks> private async Task <List <SchemaReference> > RegisterOrGetReferences(FileDescriptor fd, SerializationContext context, bool autoRegisterSchema, bool skipKnownTypes) { var tasks = new List <Task <SchemaReference> >(); for (int i = 0; i < fd.Dependencies.Count; ++i) { FileDescriptor fileDescriptor = fd.Dependencies[i]; if (skipKnownTypes && fileDescriptor.Name.StartsWith("google/protobuf/")) { continue; } Func <FileDescriptor, Task <SchemaReference> > t = async(FileDescriptor dependency) => { var dependencyReferences = await RegisterOrGetReferences(dependency, context, autoRegisterSchema, skipKnownTypes).ConfigureAwait(continueOnCapturedContext: false); var subject = referenceSubjectNameStrategy(context, dependency.Name); var schema = new Schema(dependency.SerializedData.ToBase64(), dependencyReferences, SchemaType.Protobuf); var schemaId = autoRegisterSchema ? await schemaRegistryClient.RegisterSchemaAsync(subject, schema).ConfigureAwait(continueOnCapturedContext: false) : await schemaRegistryClient.GetSchemaIdAsync(subject, schema).ConfigureAwait(continueOnCapturedContext: false); var registeredDependentSchema = await schemaRegistryClient.LookupSchemaAsync(subject, schema, true).ConfigureAwait(continueOnCapturedContext: false); return(new SchemaReference(dependency.Name, subject, registeredDependentSchema.Version)); }; tasks.Add(t(fileDescriptor)); } await Task.WhenAll(tasks.ToArray()).ConfigureAwait(continueOnCapturedContext: false); return(tasks.Select(t => t.Result).ToList()); }
/// <remarks> /// note: protobuf does not support circular file references, so this possibility isn't considered. /// </remarks> private async Task <List <SchemaReference> > RegisterOrGetReferences(FileDescriptor fd, SerializationContext context, bool autoRegisterSchema) { var result = new List <SchemaReference>(); var tasks = new Task[fd.Dependencies.Count]; for (int i = 0; i < fd.Dependencies.Count; ++i) { var dependency = fd.Dependencies[i]; Func <Task> t = async() => { var dependencyReferences = await RegisterOrGetReferences(dependency, context, autoRegisterSchema).ConfigureAwait(continueOnCapturedContext: false); var subject = referenceSubjectNameStrategy(context, dependency.Name); var schema = new Schema(dependency.SerializedData.ToBase64(), dependencyReferences, SchemaType.Protobuf); var schemaId = autoRegisterSchema ? await schemaRegistryClient.RegisterSchemaAsync(subject, schema).ConfigureAwait(continueOnCapturedContext: false) : await schemaRegistryClient.GetSchemaIdAsync(subject, schema).ConfigureAwait(continueOnCapturedContext: false); var registeredDependentSchema = await schemaRegistryClient.LookupSchemaAsync(subject, schema, true).ConfigureAwait(continueOnCapturedContext: false); result.Add(new SchemaReference(dependency.Name, subject, registeredDependentSchema.Version)); }; tasks[i] = t(); } await Task.WhenAll(tasks.ToArray()).ConfigureAwait(continueOnCapturedContext: false); return(result); }