66 "path/filepath"
77 "strings"
88 "sync"
9+
10+ "golang.org/x/sync/errgroup"
911)
1012
1113type generator struct {
@@ -19,26 +21,24 @@ type task struct {
1921 targetPath string
2022}
2123
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 )
24+ func copyFileWorker (t task ) error {
25+ targetAssetname := getTargetDirname (t .generator .sourcePath , t .targetPath )
26+ targetFile := filepath .Join (t .generator .targetPath , targetAssetname )
2927
30- return copyFile (copyFileWorker .targetPath , targetFile )
28+ return copyFile (t .targetPath , targetFile )
3129}
3230
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 }
31+ func layoutRenderWorker ( t task ) error {
32+ targetAssetname := getTargetDirname (t .generator .sourcePath , t .targetPath )
33+ targetFile := filepath .Join (t .generator .targetPath , targetAssetname )
34+ tpl := gstaticLayoutTpl {t .generator .layoutPath , t .targetPath , targetFile }
3735 return tpl .render ()
3836}
3937
40- func (simpleRenderWorker simpleRenderWorker ) execute () error {
41- tpl := gstaticSimpleTpl {simpleRenderWorker .generator .sourcePath , simpleRenderWorker .generator .targetPath }
38+ func simpleRenderWorker (t task ) error {
39+ targetAssetname := getTargetDirname (t .generator .sourcePath , t .targetPath )
40+ targetFile := filepath .Join (t .generator .targetPath , targetAssetname )
41+ tpl := gstaticSimpleTpl {t .targetPath , targetFile }
4242 return tpl .render ()
4343}
4444
@@ -61,31 +61,37 @@ func findLayout(sourcePath string) (string, error) {
6161func Generate (srcFolder string , targetFolder string ) error {
6262
6363 var wg sync.WaitGroup
64+ eg := errgroup.Group {}
6465
6566 layoutFile , err := findLayout (srcFolder )
6667 if err != nil {
67- return fmt .Errorf ("[%s] %v" , "generate " , err )
68+ return fmt .Errorf ("%v " , err )
6869 }
6970
7071 generator := generator {layoutFile , srcFolder , targetFolder }
7172
72- resolver := resolver (generator , & wg )
73+ resolver := resolver (generator , & wg , & eg )
7374
7475 err = filepath .Walk (srcFolder , resolver )
7576 wg .Wait ()
7677
78+ errGroup := eg .Wait ()
79+ if errGroup != nil {
80+ return errGroup
81+ }
82+
7783 return err
7884
7985}
8086
81- func resolver (generator generator , wg * sync.WaitGroup ) filepath.WalkFunc {
87+ func resolver (generator generator , wg * sync.WaitGroup , eg * errgroup. Group ) filepath.WalkFunc {
8288
8389 useLayout := generator .layoutPath != ""
8490
8591 return func (path string , info os.FileInfo , err error ) error {
8692
8793 if err != nil {
88- return fmt .Errorf ("[%s] %v" , "resolver " , err )
94+ return fmt .Errorf ("%v " , err )
8995 }
9096
9197 if path == generator .layoutPath {
@@ -114,37 +120,45 @@ func resolver(generator generator, wg *sync.WaitGroup) filepath.WalkFunc {
114120 return nil
115121 }
116122
123+ task := task {generator , path }
124+
117125 if ext == ".html" {
118126
119- if useLayout {
127+ if isTplPlainHtml ( path ) {
120128
129+ wg .Add (1 )
121130 go func () {
122131 defer wg .Done ()
123- wg .Add (1 )
124- identifier := fmt .Sprintf ("layoutRenderWorker: %s" , path )
125- executor (identifier , layoutRenderWorker {generator , path }, false )
132+ copyFileWorker (task )
126133 }()
127134
128135 return nil
129136
130137 }
131138
132- go func () {
133- defer wg .Done ()
139+ if useLayout {
134140 wg .Add (1 )
135- identifier := fmt .Sprintf ("simpleRenderWorker: %s" , path )
136- executor (identifier , simpleRenderWorker {generator , path }, false )
137- }()
141+ go func () {
142+ defer wg .Done ()
143+ layoutRenderWorker (task )
144+ }()
145+
146+ return nil
147+
148+ }
149+
150+ eg .Go (func () error {
151+ return simpleRenderWorker (task )
152+ })
138153
139154 return nil
140155
141156 }
142157
158+ wg .Add (1 )
143159 go func () {
144160 defer wg .Done ()
145- wg .Add (1 )
146- identifier := fmt .Sprintf ("copyFileWorker: %s" , path )
147- executor (identifier , copyFileWorker {generator , path }, false )
161+ copyFileWorker (task )
148162 }()
149163
150164 return nil
@@ -153,6 +167,14 @@ func resolver(generator generator, wg *sync.WaitGroup) filepath.WalkFunc {
153167
154168}
155169
170+ func isTplPlainHtml (sourceFile string ) bool {
171+ s := strings .Replace (sourceFile , ".html" , "" , 1 )
172+ sourceFile = s + ".yaml"
173+ _ , err := os .Stat (sourceFile )
174+ return os .IsNotExist (err )
175+
176+ }
177+
156178func getTargetDirname (srcFolder , path string ) string {
157179 s := strings .Replace (path , srcFolder , "" , 1 )
158180 return strings .TrimLeft (s , "/" )
0 commit comments