/// <summary> /// Determines whether the specified <paramref name="module"/> is enabled for the given <paramref name="assembly"/>. /// </summary> /// <param name="assembly"><see cref="Assembly"/> to check if the <paramref name="module"/> is enabled for.</param> /// <param name="module"><see cref="DurianModule"/> representing a Durian module to check for.</param> /// <exception cref="ArgumentNullException"><paramref name="assembly"/> is <see langword="null"/>.</exception> /// <exception cref="InvalidOperationException">Unknown <see cref="DurianModule"/> value detected. -or- <see cref="DurianModule.None"/> is not a valid Durian module.</exception> public static bool IsEnabled(this Assembly assembly, DurianModule module) { if (assembly is null) { throw new ArgumentNullException(nameof(assembly)); } ModuleIdentity.EnsureIsValidModuleEnum(module); return(IsEnabled_Internal(assembly, module)); }
/// <summary> /// Includes all the specified <paramref name="modules"/> in the container. /// </summary> /// <param name="modules">A collection of <see cref="DurianModule"/>s to include.</param> /// <exception cref="ArgumentNullException"><paramref name="modules"/> is <see langword="null"/>.</exception> /// <exception cref="InvalidOperationException">Unknown <see cref="DurianModule"/> value detected.</exception> public void IncludeAll(IEnumerable <DurianModule> modules) { if (modules is null) { throw new ArgumentNullException(nameof(modules)); } foreach (DurianModule module in modules) { ModuleIdentity.EnsureIsValidModuleEnum(module); _enums.Add(module); _references.Add(null); } }
/// <summary> /// Returns a collection of <see cref="TypeIdentity"/>s representing all enabled Durian <see cref="Type"/>s for the specified <paramref name="assembly"/> that are part of any of the provided <paramref name="modules"/>. /// </summary> /// <param name="assembly"><see cref="Assembly"/> to get the enabled Durian <see cref="Type"/>s of.</param> /// <param name="modules">Array of <see cref="DurianModule"/>s to pick the <see cref="TypeIdentity"/>s from.</param> /// <exception cref="ArgumentNullException"><paramref name="assembly"/> is <see langword="null"/>.</exception> /// <exception cref = "InvalidOperationException" > Unknown <see cref="DurianModule"/> value detected. -or- <see cref = "DurianModule.None" /> is not a valid Durian module.</exception> public static IEnumerable <TypeIdentity> GetEnabledTypes(this Assembly assembly, params DurianModule[]?modules) { if (assembly is null) { throw new ArgumentNullException(nameof(assembly)); } if (modules is null || modules.Length == 0) { return(Array.Empty <TypeIdentity>()); } foreach (DurianModule module in modules) { ModuleIdentity.EnsureIsValidModuleEnum(module); } EnableModuleAttribute[] attributes = assembly.GetCustomAttributes <EnableModuleAttribute>().ToArray(); if (attributes.Length == 0) { return(Array.Empty <TypeIdentity>()); } return(Yield()); IEnumerable <TypeIdentity> Yield() { foreach (DurianModule module in modules) { if (IsEnabled_Internal(attributes, module)) { ModuleIdentity identity = ModuleIdentity.GetModule(module); foreach (TypeIdentity t in identity.Types) { yield return(t); } } } } }
/// <summary> /// Initializes a new instance of the <see cref="ModuleContainer"/> class. /// </summary> /// <param name="modules">A collection of <see cref="DurianModule"/>s that the current instance should include.</param> /// <exception cref="ArgumentNullException"><paramref name="modules"/> is <see langword="null"/>.</exception> /// <exception cref="InvalidOperationException">Unknown <see cref="DurianModule"/> value detected.</exception> public ModuleContainer(IEnumerable <DurianModule> modules) { if (modules is null) { throw new ArgumentNullException(nameof(modules)); } List <DurianModule> enums = modules.ToList(); foreach (DurianModule m in modules) { ModuleIdentity.EnsureIsValidModuleEnum(m); } _enums = enums; _references = new List <ModuleReference?>(_enums.Count); for (int i = 0; i < _enums.Count; i++) { _references.Add(null); } }
/// <summary> /// Determines whether the specified <paramref name="type"/> is enabled for the given <paramref name="assembly"/>. /// </summary> /// <param name="assembly"><see cref="Assembly"/> to check if the <paramref name="type"/> is enabled for.</param> /// <param name="type"><see cref="TypeIdentity"/> to check if is enabled.</param> /// <param name="modules">Array of <see cref="DurianModule"/>s to pick the <see cref="TypeIdentity"/>s from.</param> /// <exception cref="ArgumentNullException"><paramref name="assembly"/> is <see langword="null"/>. -or- <paramref name="type"/> is <see langword="null"/>.</exception> /// <exception cref="InvalidOperationException">Unknown <see cref="DurianModule"/> value detected. -or- <see cref="DurianModule.None"/> is not a valid Durian module.</exception> public static bool IsEnabled(this Assembly assembly, TypeIdentity type, [NotNullWhen(true)] params DurianModule[]?modules) { if (assembly is null) { throw new ArgumentNullException(nameof(assembly)); } if (type is null) { throw new ArgumentNullException(nameof(type)); } if (modules is null || modules.Length == 0) { return(false); } foreach (DurianModule module in modules) { ModuleIdentity.EnsureIsValidModuleEnum(module); } return(IsEnabled_Internal(assembly, type, modules)); }
/// <summary> /// Returns a collection of all Durian modules present in the provided array of <paramref name="modules"/> that are enabled for the specified <paramref name="assembly"/>. /// </summary> /// <param name="assembly"><see cref="Assembly"/> to get the enabled Durian modules of.</param> /// <param name="modules">Array of <see cref="DurianModule"/>s to pick the enabled modules from.</param> /// <returns>A new instance of <see cref="ModuleContainer"/> that contains the enabled Durian modules.</returns> /// <exception cref="ArgumentNullException"><paramref name="assembly"/> is <see langword="null"/>.</exception> /// <exception cref="InvalidOperationException">Unknown <see cref="DurianModule"/> value detected. -or- <see cref="DurianModule.None"/> is not a valid Durian module.</exception> public static ModuleContainer GetEnabledModules(this Assembly assembly, params DurianModule[]?modules) { if (assembly is null) { throw new ArgumentNullException(nameof(assembly)); } if (modules is null || modules.Length == 0) { return(new ModuleContainer()); } foreach (DurianModule module in modules) { ModuleIdentity.EnsureIsValidModuleEnum(module); } EnableModuleAttribute[] attributes = assembly.GetCustomAttributes <EnableModuleAttribute>().ToArray(); if (attributes.Length == 0) { return(new ModuleContainer()); } ModuleContainer container = new(modules.Length); foreach (DurianModule module in modules) { if (!container.Contains(module) && IsEnabled_Internal(attributes, module)) { container.Include(module); } } return(container); }
/// <summary> /// Initializes a new instance of the <see cref="ModuleReference"/> class. /// </summary> /// <param name="module">The module this <see cref="ModuleReference"/> references.</param> /// <exception cref="InvalidOperationException">Unknown <see cref="DurianModule"/> value detected. -or- <see cref="DurianModule.None"/> is not a valid Durian module.</exception> public ModuleReference(DurianModule module) { ModuleIdentity.EnsureIsValidModuleEnum(module); EnumValue = module; }