///|
pub fn ThemeDocument::to_yaml(self : ThemeDocument) -> String {
  let document = self.sorted()
  if document.tokens.length() == 0 {
    return "tokens: []\n"
  }
  let builder = StringBuilder::new()
  builder.write_string("tokens:\n")
  for token in document.tokens {
    builder.write_string("  - path: ")
    builder.write_string(yaml_quote(token.path.canonical()))
    builder.write_string("\n    kind: ")
    builder.write_string(token_kind_name(token.kind))
    builder.write_string("\n    value: ")
    builder.write_string(theme_value_yaml(token.value))
    builder.write_string("\n")
    if token.description != "" {
      builder.write_string("    description: ")
      builder.write_string(yaml_quote(token.description))
      builder.write_string("\n")
    }
  }
  builder.to_string()
}

///|
fn theme_value_yaml(value : ThemeValue) -> String {
  match value {
    ColorValue(text) => text
    NumberValue(number) => number.to_string()
    TextValue(text) => yaml_quote(text)
    BooleanValue(flag) => if flag { "true" } else { "false" }
  }
}

///|
fn yaml_quote(text : String) -> String {
  "'" + text.replace(old="'", new="''") + "'"
}

///|
fn token_kind_name(kind : TokenKind) -> String {
  match kind {
    Color => "color"
    Number => "number"
    Text => "text"
    Boolean => "boolean"
  }
}