using Google.Protobuf; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using Tango.DataStore; using Tango.DataStore.Remote; using Tango.FSE.Common.Connection; namespace Tango.FSE.UI.DataStore { public class RemoteDataStoreCollection : IDataStoreCollection { private IMachineProvider _machineProvider; public string Name { get; } public RemoteDataStoreCollection(String name, IMachineProvider machineProvider) { Name = name; _machineProvider = machineProvider; } public void Put(string key, T value) { Put(key, (object)value); } public void Put(string key, object value) { Put(key, DataStoreHelper.GetDataType(value), value); } public void Put(string key, DataType type, object value) { if (type == DataType.Proto) { if (value is IMessage protoMessage) { value = DataStoreProtoObject.FromMessage(protoMessage); } else { throw new InvalidOperationException("DataType if Proto but actual message is not part of the PMR."); } } var result = _machineProvider.MachineOperator.SendGenericRequest(new RemoteDataStorePutRequest() { Collection = Name, DataType = type, Key = key, Value = value }).Result; } public T Get(string key) { return (T)Convert.ChangeType(Get(key, null), typeof(T)); } public T Get(string key, T defaultValue) { return (T)Convert.ChangeType(Get(key, (object)defaultValue), typeof(T)); } public object Get(string key) { return Get(key, null); } public object Get(string key, object defaultValue) { if (defaultValue is IMessage defaultValueMessage) { defaultValue = DataStoreProtoObject.FromMessage(defaultValueMessage); } var result = _machineProvider.MachineOperator.SendGenericRequest(new RemoteDataStoreGetRequest() { Collection = Name, Key = key, DefaultValue = defaultValue, }).Result; if (result.DataType == DataType.Proto) { return result.ProtoObject.Message; } return result.Value; } public List GetAll() { var result = _machineProvider.MachineOperator.SendGenericRequest(new RemoteDataStoreGetAllRequest() { Collection = Name }).Result; return result.Items.Cast().ToList(); } public void Delete(string key) { var result = _machineProvider.MachineOperator.SendGenericRequest(new RemoteDataStoreDeleteRequest() { Collection = Name, Key = key }).Result; } public void DeleteAll() { var result = _machineProvider.MachineOperator.SendGenericRequest(new RemoteDataStoreDeleteAllRequest() { Collection = Name, }).Result; } public int Count() { var result = _machineProvider.MachineOperator.SendGenericRequest(new RemoteDataStoreCountRequest() { Collection = Name }).Result; return result.Count; } public IDataStoreItem GetItem(string key) { return GetItem(key, null); } public IDataStoreItem GetItem(string key, object defaultValue) { if (defaultValue is IMessage defaultValueMessage) { defaultValue = DataStoreProtoObject.FromMessage(defaultValueMessage); } var result = _machineProvider.MachineOperator.SendGenericRequest(new RemoteDataStoreGetItemRequest() { Collection = Name, Key = key, DefaultValue = defaultValue }).Result; return result.Item; } public List GetUnsynchronized() { return GetAll().Where(x => !x.IsSynchronized).ToList(); } } }