From 423b9536da6d0d44bc53371dd2813c9f21d5d5a8 Mon Sep 17 00:00:00 2001 From: Yann Hamon Date: Sun, 1 Nov 2020 20:10:03 +0100 Subject: [PATCH] Refactor resource discovery --- pkg/resource/files.go | 71 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 71 insertions(+) create mode 100644 pkg/resource/files.go diff --git a/pkg/resource/files.go b/pkg/resource/files.go new file mode 100644 index 0000000..8c9bc1a --- /dev/null +++ b/pkg/resource/files.go @@ -0,0 +1,71 @@ +package resource + +import ( + "bytes" + "io/ioutil" + "os" + "path/filepath" + "strings" +) + +func isYAMLFile(info os.FileInfo) bool { + return !info.IsDir() && (strings.HasSuffix(strings.ToLower(info.Name()), ".yaml") || strings.HasSuffix(strings.ToLower(info.Name()), ".yml")) +} + +func isJSONFile(info os.FileInfo) bool { + return !info.IsDir() && (strings.HasSuffix(strings.ToLower(info.Name()), ".json")) +} + +type DiscoveryError struct { + Path string + Err error +} + +func (de DiscoveryError) Error() string { + return de.Err.Error() +} + +func FromFiles(paths ...string) (<-chan Resource, <-chan error) { + resources := make(chan Resource) + errors := make(chan error) + + go func() { + for _, path := range paths { + // we handle errors in the walk function directly + // so it should be safe to discard the outer error + _ = filepath.Walk(path, func(p string, i os.FileInfo, err error) error { + if err != nil { + errors <- DiscoveryError{p, err} + return err + } + + if !isYAMLFile(i) && !isJSONFile(i) { + return nil + } + + f, err := os.Open(p) + if err != nil { + errors <- DiscoveryError{p, err} + return err + } + + b, err := ioutil.ReadAll(f) + if err != nil { + errors <- DiscoveryError{p, err} + return err + } + + for _, r := range bytes.Split(b, []byte("---\n")) { + resources <- Resource{Path: p, Bytes: r} + } + + return nil + }) + } + + close(resources) + close(errors) + }() + + return resources, errors +}