keyword.pony

use json = "../json"

primitive Keywords
  """The source of truth for the string values of keywords."""

  fun kwd_actor(): String => "actor"
  fun kwd_addressof(): String => "addressof"
  fun kwd_and(): String => "and"
  fun kwd_as(): String => "as"
  fun kwd_be(): String => "be"
  fun kwd_box(): String => "box"
  fun kwd_break(): String => "break"
  fun kwd_class(): String => "class"
  fun kwd_compile_error(): String => "compile_error"
  fun kwd_compile_intrinsic(): String => "compile_intrinsic"
  fun kwd_consume(): String => "consume"
  fun kwd_continue(): String => "continue"
  fun kwd_digestof(): String => "digestof"
  fun kwd_do(): String => "do"
  fun kwd_else(): String => "else"
  fun kwd_elseif(): String => "elseif"
  fun kwd_embed(): String => "embed"
  fun kwd_end(): String => "end"
  fun kwd_error(): String => "error"
  fun kwd_false(): String => "false"
  fun kwd_for(): String => "for"
  fun kwd_fun(): String => "fun"
  fun kwd_hash_alias(): String => "#alias"
  fun kwd_hash_any(): String => "#any"
  fun kwd_hash_read(): String => "#read"
  fun kwd_hash_send(): String => "#send"
  fun kwd_hash_share(): String => "#share"
  fun kwd_if(): String => "if"
  fun kwd_ifdef(): String => "ifdef"
  fun kwd_iftype(): String => "iftype"
  fun kwd_in(): String => "in"
  fun kwd_interface(): String => "interface"
  fun kwd_is(): String => "is"
  fun kwd_iso(): String => "iso"
  fun kwd_let(): String => "let"
  fun kwd_loc(): String => "__loc"
  fun kwd_match(): String => "match"
  fun kwd_new(): String => "new"
  fun kwd_not(): String => "not"
  fun kwd_object(): String => "object"
  fun kwd_or(): String => "or"
  fun kwd_primitive(): String => "primitive"
  fun kwd_ref(): String => "ref"
  fun kwd_recover(): String => "recover"
  fun kwd_repeat(): String => "repeat"
  fun kwd_return(): String => "return"
  fun kwd_struct(): String => "struct"
  fun kwd_tag(): String => "tag"
  fun kwd_then(): String => "then"
  fun kwd_this(): String => "this"
  fun kwd_trait(): String => "trait"
  fun kwd_trn(): String => "trn"
  fun kwd_true(): String => "true"
  fun kwd_try(): String => "try"
  fun kwd_type(): String => "type"
  fun kwd_until(): String => "until"
  fun kwd_use(): String => "use"
  fun kwd_val(): String => "val"
  fun kwd_var(): String => "var"
  fun kwd_where(): String => "where"
  fun kwd_while(): String => "while"
  fun kwd_with(): String => "with"
  fun kwd_xor(): String => "xor"

class val Keyword is NodeData
  let string: String

  new val create(string': String) =>
    string = string'

  fun name(): String => "Keyword"

  fun val clone(updates: ChildUpdateMap): NodeData =>
    this

  fun add_json_props(node: Node box, props: Array[(String, json.Item)]) =>
    props.push(("string", string))

primitive ParseKeyword
  fun apply(obj: json.Object val, children: NodeSeq): (Keyword | String) =>
    let string =
      match try obj("string")? end
      | let str: String box =>
        str
      else
        return "Keyword.string must be a string"
      end
    Keyword(string.clone())