Skip to content

Commit a235d16

Browse files
committed
refactoring
1 parent a265027 commit a235d16

File tree

7 files changed

+153
-119
lines changed

7 files changed

+153
-119
lines changed

Diff for: kadai1/tanaka0325/imgconv/args.go

+1
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ func (args Args) uniq() []string {
1010
for _, v := range args {
1111
if !m[v] {
1212
m[v] = true
13+
1314
u = append(u, v)
1415
}
1516
}

Diff for: kadai1/tanaka0325/imgconv/cmd/imgconv/main.go

+2-2
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,8 @@ var options imgconv.Options
1212
var args imgconv.Args
1313

1414
func init() {
15-
options.From = flag.String("f", "jpg", "file extention before convert")
16-
options.To = flag.String("t", "png", "file extention after convert")
15+
options.From = flag.String("f", "jpg", "file extension before convert")
16+
options.To = flag.String("t", "png", "file extension after convert")
1717
options.DryRun = flag.Bool("n", false, "dry run")
1818
flag.Parse()
1919

Diff for: kadai1/tanaka0325/imgconv/cnv_image.go

+81
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,81 @@
1+
package imgconv
2+
3+
import (
4+
"image"
5+
"image/gif"
6+
"image/jpeg"
7+
"image/png"
8+
"io"
9+
10+
"golang.org/x/image/bmp"
11+
"golang.org/x/image/tiff"
12+
)
13+
14+
type Decoder interface {
15+
Decode(io.Reader) (image.Image, error)
16+
}
17+
18+
type Encoder interface {
19+
Encode(io.Writer, image.Image) error
20+
}
21+
22+
type DecodeEncoder interface {
23+
Decoder
24+
Encoder
25+
}
26+
27+
type CnvImage struct{}
28+
29+
// CnvImagePng is type for png format.
30+
type CnvImagePNG CnvImage
31+
32+
func (ip CnvImagePNG) Decode(r io.Reader) (image.Image, error) { return png.Decode(r) }
33+
34+
func (ip CnvImagePNG) Encode(w io.Writer, i image.Image) error { return png.Encode(w, i) }
35+
36+
// CnvImageJPEG is type for jpeg format.
37+
type CnvImageJPEG CnvImage
38+
39+
func (ip CnvImageJPEG) Decode(r io.Reader) (image.Image, error) { return jpeg.Decode(r) }
40+
41+
func (ip CnvImageJPEG) Encode(w io.Writer, i image.Image) error { return jpeg.Encode(w, i, nil) }
42+
43+
// CnvImageGIF is type for gif format.
44+
type CnvImageGIF CnvImage
45+
46+
func (ip CnvImageGIF) Decode(r io.Reader) (image.Image, error) { return gif.Decode(r) }
47+
48+
func (ip CnvImageGIF) Encode(w io.Writer, i image.Image) error {
49+
return gif.Encode(w, i, &gif.Options{NumColors: 256})
50+
}
51+
52+
// CnvImageBMP is type for bmp format.
53+
type CnvImageBMP CnvImage
54+
55+
func (ip CnvImageBMP) Decode(r io.Reader) (image.Image, error) { return bmp.Decode(r) }
56+
57+
func (ip CnvImageBMP) Encode(w io.Writer, i image.Image) error { return bmp.Encode(w, i) }
58+
59+
// CnvImageTIFF is type for tiff format.
60+
type CnvImageTIFF CnvImage
61+
62+
func (ip CnvImageTIFF) Decode(r io.Reader) (image.Image, error) { return tiff.Decode(r) }
63+
64+
func (ip CnvImageTIFF) Encode(w io.Writer, i image.Image) error { return tiff.Encode(w, i, nil) }
65+
66+
func newCnvImage(ext string) DecodeEncoder {
67+
switch ext {
68+
case "png":
69+
return &CnvImagePNG{}
70+
case "jpg", "jpeg":
71+
return &CnvImageJPEG{}
72+
case "gif":
73+
return &CnvImageGIF{}
74+
case "bmp":
75+
return &CnvImageBMP{}
76+
case "tiff", "tif":
77+
return &CnvImageTIFF{}
78+
}
79+
80+
return nil
81+
}

Diff for: kadai1/tanaka0325/imgconv/conv_image.go

-82
This file was deleted.

Diff for: kadai1/tanaka0325/imgconv/go.mod.back

-5
This file was deleted.

Diff for: kadai1/tanaka0325/imgconv/imgconv.go

+65-27
Original file line numberDiff line numberDiff line change
@@ -9,47 +9,85 @@ import (
99
)
1010

1111
var allowedExts = []string{"png", "jpg", "jpeg", "gif", "bmp", "tiff", "tif"}
12+
var fromExt string
13+
var toExt string
1214

13-
// Run is to convert image file format
15+
// Run is to convert image file format.
1416
func Run(options Options, args Args) error {
15-
// validator
17+
// // validator
1618
if err := options.validate(allowedExts); err != nil {
1719
return err
1820
}
1921

22+
fromExt = *options.From
23+
toExt = *options.To
24+
2025
// get target image flepaths from args
21-
paths, err := getTargetFilePaths(args, *options.From)
26+
paths, err := getTargetFilePaths(args, fromExt)
2227
if err != nil {
2328
return err
2429
}
2530

2631
// convert
27-
imgs, err := createConvImages(paths, *options.From, *options.To)
28-
if err != nil {
29-
return err
30-
}
31-
for _, img := range imgs {
32-
if err := img.decode(); err != nil {
33-
return err
34-
}
32+
for _, path := range paths {
33+
filename := strings.Replace(path, "."+fromExt, "", -1)
34+
// "))
35+
f := newCnvImage(fromExt)
36+
t := newCnvImage(toExt)
3537

3638
if *options.DryRun {
37-
fmt.Println(img.filename+"."+img.fromExt, "=>", img.filename+"."+img.toExt)
38-
} else {
39-
if err := img.encode(); err != nil {
40-
return err
41-
}
39+
fmt.Printf("%s.%s => %s.%s \n", filename, fromExt, filename, toExt)
40+
} else if err := convert(f, t, filename); err != nil {
41+
return err
4242
}
4343
}
4444

4545
return nil
4646
}
4747

48+
func convert(d Decoder, e Encoder, filename string) (err error) {
49+
// open file
50+
r, err := os.Open(filename + "." + fromExt)
51+
if err != nil {
52+
return
53+
}
54+
defer r.Close()
55+
56+
// decode
57+
img, err := d.Decode(r)
58+
if err != nil {
59+
return
60+
}
61+
62+
// create file
63+
w, err := os.Create(filename + "." + toExt)
64+
if err != nil {
65+
return err
66+
}
67+
68+
defer func() {
69+
err = w.Close()
70+
}()
71+
72+
// encode
73+
if err := e.Encode(w, img); err != nil {
74+
return err
75+
}
76+
77+
return
78+
}
79+
4880
func getTargetFilePaths(args Args, from string) ([]string, error) {
4981
uns := args.uniq()
50-
paths := []string{}
5182

83+
paths := []string{}
5284
for _, n := range uns {
85+
if ok, err := isDir(n); err != nil {
86+
return nil, err
87+
} else if !ok {
88+
return nil, fmt.Errorf("%s is not a directory", n)
89+
}
90+
5391
if err := filepath.Walk(n, func(path string, info os.FileInfo, err error) error {
5492
if filepath.Ext(path) == "."+from {
5593
paths = append(paths, path)
@@ -63,16 +101,16 @@ func getTargetFilePaths(args Args, from string) ([]string, error) {
63101
return paths, nil
64102
}
65103

66-
func createConvImages(paths []string, from, to string) ([]convImage, error) {
67-
images := []convImage{}
68-
for _, p := range paths {
69-
i := convImage{
70-
filename: strings.Replace(p, "."+from, "", 1),
71-
fromExt: strings.ToLower(from),
72-
toExt: strings.ToLower(to),
73-
}
74-
images = append(images, i)
104+
func isDir(path string) (bool, error) {
105+
f, err := os.Open(path)
106+
if err != nil {
107+
return false, err
108+
}
109+
110+
fi, err := f.Stat()
111+
if err != nil {
112+
return false, err
75113
}
76114

77-
return images, nil
115+
return fi.IsDir(), nil
78116
}

Diff for: kadai1/tanaka0325/imgconv/options.go

+4-3
Original file line numberDiff line numberDiff line change
@@ -13,13 +13,14 @@ type Options struct {
1313
DryRun *bool
1414
}
1515

16-
func (opt Options) validate(allow_list []string) error {
16+
func (opt Options) validate(allowList []string) error {
1717
to := strings.ToLower(*opt.To)
1818
from := strings.ToLower(*opt.From)
1919
targetExts := []string{to, from}
20+
2021
for _, e := range targetExts {
21-
if err := include(allow_list, e); err != nil {
22-
return fmt.Errorf("%w. ext is only allowd in %s", err, allow_list)
22+
if err := include(allowList, e); err != nil {
23+
return fmt.Errorf("%w. ext is only allowd in %s", err, allowList)
2324
}
2425
}
2526

0 commit comments

Comments
 (0)