use std::io; use toml::Value as TomlValue; const DEFAULT_PROJECT_ROOT_MARKERS: &[&str] = &[".git"]; /// Reads `project_root_markers` from a merged `config.toml` [toml::Value]. /// /// Invariants: /// - If `project_root_markers` is not specified, returns `Ok(None)`. /// - If `project_root_markers` is specified, returns `Ok(Some(markers))` where /// `markers` is a `Vec` (including `Ok(Some(Vec::new()))` for an /// empty array, which indicates that root detection should be disabled). /// - Returns an error if `project_root_markers` is specified but is not an /// array of strings. pub fn project_root_markers_from_config(config: &TomlValue) -> io::Result>> { let Some(table) = config.as_table() else { return Ok(None); }; let Some(markers_value) = table.get("project_root_markers") else { return Ok(None); }; let TomlValue::Array(entries) = markers_value else { return Err(io::Error::new( io::ErrorKind::InvalidData, "project_root_markers must be an array of strings", )); }; if entries.is_empty() { return Ok(Some(Vec::new())); } let mut markers = Vec::new(); for entry in entries { let Some(marker) = entry.as_str() else { return Err(io::Error::new( io::ErrorKind::InvalidData, "project_root_markers must be an array of strings", )); }; markers.push(marker.to_string()); } Ok(Some(markers)) } pub fn default_project_root_markers() -> Vec { DEFAULT_PROJECT_ROOT_MARKERS .iter() .map(ToString::to_string) .collect() }