Select Git revision
messages.go
messages.go 2.08 KiB
package batch
import (
"embed"
"fmt"
"io/fs"
"path"
"strings"
"time"
)
//go:embed seed/*
var messagesFS embed.FS
// SeedMessage is the struct version of the messages.
type SeedMessage struct {
Login string
Name string
Date time.Time
Subject string
Message string
}
// GetSeedMessages gets the embedded seed messages and returns them in
// a data structure.
func GetSeedMessages() ([]SeedMessage, error) {
var messages []SeedMessage
entries, err := fs.ReadDir(messagesFS, "seed")
if err != nil {
return nil, fmt.Errorf("reading directory: %w", err)
}
for _, entry := range entries {
if entry.IsDir() {
continue
}
data, err := fs.ReadFile(messagesFS, path.Join("seed", entry.Name()))
if err != nil {
return nil, fmt.Errorf("reading file %s: %w", entry.Name(), err)
}
lines := strings.Split(string(data), "\n")
if len(lines) < 4 {
continue // skip malformed
}
// Extract fields
var login, name, subj string
var date time.Time
for i := 0; i < 3; i++ {
line := strings.TrimSpace(lines[i])
switch {
case strings.HasPrefix(line, "From: "):
rest := strings.TrimPrefix(line, "From: ")
parts := strings.SplitN(rest, `"`, 2)
if len(parts) == 2 {
login = strings.TrimSpace(strings.TrimSuffix(parts[0], " "))
name = strings.Trim(parts[1], `"`)
} else {
login = rest
}
case strings.HasPrefix(line, "Date: "):
datestr := strings.TrimPrefix(line, "Date: ")
// Expected format: 01-JAN-1982 12:00
date, err = time.Parse("02-Jan-2006 15:04", datestr)
if err != nil {
return nil, fmt.Errorf("parsing date in %s: %w", entry.Name(), err)
}
case strings.HasPrefix(line, "Subj: "):
subj = strings.TrimPrefix(line, "Subj: ")
}
}
// Find start of message body
bodyIndex := 3
for bodyIndex < len(lines) && strings.TrimSpace(lines[bodyIndex]) != "" {
bodyIndex++
}
body := strings.Join(lines[bodyIndex+1:], "\n")
msg := SeedMessage{
Login: login,
Name: name,
Date: date,
Subject: subj,
Message: body,
}
messages = append(messages, msg)
}
return messages, nil
}