Skip to content

Commit 94f3382

Browse files
committed
refactoring
1 parent 81b4a1e commit 94f3382

File tree

5 files changed

+103
-107
lines changed

5 files changed

+103
-107
lines changed

kadai2/tanaka0325/imgconv/args.go

-19
This file was deleted.

kadai2/tanaka0325/imgconv/cmd/imgconv/main.go

+90-5
Original file line numberDiff line numberDiff line change
@@ -4,12 +4,15 @@ import (
44
"flag"
55
"fmt"
66
"os"
7+
"path/filepath"
8+
"strings"
79

810
"github.com/gopherdojo/dojo8/kadai2/tanaka0325/imgconv"
911
)
1012

1113
var options imgconv.Options
12-
var args imgconv.Args
14+
var args []string
15+
var allowedExts = []string{"png", "jpg", "jpeg", "gif", "bmp", "tiff", "tif"}
1316

1417
func init() {
1518
options.From = flag.String("f", "jpg", "file extension before convert")
@@ -21,10 +24,92 @@ func init() {
2124
}
2225

2326
func main() {
24-
if err := imgconv.Run(options, args); err != nil {
25-
fmt.Fprintln(os.Stderr, err)
26-
os.Exit(1)
27+
// validate options
28+
if err := options.Validate(allowedExts); err != nil {
29+
onExit(err)
2730
}
2831

29-
os.Exit(0)
32+
// get filenames
33+
dirnames := uniq(args)
34+
paths, err := getTargetFilenames(dirnames, *options.From)
35+
36+
if err != nil {
37+
onExit(err)
38+
}
39+
40+
// convert
41+
for _, path := range paths {
42+
param := imgconv.ConvertParam{
43+
Path: path,
44+
BeforeImage: imgconv.NewCnvImage(*options.From),
45+
AfterImage: imgconv.NewCnvImage(*options.To),
46+
FromExt: *options.From,
47+
ToExt: *options.To,
48+
}
49+
50+
if !*options.DryRun {
51+
if err := imgconv.Convert(param); err != nil {
52+
onExit(err)
53+
}
54+
} else {
55+
fmt.Printf("%[1]s.%[2]s => %[1]s.%[3]s\n", param.Path, param.FromExt, param.ToExt)
56+
}
57+
}
58+
}
59+
60+
func onExit(err error) {
61+
fmt.Fprintln(os.Stderr, err)
62+
os.Exit(1)
63+
}
64+
65+
func uniq([]string) []string {
66+
m := map[string]bool{}
67+
u := []string{}
68+
69+
for _, v := range args {
70+
if !m[v] {
71+
m[v] = true
72+
73+
u = append(u, v)
74+
}
75+
}
76+
77+
return u
78+
}
79+
80+
func getTargetFilenames(ds []string, from string) ([]string, error) {
81+
names := []string{}
82+
for _, n := range ds {
83+
if ok, err := isDir(n); err != nil {
84+
return nil, err
85+
} else if !ok {
86+
return nil, fmt.Errorf("%s is not a directory", n)
87+
}
88+
89+
if err := filepath.Walk(n, func(name string, info os.FileInfo, err error) error {
90+
if filepath.Ext(name) == "."+from {
91+
n := strings.Replace(name, "."+from, "", -1)
92+
names = append(names, n)
93+
}
94+
return nil
95+
}); err != nil {
96+
return nil, err
97+
}
98+
}
99+
100+
return names, nil
101+
}
102+
103+
func isDir(path string) (bool, error) {
104+
f, err := os.Open(path)
105+
if err != nil {
106+
return false, err
107+
}
108+
109+
fi, err := f.Stat()
110+
if err != nil {
111+
return false, err
112+
}
113+
114+
return fi.IsDir(), nil
30115
}

kadai2/tanaka0325/imgconv/cnv_image.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,7 @@ func (ip CnvImageTIFF) Decode(r io.Reader) (image.Image, error) { return tiff.De
6363

6464
func (ip CnvImageTIFF) Encode(w io.Writer, i image.Image) error { return tiff.Encode(w, i, nil) }
6565

66-
func newCnvImage(ext string) DecodeEncoder {
66+
func NewCnvImage(ext string) DecodeEncoder {
6767
switch ext {
6868
case "png":
6969
return &CnvImagePNG{}

kadai2/tanaka0325/imgconv/imgconv.go

+11-81
Original file line numberDiff line numberDiff line change
@@ -2,65 +2,33 @@
22
package imgconv
33

44
import (
5-
"fmt"
65
"os"
7-
"path/filepath"
8-
"strings"
96
)
107

11-
var allowedExts = []string{"png", "jpg", "jpeg", "gif", "bmp", "tiff", "tif"}
12-
var fromExt string
13-
var toExt string
14-
15-
// Run is to convert image file format.
16-
func Run(options Options, args Args) error {
17-
// // validator
18-
if err := options.validate(allowedExts); err != nil {
19-
return err
20-
}
21-
22-
fromExt = *options.From
23-
toExt = *options.To
24-
25-
// get target image flepaths from args
26-
paths, err := getTargetFilePaths(args, fromExt)
27-
if err != nil {
28-
return err
29-
}
30-
31-
// convert
32-
for _, path := range paths {
33-
filename := strings.Replace(path, "."+fromExt, "", -1)
34-
// "))
35-
f := newCnvImage(fromExt)
36-
t := newCnvImage(toExt)
37-
38-
if *options.DryRun {
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
42-
}
43-
}
44-
45-
return nil
8+
type ConvertParam struct {
9+
Path string
10+
BeforeImage Decoder
11+
AfterImage Encoder
12+
FromExt string
13+
ToExt string
4614
}
4715

48-
func convert(d Decoder, e Encoder, filename string) (err error) {
16+
func Convert(param ConvertParam) (err error) {
4917
// open file
50-
r, err := os.Open(filename + "." + fromExt)
18+
r, err := os.Open(param.Path + "." + param.FromExt)
5119
if err != nil {
5220
return
5321
}
5422
defer r.Close()
5523

5624
// decode
57-
img, err := d.Decode(r)
25+
img, err := param.BeforeImage.Decode(r)
5826
if err != nil {
5927
return
6028
}
6129

6230
// create file
63-
w, err := os.Create(filename + "." + toExt)
31+
w, err := os.Create(param.Path + "." + param.ToExt)
6432
if err != nil {
6533
return err
6634
}
@@ -70,47 +38,9 @@ func convert(d Decoder, e Encoder, filename string) (err error) {
7038
}()
7139

7240
// encode
73-
if err := e.Encode(w, img); err != nil {
41+
if err := param.AfterImage.Encode(w, img); err != nil {
7442
return err
7543
}
7644

7745
return
7846
}
79-
80-
func getTargetFilePaths(args Args, from string) ([]string, error) {
81-
uns := args.uniq()
82-
83-
paths := []string{}
84-
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-
91-
if err := filepath.Walk(n, func(path string, info os.FileInfo, err error) error {
92-
if filepath.Ext(path) == "."+from {
93-
paths = append(paths, path)
94-
}
95-
return nil
96-
}); err != nil {
97-
return nil, err
98-
}
99-
}
100-
101-
return paths, nil
102-
}
103-
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
113-
}
114-
115-
return fi.IsDir(), nil
116-
}

kadai2/tanaka0325/imgconv/options.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ type Options struct {
1212
DryRun *bool
1313
}
1414

15-
func (opt Options) validate(allowList []string) error {
15+
func (opt Options) Validate(allowList []string) error {
1616
to := strings.ToLower(*opt.To)
1717
from := strings.ToLower(*opt.From)
1818
targetExts := []string{to, from}

0 commit comments

Comments
 (0)