pub fn indent(line: &str) -> usize {
line.len() - line.trim_start_matches(' ').len()
}
pub fn is_blank_or_comment(line: &str) -> bool {
let trimmed = line.trim_start();
trimmed.is_empty() || trimmed.starts_with('#')
}
pub fn is_list_item(line: &str) -> bool {
let trimmed = line.trim_start();
trimmed == "-" || trimmed.starts_with("- ")
}
pub fn split_flow_items(inner: &str) -> Vec<&str> {
inner
.split(',')
.map(str::trim)
.filter(|item| !item.is_empty())
.collect()
}
pub fn line_map_key(line: &str) -> Option<String> {
let content = line.trim_start();
if content.is_empty() || content.starts_with('#') || content.starts_with("- ") {
return None;
}
let colon_idx = content.find(':')?;
let after = &content[colon_idx + 1..];
if after.is_empty() || after.starts_with(' ') {
let key = content[..colon_idx].trim();
if !key.is_empty() {
return Some(key.to_string());
}
}
None
}