summary refs log tree commit diff
path: root/src/libstd/json.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/libstd/json.rs')
-rw-r--r--src/libstd/json.rs433
1 files changed, 217 insertions, 216 deletions
diff --git a/src/libstd/json.rs b/src/libstd/json.rs
index eab42a52b59..f8194204626 100644
--- a/src/libstd/json.rs
+++ b/src/libstd/json.rs
@@ -29,17 +29,17 @@ export null;
 /// Represents a json value
 enum json {
     num(float),
-    string(@str/~),
+    string(@~str),
     boolean(bool),
     list(@~[json]),
-    dict(map::hashmap<str, json>),
+    dict(map::hashmap<~str, json>),
     null,
 }
 
 type error = {
     line: uint,
     col: uint,
-    msg: @str/~,
+    msg: @~str,
 };
 
 /// Serializes a json value into a io::writer
@@ -50,14 +50,14 @@ fn to_writer(wr: io::writer, j: json) {
         wr.write_str(escape_str(*s));
       }
       boolean(b) {
-        wr.write_str(if b { "true" } else { "false" });
+        wr.write_str(if b { ~"true" } else { ~"false" });
       }
       list(v) {
         wr.write_char('[');
         let mut first = true;
         for (*v).each |item| {
             if !first {
-                wr.write_str(", ");
+                wr.write_str(~", ");
             }
             first = false;
             to_writer(wr, item);
@@ -66,51 +66,51 @@ fn to_writer(wr: io::writer, j: json) {
       }
       dict(d) {
         if d.size() == 0u {
-            wr.write_str("{}");
+            wr.write_str(~"{}");
             ret;
         }
 
-        wr.write_str("{ ");
+        wr.write_str(~"{ ");
         let mut first = true;
         for d.each |key, value| {
             if !first {
-                wr.write_str(", ");
+                wr.write_str(~", ");
             }
             first = false;
             wr.write_str(escape_str(key));
-            wr.write_str(": ");
+            wr.write_str(~": ");
             to_writer(wr, value);
         };
-        wr.write_str(" }");
+        wr.write_str(~" }");
       }
       null {
-        wr.write_str("null");
+        wr.write_str(~"null");
       }
     }
 }
 
-fn escape_str(s: str) -> str {
-    let mut escaped = "\"";
+fn escape_str(s: ~str) -> ~str {
+    let mut escaped = ~"\"";
     do str::chars_iter(s) |c| {
         alt c {
-          '"' { escaped += "\\\""; }
-          '\\' { escaped += "\\\\"; }
-          '\x08' { escaped += "\\b"; }
-          '\x0c' { escaped += "\\f"; }
-          '\n' { escaped += "\\n"; }
-          '\r' { escaped += "\\r"; }
-          '\t' { escaped += "\\t"; }
+          '"' { escaped += ~"\\\""; }
+          '\\' { escaped += ~"\\\\"; }
+          '\x08' { escaped += ~"\\b"; }
+          '\x0c' { escaped += ~"\\f"; }
+          '\n' { escaped += ~"\\n"; }
+          '\r' { escaped += ~"\\r"; }
+          '\t' { escaped += ~"\\t"; }
           _ { escaped += str::from_char(c); }
         }
     };
 
-    escaped += "\"";
+    escaped += ~"\"";
 
     escaped
 }
 
 /// Serializes a json value into a string
-fn to_str(j: json) -> str {
+fn to_str(j: json) -> ~str {
     io::with_str_writer(|wr| to_writer(wr, j))
 }
 
@@ -140,7 +140,7 @@ impl parser for parser {
         self.ch
     }
 
-    fn error<T>(+msg: str) -> result<T, error> {
+    fn error<T>(+msg: ~str) -> result<T, error> {
         err({ line: self.line, col: self.col, msg: @msg })
     }
 
@@ -153,7 +153,7 @@ impl parser for parser {
             if self.eof() {
                 ok(value)
             } else {
-                self.error("trailing characters")
+                self.error(~"trailing characters")
             }
           }
           e { e }
@@ -163,12 +163,12 @@ impl parser for parser {
     fn parse_value() -> result<json, error> {
         self.parse_whitespace();
 
-        if self.eof() { ret self.error("EOF while parsing value"); }
+        if self.eof() { ret self.error(~"EOF while parsing value"); }
 
         alt self.ch {
-          'n' { self.parse_ident("ull", null) }
-          't' { self.parse_ident("rue", boolean(true)) }
-          'f' { self.parse_ident("alse", boolean(false)) }
+          'n' { self.parse_ident(~"ull", null) }
+          't' { self.parse_ident(~"rue", boolean(true)) }
+          'f' { self.parse_ident(~"alse", boolean(false)) }
           '0' to '9' | '-' { self.parse_number() }
           '"' {
               alt self.parse_str() {
@@ -178,7 +178,7 @@ impl parser for parser {
           }
           '[' { self.parse_list() }
           '{' { self.parse_object() }
-          _ { self.error("invalid syntax") }
+          _ { self.error(~"invalid syntax") }
         }
     }
 
@@ -186,12 +186,12 @@ impl parser for parser {
         while char::is_whitespace(self.ch) { self.bump(); }
     }
 
-    fn parse_ident(ident: str, value: json) -> result<json, error> {
+    fn parse_ident(ident: ~str, value: json) -> result<json, error> {
         if str::all(ident, |c| c == self.next_char()) {
             self.bump();
             ok(value)
         } else {
-            self.error("invalid syntax")
+            self.error(~"invalid syntax")
         }
     }
 
@@ -234,7 +234,7 @@ impl parser for parser {
 
             // There can be only one leading '0'.
             alt self.ch {
-              '0' to '9' { ret self.error("invalid number"); }
+              '0' to '9' { ret self.error(~"invalid number"); }
               _ {}
             }
           }
@@ -251,7 +251,7 @@ impl parser for parser {
                 }
             }
           }
-          _ { ret self.error("invalid number"); }
+          _ { ret self.error(~"invalid number"); }
         }
 
         ok(res)
@@ -263,7 +263,7 @@ impl parser for parser {
         // Make sure a digit follows the decimal place.
         alt self.ch {
           '0' to '9' {}
-          _ { ret self.error("invalid number"); }
+          _ { ret self.error(~"invalid number"); }
         }
 
         let mut res = res;
@@ -299,7 +299,7 @@ impl parser for parser {
         // Make sure a digit follows the exponent place.
         alt self.ch {
           '0' to '9' {}
-          _ { ret self.error("invalid number"); }
+          _ { ret self.error(~"invalid number"); }
         }
 
         while !self.eof() {
@@ -324,9 +324,9 @@ impl parser for parser {
         ok(res)
     }
 
-    fn parse_str() -> result<@str/~, error> {
+    fn parse_str() -> result<@~str, error> {
         let mut escape = false;
-        let mut res = "";
+        let mut res = ~"";
 
         while !self.eof() {
             self.bump();
@@ -351,19 +351,19 @@ impl parser for parser {
                               n = n * 10u +
                                   (self.ch as uint) - ('0' as uint);
                             }
-                            _ { ret self.error("invalid \\u escape"); }
+                            _ { ret self.error(~"invalid \\u escape"); }
                           }
                           i += 1u;
                       }
 
                       // Error out if we didn't parse 4 digits.
                       if i != 4u {
-                          ret self.error("invalid \\u escape");
+                          ret self.error(~"invalid \\u escape");
                       }
 
                       str::push_char(res, n as char);
                   }
-                  _ { ret self.error("invalid escape"); }
+                  _ { ret self.error(~"invalid escape"); }
                 }
                 escape = false;
             } else if self.ch == '\\' {
@@ -377,7 +377,7 @@ impl parser for parser {
             }
         }
 
-        self.error("EOF while parsing string")
+        self.error(~"EOF while parsing string")
     }
 
     fn parse_list() -> result<json, error> {
@@ -399,13 +399,13 @@ impl parser for parser {
 
             self.parse_whitespace();
             if self.eof() {
-                ret self.error("EOF while parsing list");
+                ret self.error(~"EOF while parsing list");
             }
 
             alt self.ch {
               ',' { self.bump(); }
               ']' { self.bump(); ret ok(list(@values)); }
-              _ { ret self.error("expected `,` or `]`"); }
+              _ { ret self.error(~"expected `,` or `]`"); }
             }
         };
     }
@@ -425,7 +425,7 @@ impl parser for parser {
             self.parse_whitespace();
 
             if self.ch != '"' {
-                ret self.error("key must be a string");
+                ret self.error(~"key must be a string");
             }
 
             let key = alt self.parse_str() {
@@ -437,7 +437,7 @@ impl parser for parser {
 
             if self.ch != ':' {
                 if self.eof() { break; }
-                ret self.error("expected `:`");
+                ret self.error(~"expected `:`");
             }
             self.bump();
 
@@ -452,12 +452,12 @@ impl parser for parser {
               '}' { self.bump(); ret ok(dict(values)); }
               _ {
                   if self.eof() { break; }
-                  ret self.error("expected `,` or `}`");
+                  ret self.error(~"expected `,` or `}`");
               }
             }
         }
 
-        ret self.error("EOF while parsing object");
+        ret self.error(~"EOF while parsing object");
     }
 }
 
@@ -474,7 +474,7 @@ fn from_reader(rdr: io::reader) -> result<json, error> {
 }
 
 /// Deserializes a json value from a string
-fn from_str(s: str) -> result<json, error> {
+fn from_str(s: ~str) -> result<json, error> {
     io::with_str_reader(s, from_reader)
 }
 
@@ -575,11 +575,11 @@ impl of to_json for bool {
     fn to_json() -> json { boolean(self) }
 }
 
-impl of to_json for str {
+impl of to_json for ~str {
     fn to_json() -> json { string(@copy self) }
 }
 
-impl of to_json for @str/~ {
+impl of to_json for @~str {
     fn to_json() -> json { string(self) }
 }
 
@@ -602,7 +602,7 @@ impl <A: to_json> of to_json for ~[A] {
     fn to_json() -> json { list(@self.map(|elt| elt.to_json())) }
 }
 
-impl <A: to_json copy> of to_json for hashmap<str, A> {
+impl <A: to_json copy> of to_json for hashmap<~str, A> {
     fn to_json() -> json {
         let d = map::str_hash();
         for self.each() |key, value| {
@@ -622,18 +622,18 @@ impl <A: to_json> of to_json for option<A> {
 }
 
 impl of to_str::to_str for json {
-    fn to_str() -> str { to_str(self) }
+    fn to_str() -> ~str { to_str(self) }
 }
 
 impl of to_str::to_str for error {
-    fn to_str() -> str {
+    fn to_str() -> ~str {
         #fmt("%u:%u: %s", self.line, self.col, *self.msg)
     }
 }
 
 #[cfg(test)]
 mod tests {
-    fn mk_dict(items: ~[(str, json)]) -> json {
+    fn mk_dict(items: ~[(~str, json)]) -> json {
         let d = map::str_hash();
 
         do vec::iter(items) |item| {
@@ -646,229 +646,230 @@ mod tests {
 
     #[test]
     fn test_write_null() {
-        assert to_str(null) == "null";
+        assert to_str(null) == ~"null";
     }
 
     #[test]
     fn test_write_num() {
-        assert to_str(num(3f)) == "3";
-        assert to_str(num(3.1f)) == "3.1";
-        assert to_str(num(-1.5f)) == "-1.5";
-        assert to_str(num(0.5f)) == "0.5";
+        assert to_str(num(3f)) == ~"3";
+        assert to_str(num(3.1f)) == ~"3.1";
+        assert to_str(num(-1.5f)) == ~"-1.5";
+        assert to_str(num(0.5f)) == ~"0.5";
     }
 
     #[test]
     fn test_write_str() {
-        assert to_str(string(@""/~)) == "\"\""/~;
-        assert to_str(string(@"foo"/~)) == "\"foo\""/~;
+        assert to_str(string(@~"")) == ~"\"\"";
+        assert to_str(string(@~"foo")) == ~"\"foo\"";
     }
 
     #[test]
     fn test_write_bool() {
-        assert to_str(boolean(true)) == "true";
-        assert to_str(boolean(false)) == "false";
+        assert to_str(boolean(true)) == ~"true";
+        assert to_str(boolean(false)) == ~"false";
     }
 
     #[test]
     fn test_write_list() {
-        assert to_str(list(@~[])) == "[]";
-        assert to_str(list(@~[boolean(true)])) == "[true]";
+        assert to_str(list(@~[])) == ~"[]";
+        assert to_str(list(@~[boolean(true)])) == ~"[true]";
         assert to_str(list(@~[
             boolean(false),
             null,
-            list(@~[string(@"foo\nbar"/~), num(3.5f)])
-        ])) == "[false, null, [\"foo\\nbar\", 3.5]]";
+            list(@~[string(@~"foo\nbar"), num(3.5f)])
+        ])) == ~"[false, null, [\"foo\\nbar\", 3.5]]";
     }
 
     #[test]
     fn test_write_dict() {
-        assert to_str(mk_dict(~[])) == "{}";
-        assert to_str(mk_dict(~[("a", boolean(true))])) == "{ \"a\": true }";
+        assert to_str(mk_dict(~[])) == ~"{}";
+        assert to_str(mk_dict(~[(~"a", boolean(true))]))
+            == ~"{ \"a\": true }";
         assert to_str(mk_dict(~[
-            ("a", boolean(true)),
-            ("b", list(@~[
-                mk_dict(~[("c", string(@"\x0c\r"/~))]),
-                mk_dict(~[("d", string(@""/~))])
+            (~"a", boolean(true)),
+            (~"b", list(@~[
+                mk_dict(~[(~"c", string(@~"\x0c\r"))]),
+                mk_dict(~[(~"d", string(@~""))])
             ]))
         ])) ==
-            "{ " +
-                "\"a\": true, " +
-                "\"b\": [" +
-                    "{ \"c\": \"\\f\\r\" }, " +
-                    "{ \"d\": \"\" }" +
-                "]" +
-            " }";
+            ~"{ " +
+                ~"\"a\": true, " +
+                ~"\"b\": [" +
+                    ~"{ \"c\": \"\\f\\r\" }, " +
+                    ~"{ \"d\": \"\" }" +
+                ~"]" +
+            ~" }";
     }
 
     #[test]
     fn test_trailing_characters() {
-        assert from_str("nulla") ==
-            err({line: 1u, col: 5u, msg: @"trailing characters"/~});
-        assert from_str("truea") ==
-            err({line: 1u, col: 5u, msg: @"trailing characters"/~});
-        assert from_str("falsea") ==
-            err({line: 1u, col: 6u, msg: @"trailing characters"/~});
-        assert from_str("1a") ==
-            err({line: 1u, col: 2u, msg: @"trailing characters"/~});
-        assert from_str("[]a") ==
-            err({line: 1u, col: 3u, msg: @"trailing characters"/~});
-        assert from_str("{}a") ==
-            err({line: 1u, col: 3u, msg: @"trailing characters"/~});
+        assert from_str(~"nulla") ==
+            err({line: 1u, col: 5u, msg: @~"trailing characters"});
+        assert from_str(~"truea") ==
+            err({line: 1u, col: 5u, msg: @~"trailing characters"});
+        assert from_str(~"falsea") ==
+            err({line: 1u, col: 6u, msg: @~"trailing characters"});
+        assert from_str(~"1a") ==
+            err({line: 1u, col: 2u, msg: @~"trailing characters"});
+        assert from_str(~"[]a") ==
+            err({line: 1u, col: 3u, msg: @~"trailing characters"});
+        assert from_str(~"{}a") ==
+            err({line: 1u, col: 3u, msg: @~"trailing characters"});
     }
 
     #[test]
     fn test_read_identifiers() {
-        assert from_str("n") ==
-            err({line: 1u, col: 2u, msg: @"invalid syntax"/~});
-        assert from_str("nul") ==
-            err({line: 1u, col: 4u, msg: @"invalid syntax"/~});
+        assert from_str(~"n") ==
+            err({line: 1u, col: 2u, msg: @~"invalid syntax"});
+        assert from_str(~"nul") ==
+            err({line: 1u, col: 4u, msg: @~"invalid syntax"});
 
-        assert from_str("t") ==
-            err({line: 1u, col: 2u, msg: @"invalid syntax"/~});
-        assert from_str("truz") ==
-            err({line: 1u, col: 4u, msg: @"invalid syntax"/~});
+        assert from_str(~"t") ==
+            err({line: 1u, col: 2u, msg: @~"invalid syntax"});
+        assert from_str(~"truz") ==
+            err({line: 1u, col: 4u, msg: @~"invalid syntax"});
 
-        assert from_str("f") ==
-            err({line: 1u, col: 2u, msg: @"invalid syntax"/~});
-        assert from_str("faz") ==
-            err({line: 1u, col: 3u, msg: @"invalid syntax"/~});
+        assert from_str(~"f") ==
+            err({line: 1u, col: 2u, msg: @~"invalid syntax"});
+        assert from_str(~"faz") ==
+            err({line: 1u, col: 3u, msg: @~"invalid syntax"});
 
-        assert from_str("null") == ok(null);
-        assert from_str("true") == ok(boolean(true));
-        assert from_str("false") == ok(boolean(false));
-        assert from_str(" null ") == ok(null);
-        assert from_str(" true ") == ok(boolean(true));
-        assert from_str(" false ") == ok(boolean(false));
+        assert from_str(~"null") == ok(null);
+        assert from_str(~"true") == ok(boolean(true));
+        assert from_str(~"false") == ok(boolean(false));
+        assert from_str(~" null ") == ok(null);
+        assert from_str(~" true ") == ok(boolean(true));
+        assert from_str(~" false ") == ok(boolean(false));
     }
 
     #[test]
     fn test_read_num() {
-        assert from_str("+") ==
-            err({line: 1u, col: 1u, msg: @"invalid syntax"/~});
-        assert from_str(".") ==
-            err({line: 1u, col: 1u, msg: @"invalid syntax"/~});
-
-        assert from_str("-") ==
-            err({line: 1u, col: 2u, msg: @"invalid number"/~});
-        assert from_str("00") ==
-            err({line: 1u, col: 2u, msg: @"invalid number"/~});
-        assert from_str("1.") ==
-            err({line: 1u, col: 3u, msg: @"invalid number"/~});
-        assert from_str("1e") ==
-            err({line: 1u, col: 3u, msg: @"invalid number"/~});
-        assert from_str("1e+") ==
-            err({line: 1u, col: 4u, msg: @"invalid number"/~});
-
-        assert from_str("3") == ok(num(3f));
-        assert from_str("3.1") == ok(num(3.1f));
-        assert from_str("-1.2") == ok(num(-1.2f));
-        assert from_str("0.4") == ok(num(0.4f));
-        assert from_str("0.4e5") == ok(num(0.4e5f));
-        assert from_str("0.4e+15") == ok(num(0.4e15f));
-        assert from_str("0.4e-01") == ok(num(0.4e-01f));
-        assert from_str(" 3 ") == ok(num(3f));
+        assert from_str(~"+") ==
+            err({line: 1u, col: 1u, msg: @~"invalid syntax"});
+        assert from_str(~".") ==
+            err({line: 1u, col: 1u, msg: @~"invalid syntax"});
+
+        assert from_str(~"-") ==
+            err({line: 1u, col: 2u, msg: @~"invalid number"});
+        assert from_str(~"00") ==
+            err({line: 1u, col: 2u, msg: @~"invalid number"});
+        assert from_str(~"1.") ==
+            err({line: 1u, col: 3u, msg: @~"invalid number"});
+        assert from_str(~"1e") ==
+            err({line: 1u, col: 3u, msg: @~"invalid number"});
+        assert from_str(~"1e+") ==
+            err({line: 1u, col: 4u, msg: @~"invalid number"});
+
+        assert from_str(~"3") == ok(num(3f));
+        assert from_str(~"3.1") == ok(num(3.1f));
+        assert from_str(~"-1.2") == ok(num(-1.2f));
+        assert from_str(~"0.4") == ok(num(0.4f));
+        assert from_str(~"0.4e5") == ok(num(0.4e5f));
+        assert from_str(~"0.4e+15") == ok(num(0.4e15f));
+        assert from_str(~"0.4e-01") == ok(num(0.4e-01f));
+        assert from_str(~" 3 ") == ok(num(3f));
     }
 
     #[test]
     fn test_read_str() {
-        assert from_str("\"") ==
-            err({line: 1u, col: 2u, msg: @"EOF while parsing string"/~});
-        assert from_str("\"lol") ==
-            err({line: 1u, col: 5u, msg: @"EOF while parsing string"/~});
+        assert from_str(~"\"") ==
+            err({line: 1u, col: 2u, msg: @~"EOF while parsing string"});
+        assert from_str(~"\"lol") ==
+            err({line: 1u, col: 5u, msg: @~"EOF while parsing string"});
 
-        assert from_str("\"\"") == ok(string(@""/~));
-        assert from_str("\"foo\"") == ok(string(@"foo"/~));
-        assert from_str("\"\\\"\"") == ok(string(@"\""/~));
-        assert from_str("\"\\b\"") == ok(string(@"\x08"/~));
-        assert from_str("\"\\n\"") == ok(string(@"\n"/~));
-        assert from_str("\"\\r\"") == ok(string(@"\r"/~));
-        assert from_str("\"\\t\"") == ok(string(@"\t"/~));
-        assert from_str(" \"foo\" ") == ok(string(@"foo"/~));
+        assert from_str(~"\"\"") == ok(string(@~""));
+        assert from_str(~"\"foo\"") == ok(string(@~"foo"));
+        assert from_str(~"\"\\\"\"") == ok(string(@~"\""));
+        assert from_str(~"\"\\b\"") == ok(string(@~"\x08"));
+        assert from_str(~"\"\\n\"") == ok(string(@~"\n"));
+        assert from_str(~"\"\\r\"") == ok(string(@~"\r"));
+        assert from_str(~"\"\\t\"") == ok(string(@~"\t"));
+        assert from_str(~" \"foo\" ") == ok(string(@~"foo"));
     }
 
     #[test]
     fn test_read_list() {
-        assert from_str("[") ==
-            err({line: 1u, col: 2u, msg: @"EOF while parsing value"/~});
-        assert from_str("[1") ==
-            err({line: 1u, col: 3u, msg: @"EOF while parsing list"/~});
-        assert from_str("[1,") ==
-            err({line: 1u, col: 4u, msg: @"EOF while parsing value"/~});
-        assert from_str("[1,]") ==
-            err({line: 1u, col: 4u, msg: @"invalid syntax"/~});
-        assert from_str("[6 7]") ==
-            err({line: 1u, col: 4u, msg: @"expected `,` or `]`"/~});
-
-        assert from_str("[]") == ok(list(@~[]));
-        assert from_str("[ ]") == ok(list(@~[]));
-        assert from_str("[true]") == ok(list(@~[boolean(true)]));
-        assert from_str("[ false ]") == ok(list(@~[boolean(false)]));
-        assert from_str("[null]") == ok(list(@~[null]));
-        assert from_str("[3, 1]") == ok(list(@~[num(3f), num(1f)]));
-        assert from_str("\n[3, 2]\n") == ok(list(@~[num(3f), num(2f)]));
-        assert from_str("[2, [4, 1]]") ==
+        assert from_str(~"[") ==
+            err({line: 1u, col: 2u, msg: @~"EOF while parsing value"});
+        assert from_str(~"[1") ==
+            err({line: 1u, col: 3u, msg: @~"EOF while parsing list"});
+        assert from_str(~"[1,") ==
+            err({line: 1u, col: 4u, msg: @~"EOF while parsing value"});
+        assert from_str(~"[1,]") ==
+            err({line: 1u, col: 4u, msg: @~"invalid syntax"});
+        assert from_str(~"[6 7]") ==
+            err({line: 1u, col: 4u, msg: @~"expected `,` or `]`"});
+
+        assert from_str(~"[]") == ok(list(@~[]));
+        assert from_str(~"[ ]") == ok(list(@~[]));
+        assert from_str(~"[true]") == ok(list(@~[boolean(true)]));
+        assert from_str(~"[ false ]") == ok(list(@~[boolean(false)]));
+        assert from_str(~"[null]") == ok(list(@~[null]));
+        assert from_str(~"[3, 1]") == ok(list(@~[num(3f), num(1f)]));
+        assert from_str(~"\n[3, 2]\n") == ok(list(@~[num(3f), num(2f)]));
+        assert from_str(~"[2, [4, 1]]") ==
                ok(list(@~[num(2f), list(@~[num(4f), num(1f)])]));
     }
 
     #[test]
     fn test_read_dict() {
-        assert from_str("{") ==
-            err({line: 1u, col: 2u, msg: @"EOF while parsing object"/~});
-        assert from_str("{ ") ==
-            err({line: 1u, col: 3u, msg: @"EOF while parsing object"/~});
-        assert from_str("{1") ==
-            err({line: 1u, col: 2u, msg: @"key must be a string"/~});
-        assert from_str("{ \"a\"") ==
-            err({line: 1u, col: 6u, msg: @"EOF while parsing object"/~});
-        assert from_str("{\"a\"") ==
-            err({line: 1u, col: 5u, msg: @"EOF while parsing object"/~});
-        assert from_str("{\"a\" ") ==
-            err({line: 1u, col: 6u, msg: @"EOF while parsing object"/~});
-
-        assert from_str("{\"a\" 1") ==
-            err({line: 1u, col: 6u, msg: @"expected `:`"/~});
-        assert from_str("{\"a\":") ==
-            err({line: 1u, col: 6u, msg: @"EOF while parsing value"/~});
-        assert from_str("{\"a\":1") ==
-            err({line: 1u, col: 7u, msg: @"EOF while parsing object"/~});
-        assert from_str("{\"a\":1 1") ==
-            err({line: 1u, col: 8u, msg: @"expected `,` or `}`"/~});
-        assert from_str("{\"a\":1,") ==
-            err({line: 1u, col: 8u, msg: @"EOF while parsing object"/~});
-
-        assert eq(result::get(from_str("{}")), mk_dict(~[]));
-        assert eq(result::get(from_str("{\"a\": 3}")),
-                  mk_dict(~[("a", num(3.0f))]));
-
-        assert eq(result::get(from_str("{ \"a\": null, \"b\" : true }")),
+        assert from_str(~"{") ==
+            err({line: 1u, col: 2u, msg: @~"EOF while parsing object"});
+        assert from_str(~"{ ") ==
+            err({line: 1u, col: 3u, msg: @~"EOF while parsing object"});
+        assert from_str(~"{1") ==
+            err({line: 1u, col: 2u, msg: @~"key must be a string"});
+        assert from_str(~"{ \"a\"") ==
+            err({line: 1u, col: 6u, msg: @~"EOF while parsing object"});
+        assert from_str(~"{\"a\"") ==
+            err({line: 1u, col: 5u, msg: @~"EOF while parsing object"});
+        assert from_str(~"{\"a\" ") ==
+            err({line: 1u, col: 6u, msg: @~"EOF while parsing object"});
+
+        assert from_str(~"{\"a\" 1") ==
+            err({line: 1u, col: 6u, msg: @~"expected `:`"});
+        assert from_str(~"{\"a\":") ==
+            err({line: 1u, col: 6u, msg: @~"EOF while parsing value"});
+        assert from_str(~"{\"a\":1") ==
+            err({line: 1u, col: 7u, msg: @~"EOF while parsing object"});
+        assert from_str(~"{\"a\":1 1") ==
+            err({line: 1u, col: 8u, msg: @~"expected `,` or `}`"});
+        assert from_str(~"{\"a\":1,") ==
+            err({line: 1u, col: 8u, msg: @~"EOF while parsing object"});
+
+        assert eq(result::get(from_str(~"{}")), mk_dict(~[]));
+        assert eq(result::get(from_str(~"{\"a\": 3}")),
+                  mk_dict(~[(~"a", num(3.0f))]));
+
+        assert eq(result::get(from_str(~"{ \"a\": null, \"b\" : true }")),
                   mk_dict(~[
-                      ("a", null),
-                      ("b", boolean(true))]));
-        assert eq(result::get(from_str("\n{ \"a\": null, \"b\" : true }\n")),
+                      (~"a", null),
+                      (~"b", boolean(true))]));
+        assert eq(result::get(from_str(~"\n{ \"a\": null, \"b\" : true }\n")),
                   mk_dict(~[
-                      ("a", null),
-                      ("b", boolean(true))]));
-        assert eq(result::get(from_str("{\"a\" : 1.0 ,\"b\": [ true ]}")),
+                      (~"a", null),
+                      (~"b", boolean(true))]));
+        assert eq(result::get(from_str(~"{\"a\" : 1.0 ,\"b\": [ true ]}")),
                   mk_dict(~[
-                      ("a", num(1.0)),
-                      ("b", list(@~[boolean(true)]))
+                      (~"a", num(1.0)),
+                      (~"b", list(@~[boolean(true)]))
                   ]));
         assert eq(result::get(from_str(
-                      "{" +
-                          "\"a\": 1.0, " +
-                          "\"b\": [" +
-                              "true," +
-                              "\"foo\\nbar\", " +
-                              "{ \"c\": {\"d\": null} } " +
-                          "]" +
-                      "}")),
+                      ~"{" +
+                          ~"\"a\": 1.0, " +
+                          ~"\"b\": [" +
+                              ~"true," +
+                              ~"\"foo\\nbar\", " +
+                              ~"{ \"c\": {\"d\": null} } " +
+                          ~"]" +
+                      ~"}")),
                   mk_dict(~[
-                      ("a", num(1.0f)),
-                      ("b", list(@~[
+                      (~"a", num(1.0f)),
+                      (~"b", list(@~[
                           boolean(true),
-                          string(@"foo\nbar"/~),
+                          string(@~"foo\nbar"),
                           mk_dict(~[
-                              ("c", mk_dict(~[("d", null)]))
+                              (~"c", mk_dict(~[(~"d", null)]))
                           ])
                       ]))
                   ]));
@@ -876,7 +877,7 @@ mod tests {
 
     #[test]
     fn test_multiline_errors() {
-        assert from_str("{\n  \"foo\":\n \"bar\"") ==
-            err({line: 3u, col: 8u, msg: @"EOF while parsing object"/~});
+        assert from_str(~"{\n  \"foo\":\n \"bar\"") ==
+            err({line: 3u, col: 8u, msg: @~"EOF while parsing object"});
     }
 }