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