WIP
This commit is contained in:
parent
5327d67eae
commit
619e3dfd41
11
file.go
11
file.go
@ -31,6 +31,7 @@ type file struct {
|
|||||||
path string
|
path string
|
||||||
meta map[string]interface{}
|
meta map[string]interface{}
|
||||||
buff *bytes.Buffer
|
buff *bytes.Buffer
|
||||||
|
err error
|
||||||
}
|
}
|
||||||
|
|
||||||
func (f *file) Path() string {
|
func (f *file) Path() string {
|
||||||
@ -50,6 +51,14 @@ func (f *file) SetProperty(key string, value interface{}) {
|
|||||||
f.meta[key] = value
|
f.meta[key] = value
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (f *file) Error() error {
|
||||||
|
return f.err
|
||||||
|
}
|
||||||
|
|
||||||
|
func (f *file) SetError(err error) {
|
||||||
|
f.err = err
|
||||||
|
}
|
||||||
|
|
||||||
func (f *file) Data() (*bytes.Buffer, error) {
|
func (f *file) Data() (*bytes.Buffer, error) {
|
||||||
if f.buff != nil {
|
if f.buff != nil {
|
||||||
return f.buff, nil
|
return f.buff, nil
|
||||||
@ -57,12 +66,14 @@ func (f *file) Data() (*bytes.Buffer, error) {
|
|||||||
|
|
||||||
file, err := os.Open(f.path)
|
file, err := os.Open(f.path)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
f.SetError(err)
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
defer file.Close()
|
defer file.Close()
|
||||||
|
|
||||||
var buff bytes.Buffer
|
var buff bytes.Buffer
|
||||||
if _, err := buff.ReadFrom(file); err != nil {
|
if _, err := buff.ReadFrom(file); err != nil {
|
||||||
|
f.SetError(err)
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
40
goldsmith.go
40
goldsmith.go
@ -23,21 +23,19 @@
|
|||||||
package goldsmith
|
package goldsmith
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"io/ioutil"
|
||||||
"path/filepath"
|
"path/filepath"
|
||||||
"sync"
|
|
||||||
|
|
||||||
"github.com/bmatcuk/doublestar"
|
"github.com/bmatcuk/doublestar"
|
||||||
)
|
)
|
||||||
|
|
||||||
type stage struct {
|
type stage struct {
|
||||||
input chan File
|
input, output chan File
|
||||||
output chan File
|
|
||||||
}
|
}
|
||||||
|
|
||||||
type goldsmith struct {
|
type goldsmith struct {
|
||||||
stages []stage
|
stages []stage
|
||||||
files chan File
|
files chan File
|
||||||
wg sync.WaitGroup
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func NewGoldsmith(path string) (Goldsmith, error) {
|
func NewGoldsmith(path string) (Goldsmith, error) {
|
||||||
@ -84,22 +82,34 @@ func (gs *goldsmith) stage() stage {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (gs *goldsmith) NewFile(path string) File {
|
func (gs *goldsmith) NewFile(path string) File {
|
||||||
return &file{path, make(map[string]interface{}), nil}
|
return &file{path: path}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (gs *goldsmith) Apply(p Processor) Goldsmith {
|
func (gs *goldsmith) Apply(p Processor) Goldsmith {
|
||||||
s := gs.stage()
|
s := gs.stage()
|
||||||
|
go p.Process(gs, s.input, s.output)
|
||||||
gs.wg.Add(1)
|
|
||||||
go func() {
|
|
||||||
p.Process(gs, s.input, s.output)
|
|
||||||
gs.wg.Done()
|
|
||||||
}()
|
|
||||||
|
|
||||||
return gs
|
return gs
|
||||||
}
|
}
|
||||||
|
|
||||||
func (gs *goldsmith) Complete(path string) error {
|
func (gs *goldsmith) Complete(path string) []File {
|
||||||
gs.wg.Wait()
|
s := gs.stages[len(gs.stages)-1]
|
||||||
return nil
|
|
||||||
|
var files []File
|
||||||
|
for file := range s.output {
|
||||||
|
data, err := file.Data()
|
||||||
|
if err != nil {
|
||||||
|
file.SetError(err)
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
absPath := filepath.Join(path, file.Path())
|
||||||
|
if err := ioutil.WriteFile(absPath, data.Bytes(), 0644); err != nil {
|
||||||
|
file.SetError(err)
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
files = append(files, file)
|
||||||
|
}
|
||||||
|
|
||||||
|
return files
|
||||||
}
|
}
|
||||||
|
5
types.go
5
types.go
@ -35,6 +35,9 @@ type File interface {
|
|||||||
Property(key string) (interface{}, bool)
|
Property(key string) (interface{}, bool)
|
||||||
SetProperty(key string, value interface{})
|
SetProperty(key string, value interface{})
|
||||||
|
|
||||||
|
Error() error
|
||||||
|
SetError(err error)
|
||||||
|
|
||||||
Data() (*bytes.Buffer, error)
|
Data() (*bytes.Buffer, error)
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -44,5 +47,5 @@ type Processor interface {
|
|||||||
|
|
||||||
type Goldsmith interface {
|
type Goldsmith interface {
|
||||||
Apply(p Processor) Goldsmith
|
Apply(p Processor) Goldsmith
|
||||||
Complete(path string) error
|
Complete(path string) []File
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user