// Deterministic semantic serializer.

///|
fn write_record(sb : StringBuilder, name : String, value : String) -> Unit {
  sb.write_string(name)
  sb.write_string(": ")
  sb.write_string(value)
  sb.write_char('\n')
}

///|
pub fn serialize_robots(file : RobotsFile) -> String {
  let sb = StringBuilder::new()
  for index, group in file.groups() {
    if index > 0 {
      sb.write_char('\n')
    }
    for agent in group.user_agents() {
      write_record(sb, "User-agent", agent)
    }
    for rule in group.rules() {
      write_record(sb, rule.kind().directive_name(), rule.pattern())
    }
  }
  if file.other_records().length() > 0 {
    if file.groups().length() > 0 {
      sb.write_char('\n')
    }
    for record in file.other_records() {
      write_record(sb, record.canonical_name(), record.value())
    }
  }
  sb.to_string()
}

///|
pub fn stats_to_text(file : RobotsFile) -> String {
  let s = file.stats()
  let sb = StringBuilder::new()
  sb.write_string("groups: \{s.groups()}\n")
  sb.write_string("user_agents: \{s.user_agents()}\n")
  sb.write_string("rules: \{s.rules()}\n")
  sb.write_string("allows: \{s.allows()}\n")
  sb.write_string("disallows: \{s.disallows()}\n")
  sb.write_string("other_records: \{s.other_records()}\n")
  sb.write_string("comments: \{s.comments()}\n")
  sb.write_string("blank_lines: \{s.blank_lines()}\n")
  sb.write_string("source_lines: \{s.source_lines()}\n")
  sb.to_string()
}