using MxGateway.Contracts.Proto.Galaxy;
using MxGateway.Server.Galaxy;
namespace MxGateway.Server.Grpc;
///
/// Maps + rows produced
/// by into galaxy_repository.v1 proto messages.
/// Pure function, separated so it can be unit-tested without a SQL connection.
///
public static class GalaxyProtoMapper
{
/// Maps Galaxy hierarchy and attribute rows to Galaxy object protos.
/// Hierarchy rows from Galaxy Repository.
/// Attribute rows from Galaxy Repository.
public static IEnumerable MapHierarchy(
IReadOnlyList hierarchy,
IReadOnlyList attributes)
{
Dictionary> attributesByGobjectId = attributes
.GroupBy(a => a.GobjectId)
.ToDictionary(g => g.Key, g => g.ToList());
foreach (GalaxyHierarchyRow row in hierarchy)
{
yield return MapObject(row, attributesByGobjectId);
}
}
/// Maps a Galaxy hierarchy row to a Galaxy object proto.
/// Hierarchy row from Galaxy Repository.
/// Attributes indexed by gobject ID.
public static GalaxyObject MapObject(
GalaxyHierarchyRow row,
IReadOnlyDictionary> attributesByGobjectId)
{
GalaxyObject obj = new()
{
GobjectId = row.GobjectId,
TagName = row.TagName,
ContainedName = row.ContainedName,
BrowseName = row.BrowseName,
ParentGobjectId = row.ParentGobjectId,
IsArea = row.IsArea,
CategoryId = row.CategoryId,
HostedByGobjectId = row.HostedByGobjectId,
};
obj.TemplateChain.AddRange(row.TemplateChain);
if (attributesByGobjectId.TryGetValue(row.GobjectId, out List? attrs))
{
foreach (GalaxyAttributeRow attr in attrs)
{
obj.Attributes.Add(MapAttribute(attr));
}
}
return obj;
}
/// Maps a Galaxy attribute row to a Galaxy attribute proto.
/// Attribute row from Galaxy Repository.
public static GalaxyAttribute MapAttribute(GalaxyAttributeRow row) => new()
{
AttributeName = row.AttributeName,
FullTagReference = row.FullTagReference,
MxDataType = row.MxDataType,
DataTypeName = row.DataTypeName ?? string.Empty,
IsArray = row.IsArray,
ArrayDimension = row.ArrayDimension ?? 0,
ArrayDimensionPresent = row.ArrayDimension.HasValue,
MxAttributeCategory = row.MxAttributeCategory,
SecurityClassification = row.SecurityClassification,
IsHistorized = row.IsHistorized,
IsAlarm = row.IsAlarm,
};
}