package storage

import (
	"bytes"
	"errors"
	"io"
)

type Storage struct {
	data map[string][]byte
}

func (storage *Storage) CopyObjectToWriter(w io.Writer, bucket string, object string) error {
	// TODO synchronize access
	// get object
	key := bucket + ":" + object
	if val, ok := storage.data[key]; ok {
		objectBuffer := bytes.NewBuffer(val)
		_, err := io.Copy(w, objectBuffer)
		return err
	} else {
		return errors.New("Not Found")
	}
}

func (storage *Storage) StoreObject(bucket string, object string, data io.Reader) {
	key := bucket + ":" + object
	var bytesBuffer bytes.Buffer
	if _, ok := io.Copy(&bytesBuffer, data); ok == nil {
		storage.data[key] = bytesBuffer.Bytes()
	}
}

func Start() (chan<- string, <-chan error, *Storage) {
	ctrlChannel := make(chan string)
	errorChannel := make(chan error)
	go start(ctrlChannel, errorChannel)
	return ctrlChannel, errorChannel, &Storage{}
}

func start(ctrlChannel <-chan string, errorChannel chan<- error) {
	errorChannel <- errors.New("STORAGE MSG")
	errorChannel <- errors.New("STORAGE MSG")
	errorChannel <- errors.New("STORAGE MSG")
	close(errorChannel)
}

package storage

import (
	"bytes"
	"errors"
	"io"
)

type Storage struct {
	data map[string][]byte
}

func (storage *Storage) CopyObjectToWriter(w io.Writer, bucket string, object string) error {
	// TODO synchronize access
	// get object
	key := bucket + ":" + object
	if val, ok := storage.data[key]; ok {
		objectBuffer := bytes.NewBuffer(val)
		_, err := io.Copy(w, objectBuffer)
		return err
	} else {
		return errors.New("Not Found")
	}
}

func (storage *Storage) StoreObject(bucket string, object string, data io.Reader) {
	key := bucket + ":" + object
	var bytesBuffer bytes.Buffer
	if _, ok := io.Copy(&bytesBuffer, data); ok == nil {
		storage.data[key] = bytesBuffer.Bytes()
	}
}

func Start() (chan<- string, <-chan error, *Storage) {
	ctrlChannel := make(chan string)
	errorChannel := make(chan error)
	go start(ctrlChannel, errorChannel)
	return ctrlChannel, errorChannel, &Storage{
		data: make(map[string][]byte),
	}
}

func start(ctrlChannel <-chan string, errorChannel chan<- error) {
	errorChannel <- errors.New("STORAGE MSG")
	errorChannel <- errors.New("STORAGE MSG")
	errorChannel <- errors.New("STORAGE MSG")
	close(errorChannel)
}

Store objects in memory map
Store objects in memory map
