using System; using System.Collections.Generic; using System.Linq; using GameCult.Caching; using GameCult.Networking; namespace GameCult.Mesh { public static partial class CultMesh { /// /// Creates a CultCache document registry and resolves the supplied document types into it. /// public static CultDocumentRegistry CreateCultCacheDocumentRegistry(params Type[] documentTypes) { return CreateCultCacheDocumentRegistry((IEnumerable)documentTypes); } /// /// Creates a CultCache document registry and resolves the supplied document types into it. /// public static CultDocumentRegistry CreateCultCacheDocumentRegistry(IEnumerable documentTypes) { if (documentTypes == null) { throw new ArgumentNullException(nameof(documentTypes)); } return CultDocumentRegistry.ForTypes(DistinctDocumentTypes(documentTypes)); } /// /// Creates a CultNet document registry with default bindings for the supplied document types. /// public static CultNetDocumentRegistry CreateCultNetDocumentRegistry(params Type[] documentTypes) { return CreateCultNetDocumentRegistry((IEnumerable)documentTypes); } /// /// Creates a CultNet document registry with default bindings for the supplied document types. /// public static CultNetDocumentRegistry CreateCultNetDocumentRegistry(IEnumerable documentTypes) { return CreateCultNetDocumentRegistry(documentTypes, null); } /// /// Creates a CultNet document registry with default bindings for the supplied document types. /// public static CultNetDocumentRegistry CreateCultNetDocumentRegistry( IEnumerable documentTypes, CultDocumentRegistry? documents) { if (documentTypes == null) { throw new ArgumentNullException(nameof(documentTypes)); } documents ??= CreateCultCacheDocumentRegistry(documentTypes); var registry = new CultNetDocumentRegistry(documents); var descriptors = DistinctDocumentTypes(documentTypes) .Select(documentType => documents.GetRequired(documentType)) .ToArray(); foreach (var descriptorGroup in descriptors.GroupBy(descriptor => descriptor.SchemaId, StringComparer.Ordinal)) { foreach (var descriptor in descriptorGroup.Reverse()) { registry.Register(CultNetDocumentBinding.ForDocument(descriptor.DocumentType, documents)); } } return registry; } /// /// Creates a CultNet document registry with default bindings for the supplied document types. /// public static CultNetDocumentRegistry CreateCultNetDocumentRegistry( CultDocumentRegistry documents, params Type[] documentTypes) { return CreateCultNetDocumentRegistry(documentTypes, documents); } /// /// Creates a CultNet document registry with default bindings for the supplied document types. /// public static CultNetDocumentRegistry CreateCultNetDocumentRegistry( CultDocumentRegistry documents, IEnumerable documentTypes) { return CreateCultNetDocumentRegistry(documentTypes, documents); } private static IEnumerable DistinctDocumentTypes(IEnumerable documentTypes) { return documentTypes .Select(documentType => documentType ?? throw new ArgumentException( "Document type collections cannot contain null entries.", nameof(documentTypes))) .Distinct(); } } }