func ParseConfigs()

in gke-deploy/core/resource/resource.go [79:145]


func ParseConfigs(ctx context.Context, configs string, oss services.OSService, recursive bool) (Objects, error) {
	objs := Objects{}

	if configs == "-" {
		if recursive {
			return nil, fmt.Errorf("cannot recur with stdin")
		}
		objs, err := parseResourcesFromFile(ctx, configs, objs, oss)
		if err != nil {
			return nil, fmt.Errorf("failed to parse config from stdin: %v", err)
		}
		return objs, nil
	}

	fi, err := oss.Stat(ctx, configs)
	if err != nil {
		return nil, fmt.Errorf("failed to get file info for %q: %v", configs, err)
	}

	if !fi.IsDir() && recursive {
		return nil, fmt.Errorf("cannot recur through a file")
	}

	hasResources := false

	// Since walk is recursive, we need to declare it before creating the function that refers to it.
	var walk func(path string, fi os.FileInfo, baseDir bool) error
	walk = func(path string, fi os.FileInfo, baseDir bool) error {
		if fi.IsDir() {
			if !baseDir && !recursive {
				return nil
			}
			subfiles, err := oss.ReadDir(ctx, path)
			if err != nil {
				return fmt.Errorf("failed to list files in directory %q: %v", path, err)
			}
			for _, subfile := range subfiles {
				subpath := filepath.Join(path, subfile.Name())
				if err = walk(subpath, subfile, false); err != nil {
					return err
				}
			}
		} else {
			if hasYamlOrYmlSuffix(path) {
				hasResources = true
				objs, err = parseResourcesFromFile(ctx, path, objs, oss)
				if err != nil {
					return fmt.Errorf("failed to parse config %q: %v", path, err)
				}
			}
		}
		return nil
	}

	if err = walk(configs, fi, true); err != nil {
		return nil, err
	}

	if !hasResources {
		if fi.IsDir() {
			return nil, fmt.Errorf("directory %q has no \".yaml\" or \".yml\" files to parse", configs)
		}
		return nil, fmt.Errorf("file %q does not end in \".yaml\" or \".yml\"", configs)
	}

	return objs, nil
}