From afa5d0dcf5fe95ad78248f23ec677dc69cabf5b8 Mon Sep 17 00:00:00 2001
From: Semyon Krestyaninov <krestyaninov@perx.ru>
Date: Wed, 24 Apr 2024 11:00:37 +0000
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=84=D1=83=D0=BD=D0=BA=D1=86=D0=B8=D1=8F=20?=
 =?UTF-8?q?=D0=B4=D0=BB=D1=8F=20=D0=BF=D0=BE=D0=BB=D1=83=D1=87=D0=B5=D0=BD?=
 =?UTF-8?q?=D0=B8=D1=8F=20=D1=84=D0=BE=D1=80=D0=BC=D0=B0=D1=82=D0=B0=20?=
 =?UTF-8?q?=D0=B8=D0=B7=20MIME=20=D1=82=D0=B8=D0=BF=D0=B0?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 images/convert/convert.go      | 21 ++++++++++++++-
 images/convert/convert_test.go | 49 ++++++++++++++++++++++++++++++++++
 2 files changed, 69 insertions(+), 1 deletion(-)

diff --git a/images/convert/convert.go b/images/convert/convert.go
index b704055d..0903f19f 100644
--- a/images/convert/convert.go
+++ b/images/convert/convert.go
@@ -3,6 +3,7 @@ package convert
 import (
 	"image"
 	"io"
+	"mime"
 	"os"
 	"strings"
 
@@ -69,5 +70,23 @@ func FormatFromExtension(ext string) (Format, error) {
 	if f, ok := formatExtensions[ext]; ok {
 		return f, nil
 	}
-	return "", errors.Errorf("unsupported format")
+	return "", errors.Errorf("unsupported format: %s", ext)
+}
+
+func FormatFromMIMEType(typ string) (Format, error) {
+	extensions, err := mime.ExtensionsByType(typ)
+	if err != nil {
+		return "", errors.Wrap(err, "get extensions by mime type")
+	}
+	if len(extensions) == 0 {
+		return "", errors.Errorf("unknown mime type: %s", typ)
+	}
+	for _, extension := range extensions {
+		var format Format
+		format, err = FormatFromExtension(extension)
+		if err == nil {
+			return format, nil
+		}
+	}
+	return "", err
 }
diff --git a/images/convert/convert_test.go b/images/convert/convert_test.go
index b7a759ea..e48930e7 100644
--- a/images/convert/convert_test.go
+++ b/images/convert/convert_test.go
@@ -57,6 +57,55 @@ func TestFormatFromExtension(t *testing.T) {
 	}
 }
 
+func TestFormatFromMIMEType(t *testing.T) {
+	var tests = []struct {
+		name    string
+		input   string
+		output  Format
+		wantErr bool
+	}{
+		{
+			name:    "correct jpeg",
+			input:   "image/jpeg",
+			output:  JPEG,
+			wantErr: false,
+		},
+		{
+			name:    "correct png",
+			input:   "image/png",
+			output:  PNG,
+			wantErr: false,
+		},
+		{
+			name:    "unsupported mime type",
+			input:   "application/json",
+			wantErr: true,
+		},
+		{
+			name:    "unknown mime type",
+			input:   "application/perxis",
+			wantErr: true,
+		},
+		{
+			name:    "no mime type",
+			input:   "",
+			wantErr: true,
+		},
+	}
+
+	for _, tc := range tests {
+		t.Run(tc.name, func(t *testing.T) {
+			format, err := FormatFromMIMEType(tc.input)
+			if tc.wantErr {
+				require.Error(t, err)
+			} else {
+				require.NoError(t, err)
+				require.Equal(t, tc.output, format)
+			}
+		})
+	}
+}
+
 func TestEncode(t *testing.T) {
 	var tests = []struct {
 		name    string
-- 
GitLab