-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathmain.go
More file actions
175 lines (142 loc) · 3.98 KB
/
Copy pathmain.go
File metadata and controls
175 lines (142 loc) · 3.98 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
package main
import (
"fmt"
"os"
"time"
"github.com/ryer/wpdump/wpdump"
"github.com/spf13/pflag"
)
var (
Name = "wpdump"
Version = "1.0.1"
Revision = "latest"
)
type appFlags struct {
help bool
version bool
url string
dir string
verbose bool
parallel int
embed bool
merge bool
all bool
tags bool
users bool
media bool
posts bool
pages bool
categories bool
custom []string
}
func parseFlags() *appFlags {
flags := &appFlags{}
pflag.BoolVarP(&flags.help, "help", "", false, "show this message")
pflag.BoolVarP(&flags.version, "version", "", false, "show version")
pflag.StringVarP(&flags.url, "url", "u", "", "api base url (e.g. http://example.com/wp-json/wp/v2)")
pflag.StringVarP(&flags.dir, "dir", "d", ".", "save json to this directory")
pflag.IntVarP(&flags.parallel, "parallel", "p", 1, "parallel download")
pflag.BoolVarP(&flags.verbose, "verbose", "v", false, "verbose output")
pflag.BoolVarP(&flags.embed, "embed", "e", false, "enable embed")
pflag.BoolVarP(&flags.merge, "merge", "m", false, "merged output")
pflag.BoolVarP(&flags.all, "all", "a", false, "dump all")
pflag.BoolVarP(&flags.posts, "posts", "", false, "dump posts")
pflag.BoolVarP(&flags.categories, "categories", "", false, "dump categories")
pflag.BoolVarP(&flags.tags, "tags", "", false, "dump tags")
pflag.BoolVarP(&flags.media, "media", "", false, "dump media")
pflag.BoolVarP(&flags.pages, "pages", "", false, "dump pages")
pflag.BoolVarP(&flags.users, "users", "", false, "dump users")
pflag.StringArrayVarP(&flags.custom, "custom", "", []string{}, "dump custom type (support multiple flags)")
pflag.CommandLine.SortFlags = false
pflag.Parse()
return flags
}
func main() {
os.Exit(run())
}
func run() int {
flags := parseFlags()
dumpTarget := decideDumpTarget(flags)
if flags.version {
fmt.Printf("%v version %v (%v)", Name, Version, Revision)
return 0
}
if flags.help || flags.url == "" || len(dumpTarget) == 0 {
pflag.Usage()
return 1
}
dumper, reporter := buildDumper(flags)
reporter.Start()
start := time.Now()
for _, path := range dumpTarget {
_, err := dumper.Dump(path)
if err != nil {
// Error is already reported by the reporter
return 1
}
}
reporter.End(time.Since(start))
return 0
}
func decideDumpTarget(flags *appFlags) []wpdump.Path {
targets := map[wpdump.Path]bool{
wpdump.Categories: flags.categories,
wpdump.Pages: flags.pages,
wpdump.Tags: flags.tags,
wpdump.Media: flags.media,
wpdump.Posts: flags.posts,
wpdump.Users: flags.users,
}
dumpTarget := make([]wpdump.Path, 0, len(targets))
for path, enabled := range targets {
if flags.all || enabled {
dumpTarget = append(dumpTarget, path)
}
}
for _, path := range flags.custom {
dumpTarget = append(dumpTarget, wpdump.Path(path))
}
return dumpTarget
}
type ConsoleReporter struct {
verbose bool
}
func (r *ConsoleReporter) Start() {
fmt.Println("Dump start")
}
func (r *ConsoleReporter) End(elapsed time.Duration) {
if r.verbose {
fmt.Printf("Dump end (elapsed: %v)\n", elapsed)
} else {
fmt.Println("Dump end")
}
}
func (r *ConsoleReporter) Success(path wpdump.Path, filename string) {
if r.verbose {
fmt.Printf("Dump progress (%v): %v\n", path, filename)
}
}
func (r *ConsoleReporter) Error(err error) {
// Errors are always displayed
fmt.Fprintf(os.Stderr, "Error: %v\n", err)
}
func (r *ConsoleReporter) Warn(message string) {
if r.verbose {
fmt.Fprintf(os.Stderr, "Warn: %s\n", message)
}
}
func buildDumper(flags *appFlags) (wpdump.IDumper, wpdump.Reporter) {
var dumper wpdump.IDumper
reporter := &ConsoleReporter{verbose: flags.verbose}
dumperImpl := wpdump.NewDumper(flags.url, flags.dir, flags.embed)
if flags.parallel > 1 {
dumper = wpdump.NewParallelDumper(dumperImpl, flags.parallel)
} else {
dumper = dumperImpl
}
if flags.merge {
dumper = wpdump.NewMergeDumper(dumper, flags.dir)
}
dumper.SetReporter(reporter)
return dumper, reporter
}