package blob import ( "context" "io" "forge.cadoles.com/arcad/edge/pkg/storage" "github.com/pkg/errors" ) type NewBlobWriterArgs struct { BlobID storage.BlobID BucketID BucketID } type NewBlobWriterReply struct { WriterID WriterID } func (s *Service) NewBlobWriter(ctx context.Context, args *NewBlobWriterArgs, reply *NewBlobWriterReply) error { bucket, err := s.getOpenedBucket(args.BucketID) if err != nil { return errors.WithStack(err) } writerID, err := NewWriterID() if err != nil { return errors.WithStack(err) } writer, err := bucket.NewWriter(ctx, args.BlobID) if err != nil { return errors.WithStack(err) } s.writers.Store(writerID, writer) *reply = NewBlobWriterReply{ WriterID: writerID, } return nil } func (s *Service) getOpenedWriter(id WriterID) (io.WriteCloser, error) { raw, exists := s.writers.Load(id) if !exists { return nil, errors.Errorf("could not find writer '%s'", id) } writer, ok := raw.(io.WriteCloser) if !ok { return nil, errors.Errorf("unexpected type '%T' for writer", raw) } return writer, nil }