summary refs log tree commit diff stats
path: root/internal/builder
diff options
context:
space:
mode:
authorAlan Pearce2025-01-29 22:00:45 +0100
committerAlan Pearce2025-01-29 23:27:45 +0100
commit3162ceaa0f7997742f8c2fce1c9660e8e86ad5bb (patch)
tree14c424b8ef8b9238e69393cd7da1d0af6833526e /internal/builder
parenta93b5ad88ea3cf742cf03fdeeb95f63865f08374 (diff)
downloadwebsite-3162ceaa0f7997742f8c2fce1c9660e8e86ad5bb.tar.lz
website-3162ceaa0f7997742f8c2fce1c9660e8e86ad5bb.tar.zst
website-3162ceaa0f7997742f8c2fce1c9660e8e86ad5bb.zip
use buffers as interface to storage
Diffstat (limited to 'internal/builder')
-rw-r--r--internal/builder/builder.go95
1 files changed, 63 insertions, 32 deletions
diff --git a/internal/builder/builder.go b/internal/builder/builder.go
index 8d2f0a4..68f970f 100644
--- a/internal/builder/builder.go
+++ b/internal/builder/builder.go
@@ -1,6 +1,7 @@
 package builder
 
 import (
+	"context"
 	"fmt"
 	"io"
 	"io/fs"
@@ -10,6 +11,7 @@ import (
 	"slices"
 	"time"
 
+	"go.alanpearce.eu/website/internal/buffer"
 	"go.alanpearce.eu/website/internal/config"
 	"go.alanpearce.eu/website/internal/content"
 	"go.alanpearce.eu/website/internal/sitemap"
@@ -39,6 +41,7 @@ func joinSourcePath(src string) func(string) string {
 }
 
 func copyRecursive(storage storage.Writer, src string) error {
+	buf := new(buffer.Buffer)
 	return filepath.WalkDir(src, func(path string, d fs.DirEntry, err error) error {
 		if err != nil {
 			return err
@@ -56,12 +59,11 @@ func copyRecursive(storage storage.Writer, src string) error {
 			return err
 		}
 		defer sf.Close()
-		df, err := storage.OpenFileAndVariants(rel)
-		if err != nil {
+		buf.Reset()
+		if _, err := io.Copy(buf, sf); err != nil {
 			return err
 		}
-		defer df.Close()
-		if _, err := io.Copy(df, sf); err != nil {
+		if err := storage.Write("/"+rel, buf); err != nil {
 			return err
 		}
 
@@ -76,6 +78,8 @@ func build(
 	config *config.Config,
 	log *log.Logger,
 ) (*Result, error) {
+	ctx := context.TODO()
+	buf := new(buffer.Buffer)
 	joinSource := joinSourcePath(ioConfig.Source)
 
 	log.Debug("output", "dir", ioConfig.Destination)
@@ -106,16 +110,21 @@ func build(
 	for _, post := range posts {
 		log.Debug("rendering post", "post", post.Basename)
 		sitemap.AddPath(post.URL, post.Date)
-		if err := storage.RenderToFile(templates.PostPage(config, post), post.Output); err != nil {
+		if err := templates.PostPage(config, post).Render(ctx, buf); err != nil {
+			return nil, errors.WithMessage(err, "could not render post")
+		}
+
+		if err := storage.Write(post.URL, buf); err != nil {
 			return nil, err
 		}
 	}
 
 	log.Debug("rendering tags list")
-	if err := storage.RenderToFile(
-		templates.TagsPage(config, "tags", mapset.Sorted(tags), "/tags"),
-		"tags/",
-	); err != nil {
+	buf.Reset()
+	if err := templates.TagsPage(config, "tags", mapset.Sorted(tags), "/tags").Render(ctx, buf); err != nil {
+		return nil, err
+	}
+	if err := storage.Write("/tags/", buf); err != nil {
 		return nil, err
 	}
 	sitemap.AddPath("/tags/", lastMod)
@@ -128,11 +137,12 @@ func build(
 			}
 		}
 		log.Debug("rendering tags page", "tag", tag)
-		url := path.Join("tags", tag) + "/"
-		if err := storage.RenderToFile(
-			templates.TagPage(config, tag, matchingPosts, url),
-			url,
-		); err != nil {
+		url := path.Join("/tags", tag) + "/"
+		buf.Reset()
+		if err := templates.TagPage(config, tag, matchingPosts, url).Render(ctx, buf); err != nil {
+			return nil, err
+		}
+		if err = storage.Write(url, buf); err != nil {
 			return nil, err
 		}
 		sitemap.AddPath(url, matchingPosts[0].Date)
@@ -147,16 +157,21 @@ func build(
 		if err != nil {
 			return nil, errors.WithMessage(err, "could not render tag feed page")
 		}
-		if err := storage.WriterToFile(feed, path.Join("tags", tag, "atom.xml")); err != nil {
+		buf.Reset()
+		if _, err := feed.WriteTo(buf); err != nil {
+			return nil, err
+		}
+		if err := storage.Write(path.Join("/tags", tag, "atom.xml"), buf); err != nil {
 			return nil, err
 		}
 	}
 
 	log.Debug("rendering list page")
-	if err := storage.RenderToFile(
-		templates.ListPage(config, posts, "/post"),
-		"post/",
-	); err != nil {
+	buf.Reset()
+	if err := templates.ListPage(config, posts, "/post").Render(ctx, buf); err != nil {
+		return nil, err
+	}
+	if err := storage.Write("/post/", buf); err != nil {
 		return nil, err
 	}
 	sitemap.AddPath("/post/", lastMod)
@@ -166,7 +181,11 @@ func build(
 	if err != nil {
 		return nil, errors.WithMessage(err, "could not render feed")
 	}
-	if err := storage.WriterToFile(feed, "atom.xml"); err != nil {
+	buf.Reset()
+	if _, err := feed.WriteTo(buf); err != nil {
+		return nil, err
+	}
+	if err := storage.Write("/atom.xml", buf); err != nil {
 		return nil, err
 	}
 
@@ -175,7 +194,11 @@ func build(
 	if err != nil {
 		return nil, errors.WithMessage(err, "could not render feed styles")
 	}
-	if err := storage.OutputToFile(feedStyles, "feed-styles.xsl"); err != nil {
+	buf.Reset()
+	if _, err := feedStyles.WriteTo(buf); err != nil {
+		return nil, err
+	}
+	if err := storage.Write("/feed-styles.xsl", buf); err != nil {
 		return nil, err
 	}
 	_, err = feedStyles.Seek(0, 0)
@@ -197,23 +220,25 @@ func build(
 	if err != nil {
 		return nil, err
 	}
-	if err := storage.RenderToFile(templates.Homepage(config, posts, content), "/"); err != nil {
+	buf.Reset()
+	if err := templates.Homepage(config, posts, content).Render(ctx, buf); err != nil {
+		return nil, err
+	}
+	if err := storage.Write("/", buf); err != nil {
 		return nil, err
 	}
+
 	// it would be nice to set LastMod here, but using the latest post
 	// date would be wrong as the homepage has its own content file
 	// without a date, which could be newer
 	sitemap.AddPath("/", time.Time{})
-	f, err := storage.Open("/")
-	if err != nil {
-		return nil, err
-	}
-	defer f.Close()
-	h, _ = getHTMLStyleHash(f)
+	h, _ = getHTMLStyleHash(buf)
 	r.Hashes = append(r.Hashes, h)
 
 	log.Debug("rendering sitemap")
-	if err := storage.WriterToFile(sitemap, "sitemap.xml"); err != nil {
+	buf.Reset()
+	sitemap.WriteTo(buf)
+	if err := storage.Write("/sitemap.xml", buf); err != nil {
 		return nil, err
 	}
 
@@ -222,7 +247,11 @@ func build(
 	if err != nil {
 		return nil, err
 	}
-	if err := storage.OutputToFile(rob, "robots.txt"); err != nil {
+	buf.Reset()
+	if _, err := io.Copy(buf, rob); err != nil {
+		return nil, err
+	}
+	if err := storage.Write("/robots.txt", buf); err != nil {
 		return nil, err
 	}
 
@@ -238,10 +267,12 @@ func BuildSite(ioConfig *IOConfig, cfg *config.Config, log *log.Logger) (*Result
 	templates.Setup()
 	loadCSS(ioConfig.Source)
 
-	var storage storage.Writer
-	storage = files.NewWriter(ioConfig.Destination, log, &files.Options{
+	storage, err := files.NewWriter(ioConfig.Destination, log, &files.Options{
 		Compress: !ioConfig.Development,
 	})
+	if err != nil {
+		return nil, errors.WithMessage(err, "could not create storage writer")
+	}
 
 	return build(storage, ioConfig, cfg, log)
 }