CultLib/src/GameCult.Mesh/CultMeshDocumentRegistries.cs
2026-07-20 01:48:56 +01:00

105 lines
4.1 KiB
C#

using System;
using System.Collections.Generic;
using System.Linq;
using GameCult.Caching;
using GameCult.Networking;
namespace GameCult.Mesh
{
public static partial class CultMesh
{
/// <summary>
/// Creates a CultCache document registry and resolves the supplied document types into it.
/// </summary>
public static CultDocumentRegistry CreateCultCacheDocumentRegistry(params Type[] documentTypes)
{
return CreateCultCacheDocumentRegistry((IEnumerable<Type>)documentTypes);
}
/// <summary>
/// Creates a CultCache document registry and resolves the supplied document types into it.
/// </summary>
public static CultDocumentRegistry CreateCultCacheDocumentRegistry(IEnumerable<Type> documentTypes)
{
if (documentTypes == null)
{
throw new ArgumentNullException(nameof(documentTypes));
}
return CultDocumentRegistry.ForTypes(DistinctDocumentTypes(documentTypes));
}
/// <summary>
/// Creates a CultNet document registry with default bindings for the supplied document types.
/// </summary>
public static CultNetDocumentRegistry CreateCultNetDocumentRegistry(params Type[] documentTypes)
{
return CreateCultNetDocumentRegistry((IEnumerable<Type>)documentTypes);
}
/// <summary>
/// Creates a CultNet document registry with default bindings for the supplied document types.
/// </summary>
public static CultNetDocumentRegistry CreateCultNetDocumentRegistry(IEnumerable<Type> documentTypes)
{
return CreateCultNetDocumentRegistry(documentTypes, null);
}
/// <summary>
/// Creates a CultNet document registry with default bindings for the supplied document types.
/// </summary>
public static CultNetDocumentRegistry CreateCultNetDocumentRegistry(
IEnumerable<Type> 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;
}
/// <summary>
/// Creates a CultNet document registry with default bindings for the supplied document types.
/// </summary>
public static CultNetDocumentRegistry CreateCultNetDocumentRegistry(
CultDocumentRegistry documents,
params Type[] documentTypes)
{
return CreateCultNetDocumentRegistry(documentTypes, documents);
}
/// <summary>
/// Creates a CultNet document registry with default bindings for the supplied document types.
/// </summary>
public static CultNetDocumentRegistry CreateCultNetDocumentRegistry(
CultDocumentRegistry documents,
IEnumerable<Type> documentTypes)
{
return CreateCultNetDocumentRegistry(documentTypes, documents);
}
private static IEnumerable<Type> DistinctDocumentTypes(IEnumerable<Type> documentTypes)
{
return documentTypes
.Select(documentType => documentType ?? throw new ArgumentException(
"Document type collections cannot contain null entries.",
nameof(documentTypes)))
.Distinct();
}
}
}