nu_cli/
nu_highlight.rs

1use std::sync::Arc;
2
3use nu_engine::command_prelude::*;
4use reedline::{Highlighter, StyledText};
5
6#[derive(Clone)]
7pub struct NuHighlight;
8
9impl Command for NuHighlight {
10    fn name(&self) -> &str {
11        "nu-highlight"
12    }
13
14    fn signature(&self) -> Signature {
15        Signature::build("nu-highlight")
16            .category(Category::Strings)
17            .input_output_types(vec![(Type::String, Type::String)])
18    }
19
20    fn description(&self) -> &str {
21        "Syntax highlight the input string."
22    }
23
24    fn search_terms(&self) -> Vec<&str> {
25        vec!["syntax", "color", "convert"]
26    }
27
28    fn run(
29        &self,
30        engine_state: &EngineState,
31        stack: &mut Stack,
32        call: &Call,
33        input: PipelineData,
34    ) -> Result<PipelineData, ShellError> {
35        let head = call.head;
36
37        let signals = engine_state.signals();
38
39        let highlighter = crate::NuHighlighter {
40            engine_state: Arc::new(engine_state.clone()),
41            stack: Arc::new(stack.clone()),
42        };
43
44        input.map(
45            move |x| match x.coerce_into_string() {
46                Ok(line) => {
47                    let highlights = highlighter.highlight(&line, line.len());
48                    Value::string(highlights.render_simple(), head)
49                }
50                Err(err) => Value::error(err, head),
51            },
52            signals,
53        )
54    }
55
56    fn examples(&self) -> Vec<Example> {
57        vec![Example {
58            description: "Describe the type of a string",
59            example: "'let x = 3' | nu-highlight",
60            result: None,
61        }]
62    }
63}
64
65/// A highlighter that does nothing
66///
67/// Used to remove highlighting from a reedline instance
68/// (letting NuHighlighter structs be dropped)
69#[derive(Default)]
70pub struct NoOpHighlighter {}
71
72impl Highlighter for NoOpHighlighter {
73    fn highlight(&self, _line: &str, _cursor: usize) -> reedline::StyledText {
74        StyledText::new()
75    }
76}