55 "os"
66 "path/filepath"
77 "strings"
8+ "sync"
89)
910
1011type generator struct {
@@ -13,6 +14,34 @@ type generator struct {
1314 targetPath string
1415}
1516
17+ type task struct {
18+ generator generator
19+ targetPath string
20+ }
21+
22+ type copyFileWorker task
23+ type layoutRenderWorker task
24+ type simpleRenderWorker task
25+
26+ func (copyFileWorker copyFileWorker ) execute () error {
27+ targetAssetname := getTargetDirname (copyFileWorker .generator .sourcePath , copyFileWorker .targetPath )
28+ targetFile := filepath .Join (copyFileWorker .generator .targetPath , targetAssetname )
29+
30+ return copyFile (copyFileWorker .targetPath , targetFile )
31+ }
32+
33+ func (layoutRenderWorker layoutRenderWorker ) execute () error {
34+ targetAssetname := getTargetDirname (layoutRenderWorker .generator .sourcePath , layoutRenderWorker .targetPath )
35+ targetFile := filepath .Join (layoutRenderWorker .generator .targetPath , targetAssetname )
36+ tpl := gstaticLayoutTpl {layoutRenderWorker .generator .layoutPath , layoutRenderWorker .targetPath , targetFile }
37+ return tpl .render ()
38+ }
39+
40+ func (simpleRenderWorker simpleRenderWorker ) execute () error {
41+ tpl := gstaticSimpleTpl {simpleRenderWorker .generator .sourcePath , simpleRenderWorker .generator .targetPath }
42+ return tpl .render ()
43+ }
44+
1645func findLayout (sourcePath string ) (string , error ) {
1746
1847 sourceFile := filepath .Join (sourcePath , "/layout/layout.html" )
@@ -31,19 +60,25 @@ func findLayout(sourcePath string) (string, error) {
3160
3261func Generate (srcFolder string , targetFolder string ) error {
3362
63+ var wg sync.WaitGroup
64+
3465 layoutFile , err := findLayout (srcFolder )
3566 if err != nil {
3667 return fmt .Errorf ("[%s] %v" , "generate" , err )
3768 }
3869
3970 generator := generator {layoutFile , srcFolder , targetFolder }
4071
41- resolver := resolver (generator )
72+ resolver := resolver (generator , & wg )
73+
74+ err = filepath .Walk (srcFolder , resolver )
75+ wg .Wait ()
76+
77+ return err
4278
43- return filepath .Walk (srcFolder , resolver )
4479}
4580
46- func resolver (generator generator ) filepath.WalkFunc {
81+ func resolver (generator generator , wg * sync. WaitGroup ) filepath.WalkFunc {
4782
4883 useLayout := generator .layoutPath != ""
4984
@@ -83,22 +118,36 @@ func resolver(generator generator) filepath.WalkFunc {
83118
84119 if useLayout {
85120
86- targetAssetname := getTargetDirname (generator .sourcePath , path )
87- targetFile := filepath .Join (generator .targetPath , targetAssetname )
88- tpl := gstaticLayoutTpl {generator .layoutPath , path , targetFile }
89- return tpl .render ()
121+ go func () {
122+ defer wg .Done ()
123+ wg .Add (1 )
124+ identifier := fmt .Sprintf ("layoutRenderWorker: %s" , path )
125+ executor (identifier , layoutRenderWorker {generator , path }, false )
126+ }()
127+
128+ return nil
90129
91130 }
92131
93- tpl := gstaticSimpleTpl {generator .sourcePath , generator .targetPath }
94- return tpl .render ()
132+ go func () {
133+ defer wg .Done ()
134+ wg .Add (1 )
135+ identifier := fmt .Sprintf ("simpleRenderWorker: %s" , path )
136+ executor (identifier , simpleRenderWorker {generator , path }, false )
137+ }()
138+
139+ return nil
95140
96141 }
97142
98- targetAssetname := getTargetDirname (generator .sourcePath , path )
99- targetFile := filepath .Join (generator .targetPath , targetAssetname )
143+ go func () {
144+ defer wg .Done ()
145+ wg .Add (1 )
146+ identifier := fmt .Sprintf ("copyFileWorker: %s" , path )
147+ executor (identifier , copyFileWorker {generator , path }, false )
148+ }()
100149
101- return copyFile ( path , targetFile )
150+ return nil
102151
103152 }
104153
0 commit comments