/// <summary> /// Resolves <see cref="DirectiveSchema"/>. /// </summary> public static DirectiveSchema Resolve(Type type, IReadOnlyList <Type> modeTypes) { if (!KnownTypesHelpers.IsDirectiveType(type)) { throw DirectiveResolverExceptions.InvalidDirectiveType(type); } DirectiveAttribute attribute = type.GetCustomAttribute <DirectiveAttribute>() !; if (modeTypes is not null) { if (attribute.SupportedModes is not null && attribute.SupportedModes.Except(modeTypes).Any()) { throw DirectiveResolverExceptions.InvalidSupportedModesInDirective(type, attribute); } if (attribute.ExcludedModes is not null && attribute.ExcludedModes.Except(modeTypes).Any()) { throw DirectiveResolverExceptions.InvalidExcludedModesInDirective(type, attribute); } } return(new DirectiveSchema( type, attribute.Name, attribute.Description, attribute.SupportedModes, attribute.ExcludedModes )); }
private void ResolveDirectives(IReadOnlyList <Type> directiveTypes) { var directives = new Dictionary <string, DirectiveSchema>(); var invalidDirectives = new List <DirectiveSchema>(); foreach (Type?directiveType in directiveTypes) { DirectiveSchema directive = DirectiveSchemaResolver.Resolve(directiveType, _modeTypes); if (!directives.TryAdd(directive.Name, directive)) { invalidDirectives.Add(directive); } } if (invalidDirectives.Count > 0) { IGrouping <string, DirectiveSchema> duplicateNameGroup = invalidDirectives.Union(directives.Values) .GroupBy(c => c.Name, StringComparer.Ordinal) .First(); throw DirectiveResolverExceptions.DirectiveWithSameName(duplicateNameGroup.Key, duplicateNameGroup.ToArray()); } Directives = directives; }