diff --git a/core.go b/core.go deleted file mode 100644 index c0ec452..0000000 --- a/core.go +++ /dev/null @@ -1,107 +0,0 @@ -/* - * Copyright (c) 2015 Alex Yatskov - * Author: Alex Yatskov - * - * 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() -} diff --git a/goldsmith.go b/goldsmith.go index 1577ed1..c0ec452 100644 --- a/goldsmith.go +++ b/goldsmith.go @@ -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) - - Property(key string) (interface{}, bool) - SetProperty(key string, value interface{}) - - Data() (*bytes.Buffer, error) +type goldsmith struct { + srcPath, dstPath string + stages []stage + files chan File + wg sync.WaitGroup } -type Processor interface { - Process(ctx Context, input chan File, output chan File) error +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 } -type Applier interface { - Apply(p Processor) Applier - Complete() +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() } diff --git a/types.go b/types.go new file mode 100644 index 0000000..1577ed1 --- /dev/null +++ b/types.go @@ -0,0 +1,49 @@ +/* + * Copyright (c) 2015 Alex Yatskov + * Author: Alex Yatskov + * + * 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() +}