/// <summary> /// Generate the Channels section of an AsyncApi schema. /// </summary> private Channels GenerateChannels(IEnumerable <TypeInfo> asyncApiTypes, ISchemaRepository schemaRepository) { var channels = new Channels(); var methodsWithChannelAttribute = asyncApiTypes .SelectMany(type => type.DeclaredMethods) .Select(method => new { Channel = method.GetCustomAttribute <ChannelAttribute>(), Method = method, }) .Where(mc => mc.Channel != null); foreach (var mc in methodsWithChannelAttribute) { var channelItem = new ChannelItem { Description = mc.Channel.Description, Parameters = mc.Channel.Parameters, Publish = GenerateOperation(mc.Method, schemaRepository, OperationType.Publish), Subscribe = GenerateOperation(mc.Method, schemaRepository, OperationType.Subscribe), }; channels.Add(mc.Channel.Name, channelItem); var context = new ChannelItemFilterContext(mc.Method, schemaRepository, mc.Channel); foreach (var filter in _options.ChannelItemFilters) { filter.Apply(channelItem, context); } } return(channels); }
/// <summary> /// Generate the Channels section of the AsyncApi schema from the <see cref="ChannelAttribute"/> on classes. /// </summary> private Channels GenerateChannelsFromClasses(IEnumerable <TypeInfo> asyncApiTypes, ISchemaRepository schemaRepository) { var channels = new Channels(); var classesWithChannelAttribute = asyncApiTypes .Select(type => new { Channel = type.GetCustomAttribute <ChannelAttribute>(), Type = type, }) .Where(cc => cc.Channel != null); foreach (var cc in classesWithChannelAttribute) { var channelItem = new ChannelItem { Description = cc.Channel.Description, Parameters = cc.Channel.Parameters, Publish = GenerateOperationFromClass(cc.Type, schemaRepository, OperationType.Publish), Subscribe = GenerateOperationFromClass(cc.Type, schemaRepository, OperationType.Subscribe), }; channels.Add(cc.Channel.Name, channelItem); var context = new ChannelItemFilterContext(cc.Type, schemaRepository, cc.Channel); foreach (var filter in _options.ChannelItemFilters) { filter.Apply(channelItem, context); } } return(channels); }
/// <summary> /// Generate the Channels section of the AsyncApi schema from the /// <see cref="ChannelAttribute"/> on methods. /// </summary> private static IDictionary <string, ChannelItem> GenerateChannelsFromMethods(IEnumerable <TypeInfo> asyncApiTypes, AsyncApiSchemaResolver schemaResolver, AsyncApiOptions options, JsonSchemaGenerator jsonSchemaGenerator, IServiceProvider serviceProvider) { var channels = new Dictionary <string, ChannelItem>(); var methodsWithChannelAttribute = asyncApiTypes .SelectMany(type => type.DeclaredMethods) .Select(method => new { Channel = method.GetCustomAttribute <ChannelAttribute>(), Method = method, }) .Where(mc => mc.Channel != null); foreach (var mc in methodsWithChannelAttribute) { var channelItem = new ChannelItem { Description = mc.Channel.Description, Parameters = GetChannelParametersFromAttributes(mc.Method, schemaResolver, jsonSchemaGenerator), Publish = GenerateOperationFromMethod(mc.Method, schemaResolver, OperationType.Publish, options, jsonSchemaGenerator, serviceProvider), Subscribe = GenerateOperationFromMethod(mc.Method, schemaResolver, OperationType.Subscribe, options, jsonSchemaGenerator, serviceProvider), Bindings = mc.Channel.BindingsRef != null ? new ChannelBindingsReference(mc.Channel.BindingsRef) : null, Servers = mc.Channel.Servers?.ToList(), }; channels.Add(mc.Channel.Name, channelItem); var context = new ChannelItemFilterContext(mc.Method, schemaResolver, jsonSchemaGenerator, mc.Channel); foreach (var filterType in options.ChannelItemFilters) { var filter = (IChannelItemFilter)serviceProvider.GetRequiredService(filterType); filter.Apply(channelItem, context); } } return(channels); }
/// <summary> /// Generate the Channels section of the AsyncApi schema from the /// <see cref="ChannelAttribute"/> on classes. /// </summary> private static IDictionary <string, ChannelItem> GenerateChannelsFromClasses(IEnumerable <TypeInfo> asyncApiTypes, AsyncApiSchemaResolver schemaResolver, AsyncApiOptions options, JsonSchemaGenerator jsonSchemaGenerator, IServiceProvider serviceProvider) { var channels = new Dictionary <string, ChannelItem>(); var classesWithChannelAttribute = asyncApiTypes .Select(type => new { Channel = type.GetCustomAttribute <ChannelAttribute>(), Type = type, }) .Where(cc => cc.Channel != null); foreach (var cc in classesWithChannelAttribute) { var channelItem = new ChannelItem { Description = cc.Channel.Description, Parameters = GetChannelParametersFromAttributes(cc.Type, schemaResolver, jsonSchemaGenerator), Publish = GenerateOperationFromClass(cc.Type, schemaResolver, OperationType.Publish, jsonSchemaGenerator), Subscribe = GenerateOperationFromClass(cc.Type, schemaResolver, OperationType.Subscribe, jsonSchemaGenerator), Bindings = cc.Channel.BindingsRef != null ? new ChannelBindingsReference(cc.Channel.BindingsRef) : null, Servers = cc.Channel.Servers?.ToList(), }; channels.AddOrAppend(cc.Channel.Name, channelItem); var context = new ChannelItemFilterContext(cc.Type, schemaResolver, jsonSchemaGenerator, cc.Channel); foreach (var filterType in options.ChannelItemFilters) { var filter = (IChannelItemFilter)serviceProvider.GetRequiredService(filterType); filter.Apply(channelItem, context); } } return(channels); }