literal_string.pony

use json = "../json"

primitive StringLiteral
primitive StringTripleQuote

type StringLiteralKind is (StringLiteral | StringTripleQuote)

class val LiteralString is NodeDataWithValue[LiteralString, String]
  let _value: String
  let kind: StringLiteralKind

  new val create(value': String, kind': StringLiteralKind) =>
    _value = value'
    kind = kind'

  fun name(): String => "LiteralString"

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

  fun add_json_props(node: Node box, props: Array[(String, json.Item)]) =>
    let kind_str =
      match kind
      | StringLiteral => "StringLiteral"
      | StringTripleQuote => "StringTripleQuote"
      end
    props.push(("kind", kind_str))
    props.push(("value", _value))

  fun value(): String => _value

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