using System; using System.Collections.ObjectModel; using System.Linq; using FrostFS.SDK.ClientV2; using FrostFS.SDK.ClientV2.Mappers.GRPC; using FrostFS.SDK.Cryptography; using Google.Protobuf; namespace FrostFS.SDK; public class FrostFsContainerInfo { private Container.Container.Types.Attribute[]? grpsAttributes; private ReadOnlyCollection? attributes; private FrostFsPlacementPolicy? placementPolicy; private Guid? nonce; private Container.Container? container; public FrostFsContainerInfo( FrostFsPlacementPolicy placementPolicy, FrostFsAttributePair[]? attributes = null, FrostFsVersion? version = null, FrostFsOwner? owner = null, Guid? nonce = null) { this.placementPolicy = placementPolicy; Version = version; Owner = owner; this.nonce = nonce; if (attributes != null) this.attributes = new ReadOnlyCollection(attributes); } internal FrostFsContainerInfo(Container.Container container) { this.container = container; } public Guid Nonce { get { nonce ??= container?.Nonce != null ? container.Nonce.ToUuid() : Guid.NewGuid(); return nonce.Value; } } public FrostFsPlacementPolicy? PlacementPolicy { get { placementPolicy ??= container?.PlacementPolicy?.ToModel(); return placementPolicy; } } public ReadOnlyCollection? Attributes { get { if (attributes == null && grpsAttributes != null) attributes = new ReadOnlyCollection(grpsAttributes.Select(a => new FrostFsAttributePair(a.Key, a.Value)).ToList()); return attributes; } } public FrostFsVersion? Version { get; private set; } public FrostFsOwner? Owner { get; private set; } internal Container.Container.Types.Attribute[]? GetGrpsAttributes() { grpsAttributes ??= Attributes? .Select(a => new Container.Container.Types.Attribute { Key = a.Key, Value = a.Value }) .ToArray(); return grpsAttributes; } internal Container.Container GetContainer() { if (this.container == null) { if (PlacementPolicy == null) { throw new ArgumentNullException("PlacementPolicy is null"); } this.container = new Container.Container() { PlacementPolicy = PlacementPolicy.Value.GetPolicy(), Nonce = ByteString.CopyFrom(Nonce.ToBytes()), OwnerId = Owner?.OwnerID, Version = Version?.Version }; var attribs = GetGrpsAttributes(); if (attribs != null) this.container.Attributes.AddRange(attribs); } return this.container; } }