Convert from BoltDB to Maildir storage for emails
This commit is contained in:
65
internal/imap/uidlist/entry.go
Normal file
65
internal/imap/uidlist/entry.go
Normal file
@@ -0,0 +1,65 @@
|
||||
package uidlist
|
||||
|
||||
import (
|
||||
"errors"
|
||||
"fmt"
|
||||
"strings"
|
||||
)
|
||||
|
||||
type Entry struct {
|
||||
UID uint64
|
||||
Extra map[string][]string
|
||||
LastKnownFilename string
|
||||
}
|
||||
|
||||
func ParseEntry(line string) (Entry, error) {
|
||||
var out Entry
|
||||
|
||||
parts := strings.SplitN(strings.TrimSpace(line), ":", 2)
|
||||
if len(parts) != 2 {
|
||||
return out, errors.New("Couldn't find start of filename")
|
||||
}
|
||||
|
||||
attrs := strings.Split(parts[0], " ")
|
||||
if len(attrs) == 0 {
|
||||
return out, errors.New("Couldn't find UID")
|
||||
}
|
||||
|
||||
if err := setUint64(attrs[0], &out.UID); err != nil {
|
||||
return out, err
|
||||
}
|
||||
|
||||
out.Extra = make(map[string][]string)
|
||||
// FIXME: this is all disturbingly similar to header.go
|
||||
for _, attr := range attrs[1:] {
|
||||
if len(attr) == 0 {
|
||||
continue
|
||||
}
|
||||
|
||||
key := attr[0:1]
|
||||
value := attr[1:]
|
||||
out.Extra[key] = append(out.Extra[key], value)
|
||||
}
|
||||
|
||||
out.LastKnownFilename = parts[1]
|
||||
|
||||
return out, nil
|
||||
}
|
||||
|
||||
func (e *Entry) Key() string {
|
||||
parts := strings.SplitN(e.LastKnownFilename, ":", 2)
|
||||
|
||||
return parts[0]
|
||||
}
|
||||
|
||||
func (e *Entry) String() string {
|
||||
// FIXME: also disturbingly similar to header.go
|
||||
var sb strings.Builder
|
||||
fmt.Fprintf(&sb, "%d", e.UID)
|
||||
for k, v := range e.Extra {
|
||||
fmt.Fprintf(&sb, " %s%s", k, v)
|
||||
}
|
||||
fmt.Fprintf(&sb, " :%s", e.LastKnownFilename)
|
||||
|
||||
return sb.String()
|
||||
}
|
Reference in New Issue
Block a user