55 lines
1.2 KiB
Go
55 lines
1.2 KiB
Go
// 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
|
|
}
|