use serde_json::{json, Value as JsonValue};
pub fn full_document_edits(text: &str) -> noyalib::Result<Vec<JsonValue>> {
let formatted = noyalib::cst::parse_document(text)?.to_string();
if formatted == text {
return Ok(Vec::new());
}
let end_line = text
.bytes()
.filter(|&b| b == b'\n')
.count()
.max(1)
.saturating_sub(if text.ends_with('\n') { 1 } else { 0 });
let end_character = text.lines().last().unwrap_or("").len();
Ok(vec![json!({
"range": {
"start": {"line": 0, "character": 0},
"end": {"line": end_line, "character": end_character},
},
"newText": formatted,
})])
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn already_canonical_input_returns_empty_edits() {
let edits = full_document_edits("a: 1\nb: 2\n").unwrap();
assert!(edits.is_empty());
}
#[test]
fn unparseable_input_propagates_error() {
let res = full_document_edits("a: [\n");
assert!(res.is_err());
}
#[test]
fn well_formed_input_produces_text_edit_array() {
let edits = full_document_edits("simple: yaml\n").unwrap();
for e in &edits {
assert!(e["range"]["start"]["line"].is_u64());
assert!(e["range"]["end"]["line"].is_u64());
assert!(e["newText"].is_string());
}
}
}