package blobstore

import (
	"io"

	"code.google.com/p/go.net/context"
)

type Blobstore interface {
	// Del removes an object from the blobstore.
	Del(path string) error

	// Get retrieves an object from the blobstore.
	Get(path string) ([]byte, error)

	// GetReader retrieves an object from the blobstore.
	// It is the caller's responsibility to call Close on
	// the ReadCloser when finished reading.
	GetReader(path string) (io.ReadCloser, error)

	// Put inserts an object into the blobstore.
	Put(path string, data []byte) error

	// PutReader inserts an object into the blobstore by
	// consuming data from r until EOF.
	PutReader(path string, r io.Reader) error
}

// Del removes an object from the blobstore.
func Del(c context.Context, path string) error {
	return FromContext(c).Del(path)
}

// Get retrieves an object from the blobstore.
func Get(c context.Context, path string) ([]byte, error) {
	return FromContext(c).Get(path)
}

// GetReader retrieves an object from the blobstore.
// It is the caller's responsibility to call Close on
// the ReadCloser when finished reading.
func GetReader(c context.Context, path string) (io.ReadCloser, error) {
	return FromContext(c).GetReader(path)
}

// Put inserts an object into the blobstore.
func Put(c context.Context, path string, data []byte) error {
	return FromContext(c).Put(path, data)
}

// PutReader inserts an object into the blobstore by
// consuming data from r until EOF.
func PutReader(c context.Context, path string, r io.Reader) error {
	return FromContext(c).PutReader(path, r)
}