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#[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}