stringy/
stringy.rs

1//! A little interactive string thing.
2
3use std::io::Write;
4use trivet::strings::EncodingStandard;
5use trivet::strings::StringEncoder;
6use trivet::strings::StringParser;
7use trivet::strings::StringStandard;
8
9pub fn main() {
10    // Make a string parser.
11    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    // Run until we can run no more.  You have to break this with
26    // ctrl+c.
27    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}