initial commit [ci skip]
This commit is contained in:
54
engine/resource/parser.go
Normal file
54
engine/resource/parser.go
Normal file
@@ -0,0 +1,54 @@
|
||||
// Copyright 2019 Drone.IO Inc. All rights reserved.
|
||||
// Use of this source code is governed by the Polyform License
|
||||
// that can be found in the LICENSE file.
|
||||
|
||||
package resource
|
||||
|
||||
import (
|
||||
"errors"
|
||||
|
||||
"github.com/drone/runner-go/manifest"
|
||||
|
||||
"github.com/buildkite/yaml"
|
||||
)
|
||||
|
||||
func init() {
|
||||
manifest.Register(parse)
|
||||
}
|
||||
|
||||
// parse parses the raw resource and returns an Exec pipeline.
|
||||
func parse(r *manifest.RawResource) (manifest.Resource, bool, error) {
|
||||
if !match(r) {
|
||||
return nil, false, nil
|
||||
}
|
||||
out := new(Pipeline)
|
||||
err := yaml.Unmarshal(r.Data, out)
|
||||
if err != nil {
|
||||
return out, true, err
|
||||
}
|
||||
err = lint(out)
|
||||
return out, true, err
|
||||
}
|
||||
|
||||
// match returns true if the resource matches the kind and type.
|
||||
func match(r *manifest.RawResource) bool {
|
||||
return r.Kind == Kind && r.Type == Type
|
||||
}
|
||||
|
||||
func lint(pipeline *Pipeline) error {
|
||||
// ensure pipeline steps are not unique.
|
||||
names := map[string]struct{}{}
|
||||
for _, step := range pipeline.Steps {
|
||||
if step.Name == "" {
|
||||
return errors.New("Linter: invalid or missing step name")
|
||||
}
|
||||
if len(step.Name) > 100 {
|
||||
return errors.New("Linter: step name cannot exceed 100 characters")
|
||||
}
|
||||
if _, ok := names[step.Name]; ok {
|
||||
return errors.New("Linter: duplicate step name")
|
||||
}
|
||||
names[step.Name] = struct{}{}
|
||||
}
|
||||
return nil
|
||||
}
|
||||
Reference in New Issue
Block a user