/// <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
                       ));
        }
Exemple #2
0
        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;
        }