1use std::io::Write;
4use trivet::strings::EncodingStandard;
5use trivet::strings::StringEncoder;
6use trivet::strings::StringParser;
7use trivet::strings::StringStandard;
8
9pub fn main() {
10 let mut strpar = StringParser::new();
12 let mut encoder = StringEncoder::new();
13 println!(
14 r#"
15Enter strings to process, one per line. You can switch the string
16standard used for parsing by entering any of the following.
17
18 +python +c +json +rust +trivet
19
20Toggle using Unicode names in output with +names. Toggle encoding
21of all non-ascii with +ascii.
22 "#
23 );
24
25 let mut standard = StringStandard::Trivet;
28 let mut ascii = false;
29 let mut names = false;
30 loop {
31 let mut line = String::new();
32 print!(
33 "{}{}{}> ",
34 standard,
35 if ascii { " (ascii)" } else { "" },
36 if names { " (names)" } else { "" },
37 );
38 let _ = std::io::stdout().flush();
39 std::io::stdin().read_line(&mut line).unwrap();
40 line.pop();
41 match line.as_str() {
42 "+python" => {
43 standard = StringStandard::Python;
44 strpar.set(standard);
45 }
46 "+rust" => {
47 standard = StringStandard::Rust;
48 strpar.set(standard);
49 }
50 "+c" => {
51 standard = StringStandard::C;
52 strpar.set(standard);
53 }
54 "+json" => {
55 standard = StringStandard::JSON;
56 strpar.set(standard);
57 }
58 "+trivet" => {
59 standard = StringStandard::Trivet;
60 strpar.set(standard);
61 }
62 "+names" => {
63 names = !names;
64 }
65 "+ascii" => {
66 ascii = !ascii;
67 }
68 _ => match strpar.parse_string(&line) {
69 Ok(value) => {
70 println!(" Debug: {:?}", value);
71 encoder.set(StringStandard::C);
72 if ascii {
73 encoder.encoding_standard = EncodingStandard::ASCII;
74 }
75 if names {
76 encoder.use_names = true;
77 }
78 println!(" C: \"{}\"", encoder.encode(&value));
79 encoder.set(StringStandard::JSON);
80 if ascii {
81 encoder.encoding_standard = EncodingStandard::ASCII;
82 }
83 if names {
84 encoder.use_names = true;
85 }
86 println!(" JSON: \"{}\"", encoder.encode(&value));
87 encoder.set(StringStandard::Rust);
88 if ascii {
89 encoder.encoding_standard = EncodingStandard::ASCII;
90 }
91 if names {
92 encoder.use_names = true;
93 }
94 println!(" Rust: \"{}\"", encoder.encode(&value));
95 encoder.set(StringStandard::Python);
96 if ascii {
97 encoder.encoding_standard = EncodingStandard::ASCII;
98 }
99 if names {
100 encoder.use_names = true;
101 }
102 println!(" Python: \"{}\"", encoder.encode(&value));
103 encoder.set(StringStandard::Trivet);
104 if ascii {
105 encoder.encoding_standard = EncodingStandard::ASCII;
106 }
107 if names {
108 encoder.use_names = true;
109 }
110 println!(" Trivet: \"{}\"", encoder.encode(&value));
111 }
112 Err(err) => {
113 println!("ERROR: {}", err)
114 }
115 },
116 }
117 }
118}