package folders

import (
	"errors"
	"os"
	"path/filepath"
)

// FindDirWithLeaf returns the first directory that holds `leaf`,
// traversing up to the root of the filesystem, starting at `dir`.
func FindDirWithLeaf(dir string, leaf string) (string, error) {
	for {
		_, err := os.Stat(filepath.Join(dir, leaf))

		// No error means we found the leaf in dir.
		if err == nil {
			return dir, nil
		}

		// ErrNotExist means we continue traversal up the tree.
		if errors.Is(err, os.ErrNotExist) {
			next := filepath.Dir(dir)
			if dir == next {
				// Return if we cannot continue traversal.
				return "", err
			}

			dir = next
			continue
		}

		return "", err
	}
}