summaryrefslogtreecommitdiff
path: root/internal/processor/image.go
diff options
context:
space:
mode:
authorPaul Buetow <paul@buetow.org>2026-04-27 08:59:39 +0300
committerPaul Buetow <paul@buetow.org>2026-04-27 08:59:39 +0300
commit30e63df03544b94ebc5fcb2a004d18a0d32a4247 (patch)
tree2933b6a790f01c215806b3efcb644f533c0c60cd /internal/processor/image.go
parentc6e0b5cc48dedb52477cb0060e6ebc8ca4f088f2 (diff)
processor: introduce PostBuilder registry to replace hardcoded switch
Replace the large, duplicate switch statements in planPost and commitPlan with a PostBuilder interface registered per file extension. - PostBuilder interface: Plan(srcPath, ext) (postPlan, error) and Commit(plan, postDir, id, now) (*post.Post, []string, error) - Per-type builders: txtBuilder, mdBuilder, imageBuilder, audioBuilder. - Each builder self-registers via init() into a map[string]PostBuilder. - Core processor loops are now extension-agnostic, satisfying OCP/DIP. - All existing tests pass.
Diffstat (limited to 'internal/processor/image.go')
-rw-r--r--internal/processor/image.go37
1 files changed, 37 insertions, 0 deletions
diff --git a/internal/processor/image.go b/internal/processor/image.go
index a981e85..f68f533 100644
--- a/internal/processor/image.go
+++ b/internal/processor/image.go
@@ -8,7 +8,9 @@ import (
"image/png"
"os"
"path/filepath"
+ "time"
+ "codeberg.org/snonux/snonux/internal/post"
"golang.org/x/image/draw"
)
@@ -17,6 +19,41 @@ const (
jpegQuality = 80
)
+type imageBuilder struct{}
+
+func (imageBuilder) Plan(srcPath string, ext string) (postPlan, error) {
+ plan := postPlan{srcPath: srcPath, ext: ext}
+ img, err := validateImage(srcPath)
+ if err != nil {
+ return postPlan{}, err
+ }
+ plan.validatedImage = img
+ return plan, nil
+}
+
+func (imageBuilder) Commit(plan postPlan, postDir string, id string, now time.Time) (*post.Post, []string, error) {
+ if err := writeImageAsset(plan.validatedImage, postDir); err != nil {
+ return nil, nil, err
+ }
+ src := fmt.Sprintf("posts/%s/image.jpg", id)
+ html := fmt.Sprintf(`<img src="%s" alt="" class="post-image">`, src)
+ p := &post.Post{
+ ID: id,
+ Timestamp: now,
+ PostType: post.TypeImage,
+ Content: html,
+ Assets: []string{"image.jpg"},
+ }
+ return p, nil, nil
+}
+
+func init() {
+ register(".png", imageBuilder{})
+ register(".jpg", imageBuilder{})
+ register(".jpeg", imageBuilder{})
+ register(".gif", imageBuilder{})
+}
+
// validateImage reads and decodes the source image, resizing if necessary.
// It performs only read validation; the caller is responsible for writing assets.
func validateImage(srcPath string) (image.Image, error) {