gte/pkg/mstore/memory.go

85 lines
1.6 KiB
Go
Raw Normal View History

2021-01-28 09:40:08 +01:00
package mstore
2021-01-28 14:43:00 +01:00
import (
"errors"
"sort"
)
var (
ErrInvalidFolderSet = errors.New("invalid folder set")
ErrInvalidFolderName = errors.New("invalid folder name")
)
2021-01-28 09:40:08 +01:00
type Memory struct {
2021-01-28 14:43:00 +01:00
nextUid uint32
2021-01-30 11:20:12 +01:00
folders []string
2021-01-28 14:43:00 +01:00
messages map[string][]*Message
}
func NewMemory(folders []string) (*Memory, error) {
if len(folders) == 0 {
return &Memory{}, ErrInvalidFolderSet
}
2021-01-30 11:20:12 +01:00
sort.Strings(folders)
2021-01-28 14:43:00 +01:00
msg := make(map[string][]*Message)
for _, f := range folders {
if f == "" {
return &Memory{}, ErrInvalidFolderName
}
msg[f] = []*Message{}
}
return &Memory{
messages: msg,
2021-01-30 11:20:12 +01:00
folders: folders,
2021-01-28 14:43:00 +01:00
nextUid: uint32(1),
}, nil
}
2021-01-29 12:29:23 +01:00
func (mem *Memory) Add(folder, subject, body string) error {
2021-01-28 14:43:00 +01:00
if subject == "" {
return ErrInvalidMessage
}
2021-01-29 12:29:23 +01:00
if _, ok := mem.messages[folder]; !ok {
return ErrFolderDoesNotExist
2021-01-28 14:43:00 +01:00
}
2021-01-29 12:29:23 +01:00
mem.messages[folder] = append(mem.messages[folder], &Message{
2021-01-28 14:43:00 +01:00
Uid: mem.nextUid,
2021-01-30 11:20:12 +01:00
Folder: folder,
2021-01-28 14:43:00 +01:00
Subject: subject,
Body: body,
})
mem.nextUid++
return nil
}
2021-01-30 11:20:12 +01:00
func (mem *Memory) Messages(folder string) ([]*Message, error) {
if _, ok := mem.messages[folder]; !ok {
return []*Message{}, ErrFolderDoesNotExist
2021-01-28 14:43:00 +01:00
}
2021-01-30 11:20:12 +01:00
return mem.messages[folder], nil
2021-01-28 14:43:00 +01:00
}
2021-01-30 11:20:12 +01:00
func (mem *Memory) Remove(msg *Message) error {
if msg == nil || !msg.Valid() {
return ErrInvalidMessage
2021-01-28 14:43:00 +01:00
}
2021-01-30 11:20:12 +01:00
if _, ok := mem.messages[msg.Folder]; !ok {
return ErrFolderDoesNotExist
2021-01-28 14:43:00 +01:00
}
2021-01-30 11:20:12 +01:00
for i, m := range mem.messages[msg.Folder] {
if m.Uid == msg.Uid {
mem.messages[msg.Folder] = append(mem.messages[msg.Folder][:i], mem.messages[msg.Folder][i+1:]...)
2021-01-28 14:43:00 +01:00
return nil
}
}
2021-01-30 11:20:12 +01:00
2021-01-28 14:43:00 +01:00
return ErrMessageDoesNotExist
2021-01-28 09:40:08 +01:00
}