///|
priv struct OperatorSpec {
  first : String
  separator : String
  named : Bool
  empty : String
  allow_reserved : Bool
}

///|
fn operator_spec(op : Char) -> OperatorSpec {
  match op {
    '+' =>
      {
        first: "",
        separator: ",",
        named: false,
        empty: "",
        allow_reserved: true,
      }
    '#' =>
      {
        first: "#",
        separator: ",",
        named: false,
        empty: "",
        allow_reserved: true,
      }
    '.' =>
      {
        first: ".",
        separator: ".",
        named: false,
        empty: "",
        allow_reserved: false,
      }
    '/' =>
      {
        first: "/",
        separator: "/",
        named: false,
        empty: "",
        allow_reserved: false,
      }
    ';' =>
      {
        first: ";",
        separator: ";",
        named: true,
        empty: "",
        allow_reserved: false,
      }
    '?' =>
      {
        first: "?",
        separator: "&",
        named: true,
        empty: "=",
        allow_reserved: false,
      }
    '&' =>
      {
        first: "&",
        separator: "&",
        named: true,
        empty: "=",
        allow_reserved: false,
      }
    _ =>
      {
        first: "",
        separator: ",",
        named: false,
        empty: "",
        allow_reserved: false,
      }
  }
}