discoverClayConfig function

DiscoveredClayConfig discoverClayConfig({
  1. String? configPath,
  2. String? cwd,
})

Discovers clay.yaml using an explicit configPath or walk-up from cwd.

When configPath is provided, it is resolved relative to cwd unless absolute. The parent directory of the config file becomes the project root.

When configPath is omitted, parent directories of cwd are searched until a clay.yaml is found or the filesystem root is reached.

Implementation

DiscoveredClayConfig discoverClayConfig({
  String? configPath,
  String? cwd,
}) {
  final workingDir = p.normalize(p.absolute(cwd ?? Directory.current.path));

  if (configPath != null) {
    final resolvedConfig = p.isAbsolute(configPath)
        ? p.normalize(configPath)
        : p.normalize(p.join(workingDir, configPath));

    if (!File(resolvedConfig).existsSync()) {
      throw ClayConfigNotFoundException(
        message: 'clay.yaml not found at $resolvedConfig',
        searchedPaths: [resolvedConfig],
      );
    }

    return DiscoveredClayConfig(
      configPath: resolvedConfig,
      projectRoot: p.dirname(resolvedConfig),
    );
  }

  final searchedPaths = collectClayConfigSearchPaths(startDir: workingDir);
  for (final candidate in searchedPaths) {
    if (File(candidate).existsSync()) {
      return DiscoveredClayConfig(
        configPath: candidate,
        projectRoot: p.dirname(candidate),
      );
    }
  }

  throw ClayConfigNotFoundException(
    message: 'clay.yaml not found. Walked up from $workingDir.',
    searchedPaths: searchedPaths,
  );
}