weiro/providers/sitereader/provider.go

95 lines
1.7 KiB
Go
Raw Permalink Normal View History

2026-02-18 11:07:18 +00:00
package sitereader
import (
"bytes"
"io"
"io/fs"
2026-02-19 10:21:27 +00:00
"time"
2026-02-18 11:07:18 +00:00
"gopkg.in/yaml.v3"
"lmika.dev/lmika/weiro/models"
)
type Provider struct {
fs fs.FS
}
func New(fs fs.FS) *Provider {
return &Provider{
fs: fs,
}
}
2026-02-19 10:21:27 +00:00
func (p *Provider) ReadSite() (ReadSiteModels, error) {
2026-02-18 11:07:18 +00:00
posts, err := p.ListPosts()
if err != nil {
2026-02-19 10:21:27 +00:00
return ReadSiteModels{}, err
2026-02-18 11:07:18 +00:00
}
2026-02-19 10:21:27 +00:00
meta := siteMeta{}
metaBytes, err := fs.ReadFile(p.fs, "site.yaml")
if err != nil {
2026-02-19 10:21:27 +00:00
return ReadSiteModels{}, err
}
if err := yaml.Unmarshal(metaBytes, &meta); err != nil {
2026-02-19 10:21:27 +00:00
return ReadSiteModels{}, err
}
2026-02-19 10:21:27 +00:00
site := models.Site{
Title: meta.Title,
Tagline: meta.Tagline,
}
return ReadSiteModels{
2026-02-19 11:29:44 +00:00
Site: site,
Posts: posts,
2026-02-18 11:07:18 +00:00
}, nil
}
func (p *Provider) ListPosts() (posts []*models.Post, err error) {
err = fs.WalkDir(p.fs, "posts", func(path string, d fs.DirEntry, err error) error {
if err != nil {
return err
} else if d.IsDir() {
return nil
}
post, err := p.ReadPost(path)
if err != nil {
return err
}
posts = append(posts, post)
return nil
})
return posts, err
}
func (p *Provider) ReadPost(path string) (*models.Post, error) {
data, err := fs.ReadFile(p.fs, path)
if err != nil {
return nil, err
}
// Split front matter and content
parts := bytes.SplitN(data, []byte("---"), 3)
if len(parts) < 3 {
return nil, io.ErrUnexpectedEOF
}
2026-02-19 10:21:27 +00:00
var meta postMeta
2026-02-18 11:07:18 +00:00
if err := yaml.Unmarshal(parts[1], &meta); err != nil {
return nil, err
}
2026-02-19 10:21:27 +00:00
post := models.Post{
Slug: meta.Slug,
Title: meta.Title,
GUID: meta.ID,
PublishedAt: meta.Date,
CreatedAt: time.Now(),
}
post.Body = string(bytes.TrimPrefix(parts[2], []byte("\n")))
return &post, nil
2026-02-18 11:07:18 +00:00
}