From 51ce888cef548cdeb40d7da107fe7a4e03d85d1a Mon Sep 17 00:00:00 2001
From: "a.petraki" <a.petraki@perx.ru>
Date: Thu, 23 Nov 2023 12:46:14 +0300
Subject: [PATCH] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB=D0=B5?=
 =?UTF-8?q?=D0=BD=D0=B0=20=D1=80=D0=B5=D0=B3=D0=B8=D1=81=D1=82=D1=80=D0=B0?=
 =?UTF-8?q?=D1=86=D0=B8=D1=8F=20=D1=80=D0=B0=D1=81=D1=88=D0=B8=D1=80=D0=B5?=
 =?UTF-8?q?=D0=BD=D0=B8=D0=B9=20=D0=B4=D0=BB=D1=8F=20=D1=84=D0=BE=D1=80?=
 =?UTF-8?q?=D0=BC=D0=B0=D1=82=D0=BE=D0=B2=20=D0=B8=D0=B7=D0=BE=D0=B1=D1=80?=
 =?UTF-8?q?=D0=B0=D0=B6=D0=B5=D0=BD=D0=B8=D0=B9?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 pkg/images/imgconv/default_format.go | 16 +++++------
 pkg/images/imgconv/imgconv.go        | 42 ++++++++++++++++++----------
 pkg/images/imgconv/webp.go           |  2 +-
 3 files changed, 36 insertions(+), 24 deletions(-)

diff --git a/pkg/images/imgconv/default_format.go b/pkg/images/imgconv/default_format.go
index d57a9702..e8e5bd27 100644
--- a/pkg/images/imgconv/default_format.go
+++ b/pkg/images/imgconv/default_format.go
@@ -12,17 +12,17 @@ import (
 )
 
 const (
-	JPEG = "jpeg"
-	PNG  = "png"
-	GIF  = "gif"
-	TIFF = "tiff"
-	BMP  = "bmp"
+	JPEG Format = "jpeg"
+	PNG  Format = "png"
+	GIF  Format = "gif"
+	TIFF Format = "tiff"
+	BMP  Format = "bmp"
 )
 
 func init() {
-	RegisterFormatEncoder(JPEG, func(w io.Writer, img image.Image) error { return jpeg.Encode(w, img, nil) })
-	RegisterFormatEncoder(PNG, func(w io.Writer, img image.Image) error { return png.Encode(w, img) })
+	RegisterFormatEncoder(JPEG, func(w io.Writer, img image.Image) error { return jpeg.Encode(w, img, nil) }, "jpg", "jpeg")
+	RegisterFormatEncoder(PNG, png.Encode, "png")
 	RegisterFormatEncoder(GIF, func(w io.Writer, img image.Image) error { return gif.Encode(w, img, nil) })
 	RegisterFormatEncoder(TIFF, func(w io.Writer, img image.Image) error { return tiff.Encode(w, img, nil) })
-	RegisterFormatEncoder(BMP, func(w io.Writer, img image.Image) error { return bmp.Encode(w, img) })
+	RegisterFormatEncoder(BMP, bmp.Encode)
 }
diff --git a/pkg/images/imgconv/imgconv.go b/pkg/images/imgconv/imgconv.go
index 9f00fcb8..7944a619 100644
--- a/pkg/images/imgconv/imgconv.go
+++ b/pkg/images/imgconv/imgconv.go
@@ -9,20 +9,24 @@ import (
 	"git.perx.ru/perxis/perxis-go/pkg/errors"
 )
 
-var builtinFormats = map[string]string{
-	"jpg": "jpeg",
-	"tif": "tiff",
-}
-
-var defaultFormatEncoderRegistry = make(map[string]EncodeFunc)
+type (
+	EncodeFunc func(w io.Writer, img image.Image) error
+	Format     string
+)
 
-type EncodeFunc func(w io.Writer, img image.Image) error
+var (
+	defaultFormatEncoderRegistry = make(map[Format]EncodeFunc)
+	formatExtensions             = make(map[string]Format)
+)
 
-func RegisterFormatEncoder(format string, fn EncodeFunc) {
+func RegisterFormatEncoder(format Format, fn EncodeFunc, extensions ...string) {
 	defaultFormatEncoderRegistry[format] = fn
+	for _, ext := range extensions {
+		formatExtensions[strings.TrimPrefix(strings.ToLower(ext), ".")] = format
+	}
 }
 
-func Encode(w io.Writer, format string, img image.Image) error {
+func Encode(w io.Writer, format Format, img image.Image) error {
 	encoder, ok := defaultFormatEncoderRegistry[format]
 	if !ok {
 		return errors.Errorf("unknown format: %s", format)
@@ -55,11 +59,19 @@ func Open(filename string) (image.Image, string, error) {
 	return img, ext, nil
 }
 
-func NormalizeFormat(format string) string {
-	format = strings.ToLower(format)
-	format = strings.TrimPrefix(format, ".")
-	if v, ok := builtinFormats[format]; ok {
-		return v
+func FormatFromExtension(ext string) (Format, error) {
+	ext = strings.TrimPrefix(strings.ToLower(ext), ".")
+	if f, ok := formatExtensions[ext]; ok {
+		return f, nil
 	}
-	return format
+	return "", errors.Errorf("unsupported format")
 }
+
+//func NormalizeFormat(format string) string {
+//	format = strings.ToLower(format)
+//	format = strings.TrimPrefix(format, ".")
+//	//if v, ok := builtinFormats[format]; ok {
+//	//	return v
+//	//}
+//	return format
+//}
diff --git a/pkg/images/imgconv/webp.go b/pkg/images/imgconv/webp.go
index 0358d9ca..f5f42e04 100644
--- a/pkg/images/imgconv/webp.go
+++ b/pkg/images/imgconv/webp.go
@@ -15,7 +15,7 @@ import (
 )
 
 const (
-	WEBP = "webp"
+	WEBP Format = "webp"
 )
 
 func init() {
-- 
GitLab