60 lines
No EOL
1 KiB
Go
60 lines
No EOL
1 KiB
Go
package scanner
|
|
|
|
import (
|
|
"git.urbach.dev/cli/q/src/build"
|
|
"git.urbach.dev/cli/q/src/core"
|
|
"git.urbach.dev/cli/q/src/fs"
|
|
)
|
|
|
|
// Scan scans all the files included in the build.
|
|
func Scan(b *build.Build) (*core.Environment, error) {
|
|
s := scanner{
|
|
functions: make(chan *core.Function),
|
|
files: make(chan *fs.File),
|
|
errors: make(chan error),
|
|
build: b,
|
|
}
|
|
|
|
go func() {
|
|
s.queue(b.Files...)
|
|
s.group.Wait()
|
|
close(s.functions)
|
|
close(s.files)
|
|
close(s.errors)
|
|
}()
|
|
|
|
all := &core.Environment{
|
|
Files: make([]*fs.File, 0, 8),
|
|
Functions: make(map[string]*core.Function, 32),
|
|
}
|
|
|
|
for s.functions != nil || s.files != nil || s.errors != nil {
|
|
select {
|
|
case f, ok := <-s.functions:
|
|
if !ok {
|
|
s.functions = nil
|
|
continue
|
|
}
|
|
|
|
all.Functions[f.UniqueName] = f
|
|
|
|
case file, ok := <-s.files:
|
|
if !ok {
|
|
s.files = nil
|
|
continue
|
|
}
|
|
|
|
all.Files = append(all.Files, file)
|
|
|
|
case err, ok := <-s.errors:
|
|
if !ok {
|
|
s.errors = nil
|
|
continue
|
|
}
|
|
|
|
return all, err
|
|
}
|
|
}
|
|
|
|
return all, nil
|
|
} |