[#58] Observable client cut

Signed-off-by: Pavel Gross <p.gross@yadro.com>
This commit is contained in:
Pavel Gross 2025-04-11 15:18:18 +03:00 committed by PavelGrossSpb
parent 5f451c8818
commit c88eea1f82
7 changed files with 328 additions and 56 deletions

View file

@ -0,0 +1,8 @@
using System;
namespace FrostFS.SDK.Client;
public class PartUploadedEventArgs(ObjectPartInfo part) : EventArgs
{
public ObjectPartInfo Part { get; } = part;
}

View file

@ -0,0 +1,38 @@
using FrostFS.SDK;
namespace FrostFS.SDK.Client;
public readonly struct ObjectPartInfo(long offset, int length, FrostFsObjectId objectId) : System.IEquatable<ObjectPartInfo>
{
public long Offset { get; } = offset;
public int Length { get; } = length;
public FrostFsObjectId ObjectId { get; } = objectId;
public override bool Equals(object obj)
{
if (obj == null || obj is not ObjectPartInfo)
return false;
return Equals((ObjectPartInfo)obj);
}
public override int GetHashCode()
{
return ((int)(Offset >> 32)) ^ (int)Offset ^ Length ^ ObjectId.Value.GetHashCode();
}
public static bool operator ==(ObjectPartInfo left, ObjectPartInfo right)
{
return left.Equals(right);
}
public static bool operator !=(ObjectPartInfo left, ObjectPartInfo right)
{
return !(left == right);
}
public bool Equals(ObjectPartInfo other)
{
return GetHashCode() == other.GetHashCode();
}
}

View file

@ -0,0 +1,48 @@
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Linq;
namespace FrostFS.SDK.Client;
public class UploadProgressInfo
{
private List<ObjectPartInfo> _parts;
public UploadProgressInfo(Guid splitId, int capacity = 8)
{
_parts = new List<ObjectPartInfo>(capacity);
SplitId = new SplitId(splitId);
}
public UploadProgressInfo(Guid splitId, Collection<ObjectPartInfo> parts)
{
_parts = [.. parts];
SplitId = new SplitId(splitId);
}
public event EventHandler<PartUploadedEventArgs>? Notify;
public SplitId SplitId { get; }
internal void AddPart(ObjectPartInfo part)
{
_parts.Add(part);
Notify?.Invoke(this, new PartUploadedEventArgs(part));
}
public ObjectPartInfo GetPart(int index)
{
return _parts[index];
}
public ObjectPartInfo GetLast()
{
return _parts.LastOrDefault();
}
public ReadOnlyCollection<ObjectPartInfo> GetParts()
{
return new ReadOnlyCollection<ObjectPartInfo>(_parts);
}
}