gte/pkg/mstore/memory.go

102 lines
1.8 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
Selected string
nextUid uint32
messages map[string][]*Message
}
func NewMemory(folders []string) (*Memory, error) {
if len(folders) == 0 {
return &Memory{}, ErrInvalidFolderSet
}
msg := make(map[string][]*Message)
for _, f := range folders {
if f == "" {
return &Memory{}, ErrInvalidFolderName
}
msg[f] = []*Message{}
}
return &Memory{
messages: msg,
nextUid: uint32(1),
}, nil
}
func (mem *Memory) Folders() ([]string, error) {
folders := []string{}
2021-01-29 12:29:23 +01:00
for f := range mem.messages {
2021-01-28 14:43:00 +01:00
folders = append(folders, f)
}
sort.Strings(folders)
return folders, nil
}
func (mem *Memory) Select(folder string) error {
if _, ok := mem.messages[folder]; !ok {
return ErrFolderDoesNotExist
}
mem.Selected = folder
return 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,
Subject: subject,
Body: body,
})
mem.nextUid++
return nil
}
func (mem *Memory) Messages() ([]*Message, error) {
if mem.Selected == "" {
return []*Message{}, ErrNoFolderSelected
}
return mem.messages[mem.Selected], nil
}
func (mem *Memory) Remove(uid uint32) error {
if uid == uint32(0) {
return ErrInvalidUid
}
if mem.Selected == "" {
return ErrNoFolderSelected
}
for i, m := range mem.messages[mem.Selected] {
if m.Uid == uid {
mem.messages[mem.Selected] = append(mem.messages[mem.Selected][:i], mem.messages[mem.Selected][i+1:]...)
return nil
}
}
return ErrMessageDoesNotExist
2021-01-28 09:40:08 +01:00
}