/// <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> /// Converts a collection of <see cref="DurianModule"/>s into an array of <see cref="ModuleIdentity"/>s. /// </summary> /// <param name="modules">A collection of <see cref="DurianModule"/>s to convert.</param> /// <exception cref="ArgumentNullException"><paramref name="modules"/> is <see langword="null"/>.</exception> /// <exception cref="InvalidOperationException">Unknown <see cref="DurianModule"/> value detected.</exception> public static ModuleIdentity[] ToIdentities(IEnumerable <DurianModule> modules) { if (modules is null) { throw new ArgumentNullException(nameof(modules)); } DurianModule[] array = modules.ToArray(); if (array.Length == 0) { return(Array.Empty <ModuleIdentity>()); } ModuleIdentity[] identities = new ModuleIdentity[array.Length]; for (int i = 0; i < identities.Length; i++) { identities[i] = ModuleIdentity.GetModule(array[i]); } return(identities); }
/// <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); }
internal PackageReference(DurianPackage package, ModuleIdentity onAllocate) { EnumValue = package; _onAllocate = onAllocate; }
/// <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; }
/// <summary> /// Returns a collection of <see cref="TypeIdentity"/>s representing all <see cref="Type"/>s declared in the <c>Durian.Core</c> package that are part of any existing Durian module. /// </summary> public static IEnumerable <TypeIdentity> GetAllTypes() { ModuleIdentity[] identities = ModuleIdentity.GetAllModules().AsIdentities(); return(GetAllTypes(identities)); }