///|
/// Translation maintenance renames only a typed symbol and its references.
/// Identical words in human text, variable names and comments are not replaced.
fn main {
  let input = "# old must remain a comment\nold = 你好 { $old }\nuse = { old } / old stays text\n"
  let root = @ftl.parse(input)
  let renamed = match root.rename_symbol(@ftl.MessageSymbol, "old", "welcome") {
    Ok(n) => n
    Err(_) => abort("rename rejected")
  }
  let output = @ftl.serialize_checked(renamed) catch {
    _ => abort("unsafe output")
  }
  if !output.contains("# old must remain a comment") ||
    !output.contains("{ $old }") ||
    !output.contains("{ welcome }") ||
    !output.contains("old stays text") {
    abort("rename changed the wrong token")
  }
  let reparsed = @ftl.parse(output)
  let catalog = match @ftl.Catalog::build(reparsed) {
    Ok(c) => c
    Err(_) => abort("catalog failed")
  }
  if catalog.find(@ftl.MessageSymbol, "welcome").length() != 1 ||
    !catalog.missing_references().is_empty() {
    abort("roundtrip integrity failed")
  }
  println(output)
  println("translation: definition and reference renamed; text preserved")
}