D core.go => core.go +0 -107
@@ 1,107 0,0 @@
-/*
- * Copyright (c) 2015 Alex Yatskov <alex@foosoft.net>
- * Author: Alex Yatskov <alex@foosoft.net>
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy of
- * this software and associated documentation files (the "Software"), to deal in
- * the Software without restriction, including without limitation the rights to
- * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
- * the Software, and to permit persons to whom the Software is furnished to do so,
- * subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in all
- * copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
- * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
- * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
- * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
- * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
- */
-
-package goldsmith
-
-import (
- "path/filepath"
- "sync"
-
- "github.com/bmatcuk/doublestar"
-)
-
-type stage struct {
- input chan File
- output chan File
-}
-
-type goldsmith struct {
- srcPath, dstPath string
- stages []stage
- files chan File
- wg sync.WaitGroup
-}
-
-func NewGoldsmith(srcPath, dstPath string) (Applier, error) {
- gs := &goldsmith{srcPath: srcPath, dstPath: dstPath}
- if err := gs.scan(); err != nil {
- return nil, err
- }
-
- return gs, nil
-}
-
-func (gs *goldsmith) scan() error {
- matches, err := doublestar.Glob(filepath.Join(gs.srcPath, "**"))
- if err != nil {
- return err
- }
-
- gs.files = make(chan File, len(matches))
-
- for _, match := range matches {
- path, err := filepath.Rel(gs.srcPath, match)
- if err != nil {
- return err
- }
-
- gs.files <- &file{path, make(map[string]interface{})}
- }
-
- return nil
-}
-
-func (gs *goldsmith) stage() stage {
- s := stage{output: make(chan File)}
- if len(gs.stages) == 0 {
- s.input = gs.files
- } else {
- s.input = gs.stages[len(gs.stages)-1].output
- }
-
- gs.stages = append(gs.stages, s)
- return s
-}
-
-func (gs *goldsmith) AbsSrcPath(path string) string {
- return filepath.Join(gs.srcPath, path)
-}
-
-func (gs *goldsmith) AbsDstPath(path string) string {
- return filepath.Join(gs.dstPath, path)
-}
-
-func (gs *goldsmith) Apply(p Processor) Applier {
- s := gs.stage()
-
- gs.wg.Add(1)
- go func() {
- p.Process(gs, s.input, s.output)
- gs.wg.Done()
- }()
-
- return gs
-}
-
-func (gs *goldsmith) Complete() {
- gs.wg.Wait()
-}
M goldsmith.go => goldsmith.go +73 -15
@@ 22,28 22,86 @@
package goldsmith
-import "bytes"
+import (
+ "path/filepath"
+ "sync"
-type Context interface {
- AbsSrcPath(path string) string
- AbsDstPath(path string) string
+ "github.com/bmatcuk/doublestar"
+)
+
+type stage struct {
+ input chan File
+ output chan File
}
-type File interface {
- Path() string
- SetPath(path string)
+type goldsmith struct {
+ srcPath, dstPath string
+ stages []stage
+ files chan File
+ wg sync.WaitGroup
+}
- Property(key string) (interface{}, bool)
- SetProperty(key string, value interface{})
+func NewGoldsmith(srcPath, dstPath string) (Applier, error) {
+ gs := &goldsmith{srcPath: srcPath, dstPath: dstPath}
+ if err := gs.scan(); err != nil {
+ return nil, err
+ }
- Data() (*bytes.Buffer, error)
+ return gs, nil
}
-type Processor interface {
- Process(ctx Context, input chan File, output chan File) error
+func (gs *goldsmith) scan() error {
+ matches, err := doublestar.Glob(filepath.Join(gs.srcPath, "**"))
+ if err != nil {
+ return err
+ }
+
+ gs.files = make(chan File, len(matches))
+
+ for _, match := range matches {
+ path, err := filepath.Rel(gs.srcPath, match)
+ if err != nil {
+ return err
+ }
+
+ gs.files <- &file{path, make(map[string]interface{})}
+ }
+
+ return nil
+}
+
+func (gs *goldsmith) stage() stage {
+ s := stage{output: make(chan File)}
+ if len(gs.stages) == 0 {
+ s.input = gs.files
+ } else {
+ s.input = gs.stages[len(gs.stages)-1].output
+ }
+
+ gs.stages = append(gs.stages, s)
+ return s
+}
+
+func (gs *goldsmith) AbsSrcPath(path string) string {
+ return filepath.Join(gs.srcPath, path)
+}
+
+func (gs *goldsmith) AbsDstPath(path string) string {
+ return filepath.Join(gs.dstPath, path)
+}
+
+func (gs *goldsmith) Apply(p Processor) Applier {
+ s := gs.stage()
+
+ gs.wg.Add(1)
+ go func() {
+ p.Process(gs, s.input, s.output)
+ gs.wg.Done()
+ }()
+
+ return gs
}
-type Applier interface {
- Apply(p Processor) Applier
- Complete()
+func (gs *goldsmith) Complete() {
+ gs.wg.Wait()
}
A types.go => types.go +49 -0
@@ 0,0 1,49 @@
+/*
+ * Copyright (c) 2015 Alex Yatskov <alex@foosoft.net>
+ * Author: Alex Yatskov <alex@foosoft.net>
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy of
+ * this software and associated documentation files (the "Software"), to deal in
+ * the Software without restriction, including without limitation the rights to
+ * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
+ * the Software, and to permit persons to whom the Software is furnished to do so,
+ * subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in all
+ * copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+ * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
+ * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+ * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ */
+
+package goldsmith
+
+import "bytes"
+
+type Context interface {
+ AbsSrcPath(path string) string
+ AbsDstPath(path string) string
+}
+
+type File interface {
+ Path() string
+ SetPath(path string)
+
+ Property(key string) (interface{}, bool)
+ SetProperty(key string, value interface{})
+
+ Data() (*bytes.Buffer, error)
+}
+
+type Processor interface {
+ Process(ctx Context, input chan File, output chan File) error
+}
+
+type Applier interface {
+ Apply(p Processor) Applier
+ Complete()
+}