diff --git a/images/convert/convert.go b/images/convert/convert.go index b704055dd7399eb4629d1804cd51574befff49c6..0903f19f4e5c3808f750e9c4e3bc4b7b0f81c409 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 b7a759eac8dba586d985806bb587975e07a93403..e48930e7de8000e8a43ecc7277c808340a1fb553 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