< Summary

Class:DCL.ECSRuntime.ECSComponentWriterSerializer[T]
Assembly:DCL.ECSRuntime.ComponentWriter
File(s):/tmp/workspace/unity-renderer/unity-renderer/Assets/Scripts/MainScripts/DCL/WorldRuntime/ECSRuntime/ComponentWriter/ECSComponentWriter.cs
Covered lines:4
Uncovered lines:0
Coverable lines:4
Total lines:144
Line coverage:100% (4 of 4)
Covered branches:0
Total branches:0
Covered methods:2
Total methods:2
Method coverage:100% (2 of 2)

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity NPath complexity Sequence coverage
Serializer(...)0%110100%
Serialize(...)0%110100%

File(s)

/tmp/workspace/unity-renderer/unity-renderer/Assets/Scripts/MainScripts/DCL/WorldRuntime/ECSRuntime/ComponentWriter/ECSComponentWriter.cs

#LineLine coverage
 1using DCL.Controllers;
 2using DCL.CRDT;
 3using DCL.Models;
 4using System;
 5using System.Collections.Generic;
 6using UnityEngine;
 7
 8namespace DCL.ECSRuntime
 9{
 10    public class ECSComponentWriter : IECSComponentWriter
 11    {
 12        private abstract class Serializer
 13        {
 14            private readonly Type targetType;
 15
 16            protected Serializer(Type targetType)
 17            {
 18                this.targetType = targetType;
 19            }
 20
 21            public bool CheckType(Type expectedType) =>
 22                targetType == expectedType;
 23
 24            public abstract byte[] Serialize(object obj);
 25        }
 26
 27        private class Serializer<T> : Serializer
 28        {
 29            private readonly Func<T, byte[]> serialize;
 30
 3831            public Serializer(Func<T, byte[]> serialize) : base(typeof(T))
 32            {
 3833                this.serialize = serialize;
 3834            }
 35
 36            public override byte[] Serialize(object obj) =>
 137                serialize((T)obj);
 38        }
 39
 40        public delegate void WriteComponent(int sceneNumber, long entityId, int componentId, byte[] data,
 41            int minTimeStamp, ECSComponentWriteType writeType, CrdtMessageType messageType);
 42
 43        private readonly Dictionary<int, Serializer> serializers = new ();
 44        private WriteComponent writeComponent;
 45
 46        public ECSComponentWriter(WriteComponent writeComponent)
 47        {
 48            this.writeComponent = writeComponent;
 49        }
 50
 51        public ECSComponentWriter() { }
 52
 53        public void AddOrReplaceComponentSerializer<T>(int componentId, Func<T, byte[]> serializer)
 54        {
 55            serializers[componentId] = new Serializer<T>(serializer);
 56        }
 57
 58        public void RemoveComponentSerializer(int componentId)
 59        {
 60            serializers.Remove(componentId);
 61        }
 62
 63        public void PutComponent<T>(IParcelScene scene, IDCLEntity entity, int componentId, T model, ECSComponentWriteTy
 64        {
 65            PutComponent(scene.sceneData.sceneNumber, entity.entityId, componentId, model, -1, writeType);
 66        }
 67
 68        public void PutComponent<T>(int sceneNumber, long entityId, int componentId, T model, ECSComponentWriteType writ
 69        {
 70            PutComponent(sceneNumber, entityId, componentId, model, -1, writeType);
 71        }
 72
 73        public void PutComponent<T>(int sceneNumber, long entityId, int componentId, T model, int minTimeStamp,
 74            ECSComponentWriteType writeType)
 75        {
 76            PutComponent(typeof(T), sceneNumber, entityId, componentId, model, minTimeStamp, writeType);
 77        }
 78
 79        public void PutComponent(Type componentType, int sceneNumber, long entityId, int componentId, object model,
 80            ECSComponentWriteType writeType)
 81        {
 82            PutComponent(componentType, sceneNumber, entityId, componentId, model, -1, writeType);
 83        }
 84
 85        public void PutComponent(Type componentType, int sceneNumber, long entityId, int componentId, object model,
 86            int minTimeStamp, ECSComponentWriteType writeType)
 87        {
 88            if (!serializers.TryGetValue(componentId, out Serializer serializer))
 89            {
 90                Debug.LogError($"Trying to write component but no serializer was found for {componentId}");
 91                return;
 92            }
 93
 94            if (serializer.CheckType(componentType))
 95            {
 96                writeComponent(sceneNumber, entityId, componentId, serializer.Serialize(model), minTimeStamp, writeType,
 97            }
 98            else
 99            {
 100                Debug.LogError($"Trying to write component but serializer for {componentId} does not match {componentTyp
 101            }
 102        }
 103
 104        public void RemoveComponent(int sceneNumber, long entityId, int componentId, ECSComponentWriteType writeType)
 105        {
 106            RemoveComponent(sceneNumber, entityId, componentId, -1, writeType);
 107        }
 108
 109        public void RemoveComponent(int sceneNumber, long entityId, int componentId, int minTimeStamp, ECSComponentWrite
 110        {
 111            writeComponent(sceneNumber, entityId, componentId, null, minTimeStamp, writeType, CrdtMessageType.DELETE_COM
 112        }
 113
 114        public void AppendComponent(Type componentType, int sceneNumber, long entityId, int componentId, object model,
 115            ECSComponentWriteType writeType)
 116        {
 117            if (!serializers.TryGetValue(componentId, out Serializer serializer))
 118            {
 119                Debug.LogError($"Trying to write an append component but no serializer was found for {componentId}");
 120                return;
 121            }
 122
 123            if (serializer.CheckType(componentType))
 124            {
 125                writeComponent(sceneNumber, entityId, componentId, serializer.Serialize(model), -1, writeType, CrdtMessa
 126            }
 127            else
 128            {
 129                Debug.LogError($"Trying to write component but serializer for {componentId} does not match {componentTyp
 130            }
 131        }
 132
 133        public void AppendComponent<T>(int sceneNumber, long entityId, int componentId, T model, ECSComponentWriteType w
 134        {
 135            AppendComponent(typeof(T), sceneNumber, entityId, componentId, model, writeType);
 136        }
 137
 138        public void Dispose()
 139        {
 140            serializers.Clear();
 141            writeComponent = null;
 142        }
 143    }
 144}