package transformer import ( "context" objectSDK "git.frostfs.info/TrueCloudLab/frostfs-sdk-go/object" "github.com/nspcc-dev/neo-go/pkg/util/slice" ) type chanTarget struct { header *objectSDK.Object payload []byte ch chan<- *objectSDK.Object } // NewChannelTarget returns ObjectTarget which writes // object parts to a provided channel. func NewChannelTarget(ch chan<- *objectSDK.Object) ObjectTarget { return &chanTarget{ ch: ch, } } // WriteHeader implements the ObjectTarget interface. func (c *chanTarget) WriteHeader(_ context.Context, object *objectSDK.Object) error { c.header = object return nil } // Write implements the ObjectTarget interface. func (c *chanTarget) Write(_ context.Context, p []byte) (n int, err error) { c.payload = append(c.payload, p...) return len(p), nil } // Close implements the ObjectTarget interface. func (c *chanTarget) Close(ctx context.Context) (*AccessIdentifiers, error) { if len(c.payload) != 0 { c.header.SetPayload(slice.Copy(c.payload)) } select { case c.ch <- c.header: case <-ctx.Done(): return nil, ctx.Err() } c.header = nil c.payload = nil return new(AccessIdentifiers), nil }