///|
fn parse_json_argv(source : String) -> Array[String]? {
  let text = source.trim().to_owned()
  if !text.has_prefix("[") || !text.has_suffix("]") {
    return None
  }
  let inner = text[1:text.length() - 1].to_owned()
  let result : Array[String] = []
  let mut i = skip_ws(inner, 0)
  if i >= inner.length() {
    return Some(result)
  }
  let mut expect_comma = false
  while i < inner.length() {
    i = skip_ws(inner, i)
    if i >= inner.length() {
      break
    }
    if expect_comma {
      if inner.get_char(i) is Some(',') {
        i += 1
        expect_comma = false
        continue
      } else {
        return None
      }
    }
    if !(inner.get_char(i) is Some('"')) {
      return None
    }
    i += 1
    let buf = StringBuilder()
    let mut closed = false
    while i < inner.length() {
      match inner.get_char(i) {
        None => return None
        Some('\\') => {
          if i + 1 >= inner.length() {
            return None
          }
          match inner.get_char(i + 1) {
            None => return None
            Some(ch) => buf.write_char(ch)
          }
          i += 2
        }
        Some('"') => {
          i += 1
          closed = true
          break
        }
        Some(ch) => {
          buf.write_char(ch)
          i += 1
        }
      }
    }
    if !closed {
      return None
    }
    result.push(buf.to_string())
    expect_comma = true
  }
  Some(result)
}