1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
use super::custom::Custom;
use super::formatter::Formatter;
use std::fmt;
#[derive(Debug, Clone)]
pub enum JavaScript {
}
impl Custom for JavaScript {
type Extra = ();
fn quote_string(out: &mut Formatter, input: &str) -> fmt::Result {
out.write_char('"')?;
for c in input.chars() {
match c {
'\t' => out.write_str("\\t")?,
'\u{0007}' => out.write_str("\\b")?,
'\n' => out.write_str("\\n")?,
'\r' => out.write_str("\\r")?,
'\u{0014}' => out.write_str("\\f")?,
'\'' => out.write_str("\\'")?,
'"' => out.write_str("\\\"")?,
'\\' => out.write_str("\\\\")?,
c => out.write_char(c)?,
};
}
out.write_char('"')?;
Ok(())
}
}
#[cfg(test)]
mod tests {
use tokens::Tokens;
use super::JavaScript;
use quoted::Quoted;
#[test]
fn test_function() {
let mut file: Tokens<JavaScript> = Tokens::new();
file.push("function foo(v) {");
file.nested(toks!("return v + ", ", World".quoted(), ";"));
file.push("}");
file.push(toks!("foo(", "Hello".quoted(), ");"));
assert_eq!(
Ok(String::from(
"function foo(v) {\n return v + \", World\";\n}\nfoo(\"Hello\");",
)),
file.to_string()
);
}
#[test]
fn test_string() {
let mut toks: Tokens<JavaScript> = Tokens::new();
toks.append("hello \n world".quoted());
assert_eq!(Ok(String::from("\"hello \\n world\"")), toks.to_string());
}
}