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();
}
}
}