You are an expert in writing code in many different languages. Your goal is to perform code completion for the following code, keeping in mind the rest of the code and the file meta data.
    Metadata details:
    filename: copy.go
    path of file: ./repos/google-cloud-go/storage
    
    the code of the file until where you have to start completion: // Copyright 2016 Google LLC
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//      http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

package storage

import (
	"context"
	"errors"
	"fmt"

	"cloud.google.com/go/internal/trace"
)

// CopierFrom creates a Copier that can copy src to dst.
// You can immediately call Run on the returned Copier, or
// you can configure it first.
//
// For Requester Pays buckets, the user project of dst is billed, unless it is empty,
// in which case the user project of src is billed.
func (dst *ObjectHandle) CopierFrom(src *ObjectHandle) *Copier {
	return &Copier{dst: dst, src: src}
}

// A Copier copies a source object to a destination.
type Copier struct {
	// ObjectAttrs are optional attributes to set on the destination object.
	// Any attributes must be initialized before any calls on the Copier. Nil
	// or zero-va
    
func (c *Composer) Run(ctx context.Context) (attrs *ObjectAttrs, err error) {
	ctx = trace.StartSpan(ctx, "cloud.google.com/go/storage.Composer.Run")
	defer func() { trace.EndSpan(ctx, err) }()

	if err := c.dst.validate(); err != nil {
		return nil, err
	}
	if c.dst.gen != defaultGen {
		return nil, fmt.Errorf("storage: generation cannot be specified on compose destination, got %v", c.dst.gen)
	}
	if len(c.srcs) == 0 {
		return nil, errors.New("storage: at least one source object must be specified")
	}

	for _, src := range c.srcs {
		if err := src.validate(); err != nil {
			return nil, err
		}
		if src.bucket != c.dst.bucket {
			return nil, fmt.Errorf("storage: all source objects must be in bucket %q, found %q", c.dst.bucket, src.bucket)
		}
		if src.encryptionKey != nil {
			return nil, fmt.Errorf("storage: compose source %s.%s must not have encryption key", src.bucket, src.object)
		}
	}

	req := &composeObjectRequest{
		dstBucket:     c.dst.bucket,
		predefinedACL: c.PredefinedACL,
		sendCRC32C:    c.SendCRC32C,
	}
	req.dstObject = destinationObject{
		name:          c.dst.object,
		bucket:        c.dst.bucket,
		conds:         c.dst.conds,
		attrs:         &c.ObjectAttrs,
		encryptionKey: c.dst.encryptionKey,
	}
	for _, src := range c.srcs {
		s := sourceObject{
			name:   src.object,
			bucket: src.bucket,
			gen:    src.gen,
			conds:  src.conds,
		}
		req.srcs = append(req.srcs, s)
	}

	isIdempotent := c.dst.conds != nil && (c.dst.conds.GenerationMatch != 0 || c.dst.conds.DoesNotExist)
	opts := makeStorageOpts(isIdempotent, c.dst.retry, c.dst.userProject)
	return c.dst.c.tc.ComposeObject(ctx, req, opts...)
}