csharp-sdk-upm/Storage/Storage/Internal/Operation/AVAddOperation.cs

54 lines
1.8 KiB
C#

using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Linq;
using LeanCloud.Utilities;
namespace LeanCloud.Storage.Internal {
public class AVAddOperation : IAVFieldOperation {
private readonly ReadOnlyCollection<object> objects;
public AVAddOperation(IEnumerable<object> objects) {
this.objects = new ReadOnlyCollection<object>(objects.ToList());
}
public object Encode() {
return new Dictionary<string, object> {
{ "__op", "Add" },
{ "objects", PointerOrLocalIdEncoder.Instance.Encode(objects) }
};
}
public IAVFieldOperation MergeWithPrevious(IAVFieldOperation previous) {
if (previous == null) {
return this;
}
if (previous is AVDeleteOperation) {
return new AVSetOperation(objects.ToList());
}
if (previous is AVSetOperation setOp) {
var oldList = Conversion.To<IList<object>>(setOp.Value);
return new AVSetOperation(oldList.Concat(objects).ToList());
}
if (previous is AVAddOperation) {
return new AVAddOperation(((AVAddOperation)previous).Objects.Concat(objects));
}
throw new InvalidOperationException("Operation is invalid after previous operation.");
}
public object Apply(object oldValue, string key) {
if (oldValue == null) {
return objects.ToList();
}
var oldList = Conversion.To<IList<object>>(oldValue);
return oldList.Concat(objects).ToList();
}
public IEnumerable<object> Objects {
get {
return objects;
}
}
}
}