doc_string.pony

use json = "../json"

class val DocString is NodeData
  """Represents a doc string."""

  let string: NodeWith[LiteralString]

  new val create(string': NodeWith[LiteralString]) =>
    string = string'

  fun name(): String => "DocString"

  fun val clone(updates: ChildUpdateMap): NodeData =>
    DocString(try updates(string)? as NodeWith[LiteralString] else string end)

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

primitive ParseDocString
  fun apply(obj: json.Object val, children: NodeSeq): (DocString | String) =>
    let string =
      match ParseNode._get_child_with[LiteralString](
        obj,
        children,
        "string",
        "DocString.string must be a LiteralString")
      | let string': NodeWith[LiteralString] =>
        string'
      | let err: String =>
        return err
      else
        return "DocString.string must be a LiteralString"
      end
    DocString(string)