nu_command/help/
help_escapes.rs

1use nu_engine::command_prelude::*;
2
3#[derive(Clone)]
4pub struct HelpEscapes;
5
6impl Command for HelpEscapes {
7    fn name(&self) -> &str {
8        "help escapes"
9    }
10
11    fn description(&self) -> &str {
12        "Show help on nushell string escapes."
13    }
14
15    fn signature(&self) -> Signature {
16        Signature::build("help escapes")
17            .category(Category::Core)
18            .input_output_types(vec![(Type::Nothing, Type::table())])
19            .allow_variants_without_examples(true)
20    }
21
22    fn run(
23        &self,
24        _engine_state: &EngineState,
25        _stack: &mut Stack,
26        call: &Call,
27        _input: PipelineData,
28    ) -> Result<PipelineData, ShellError> {
29        let head = call.head;
30        let escape_info = generate_escape_info();
31        let mut recs = vec![];
32
33        for escape in escape_info {
34            recs.push(Value::record(
35                record! {
36                    "sequence" => Value::string(escape.sequence, head),
37                    "output" => Value::string(escape.output, head),
38                },
39                head,
40            ));
41        }
42
43        Ok(Value::list(recs, call.head).into_pipeline_data())
44    }
45}
46
47struct EscapeInfo {
48    sequence: String,
49    output: String,
50}
51
52fn generate_escape_info() -> Vec<EscapeInfo> {
53    vec![
54        EscapeInfo {
55            sequence: "\\\"".into(),
56            output: "\"".into(),
57        },
58        EscapeInfo {
59            sequence: "\\\'".into(),
60            output: "\'".into(),
61        },
62        EscapeInfo {
63            sequence: "\\\\".into(),
64            output: "\\".into(),
65        },
66        EscapeInfo {
67            sequence: "\\/".into(),
68            output: "/".into(),
69        },
70        EscapeInfo {
71            sequence: "\\(".into(),
72            output: "(".into(),
73        },
74        EscapeInfo {
75            sequence: "\\)".into(),
76            output: ")".into(),
77        },
78        EscapeInfo {
79            sequence: "\\{".into(),
80            output: "{".into(),
81        },
82        EscapeInfo {
83            sequence: "\\}".into(),
84            output: "}".into(),
85        },
86        EscapeInfo {
87            sequence: "\\$".into(),
88            output: "$".into(),
89        },
90        EscapeInfo {
91            sequence: "\\^".into(),
92            output: "^".into(),
93        },
94        EscapeInfo {
95            sequence: "\\#".into(),
96            output: "#".into(),
97        },
98        EscapeInfo {
99            sequence: "\\|".into(),
100            output: "|".into(),
101        },
102        EscapeInfo {
103            sequence: "\\~".into(),
104            output: "~".into(),
105        },
106        EscapeInfo {
107            sequence: "\\a".into(),
108            output: "alert bell".into(),
109        },
110        EscapeInfo {
111            sequence: "\\b".into(),
112            output: "backspace".into(),
113        },
114        EscapeInfo {
115            sequence: "\\e".into(),
116            output: "escape".into(),
117        },
118        EscapeInfo {
119            sequence: "\\f".into(),
120            output: "form feed".into(),
121        },
122        EscapeInfo {
123            sequence: "\\n".into(),
124            output: "newline (line feed)".into(),
125        },
126        EscapeInfo {
127            sequence: "\\r".into(),
128            output: "carriage return".into(),
129        },
130        EscapeInfo {
131            sequence: "\\t".into(),
132            output: "tab".into(),
133        },
134        EscapeInfo {
135            sequence: "\\u{X...}".into(),
136            output: "a single unicode character, where X... is 1-6 digits (0-9, A-F)".into(),
137        },
138    ]
139}
140
141#[cfg(test)]
142mod test {
143    #[test]
144    fn test_examples() {
145        use super::HelpEscapes;
146        use crate::test_examples;
147        test_examples(HelpEscapes {})
148    }
149}