package storage import ( "crypto/rand" "errors" "math/big" "strings" ) var ErrNoSuchFile = errors.New("no such file") type Storage struct { files map[string]File } func NewStorage() *Storage { return &Storage{ files: make(map[string]File), } } func generateKey(length uint) (string, error) { key := make([]string, 0, 0) alphabet := "ABCDEFGHIJKLMNOPQRSTUVWXYZ123456789abcdefghkmnpqrstuvwxyz" for i := uint(0); i < length; i++ { n, err := rand.Int(rand.Reader, big.NewInt(int64(len(alphabet)))) if err != nil { return "", err } key = append(key, string(alphabet[n.Int64()])) } return strings.Join(key, ""), nil } func (s *Storage) Get(key string) (*File, error) { if file, ok := s.files[key]; ok { return &file, nil } else { return nil, ErrNoSuchFile } } func (s *Storage) Put(file File) (string, error) { key, err := generateKey(8) if err != nil { return "", err } s.files[key] = file return key, nil }