my-log/models/entry.go

77 lines
1.3 KiB
Go
Raw Normal View History

2024-01-26 19:40:38 -06:00
package models
2024-01-28 01:13:25 -06:00
import (
"bytes"
"errors"
"strings"
"sync"
"time"
)
const DateFormat = "January 02, 2006 at 03:04:05PM -0700"
type Entry struct {
Title string
Date time.Time
Fields []Meta
}
type metaRes struct {
out []byte
err error
}
func (e Entry) getFieldMarshalChan() chan metaRes {
size := len(e.Fields)
ch := make(chan metaRes, size)
var wg sync.WaitGroup
// @todo figure out a way to handle json field
for i := 0; i < size; i++ {
wg.Add(1)
2024-01-28 12:41:55 -06:00
go func(m Meta) {
2024-01-28 01:13:25 -06:00
defer wg.Done()
2024-01-28 12:41:55 -06:00
o, er := m.MarshalText()
2024-01-28 01:13:25 -06:00
ch <- metaRes{o, er}
2024-01-28 12:41:55 -06:00
}(e.Fields[i])
2024-01-28 01:13:25 -06:00
}
go func() {
wg.Wait()
close(ch)
}()
return ch
}
func (e Entry) MarshalText() ([]byte, error) {
e.Title = strings.TrimSpace(e.Title)
if e.Title == "" {
2024-01-28 12:41:55 -06:00
return []byte{}, ErrorMissingTitle
2024-01-28 01:13:25 -06:00
}
if e.Date == (time.Time{}) {
2024-01-28 12:41:55 -06:00
return []byte{}, ErrorMissingDate
2024-01-28 01:13:25 -06:00
}
ch := e.getFieldMarshalChan()
buff := &bytes.Buffer{}
buff.WriteString("@begin ")
buff.WriteString(e.Date.Format(DateFormat))
buff.WriteString(" - ")
buff.WriteString(e.Title)
for res := range ch {
if res.err == nil && len(res.out) > 0 {
buff.WriteString("\n")
buff.Write(res.out)
}
}
buff.WriteString(" @end")
return buff.Bytes(), nil
}
func (m *Entry) UnmarshalText(in []byte) error {
return nil
}