nu_plugin_ron/
lib.rs

1pub mod transform;
2
3use nu_plugin::{EvaluatedCall, LabeledError, Plugin};
4use nu_protocol::{Category, PluginSignature, ShellError, Type, Value as NuValue};
5use ron::{ser::PrettyConfig, Value as RonValue};
6
7pub struct NuRon;
8
9impl Plugin for NuRon {
10    fn signature(&self) -> Vec<PluginSignature> {
11        vec![
12            PluginSignature::build("from ron")
13                .input_output_type(Type::String, Type::Record(vec![]))
14                .usage("Transform RON text to nushell table")
15                .category(Category::Formats),
16            PluginSignature::build("to ron")
17                .input_output_type(Type::Record(vec![]), Type::String)
18                .usage("Transform nushell table to RON text")
19                .category(Category::Formats),
20        ]
21    }
22
23    fn run(
24        &mut self,
25        name: &str,
26        call: &EvaluatedCall,
27        input: &NuValue,
28    ) -> Result<NuValue, LabeledError> {
29        let span = call.head;
30        match name {
31            "from ron" => {
32                let ron_val: RonValue =
33                    match input.as_string().expect("input is not a string").parse() {
34                        Ok(val) => val,
35                        Err(err) => {
36                            return Err(LabeledError {
37                                label: err.code.to_string(),
38                                msg: format!(
39                                    "Error encountered on line: {}, col: {} while parsing the doc",
40                                    err.position.line, err.position.col
41                                ),
42                                span: Some(span),
43                            })
44                        }
45                    };
46                match transform::ron_to_nu(ron_val, span) {
47                    Ok(val) => Ok(val),
48                    Err(err) => Err(LabeledError {
49                        label: err.to_string(),
50                        msg: "Unable to transform Nushell table to RON text".into(),
51                        span: Some(span),
52                    }),
53                }
54            }
55            "to ron" => {
56                let ron_val = transform::nu_to_ron(input, span).unwrap();
57                Ok(NuValue::string(
58                    ron::ser::to_string_pretty(&ron_val, PrettyConfig::new()).unwrap(),
59                    span,
60                ))
61            }
62            _ => Err(LabeledError {
63                label: ShellError::DidYouMean("from ron / to ron".into(), span).to_string(),
64                msg: "RON plugin for Nushell only supports from/to".into(),
65                span: Some(span),
66            }),
67        }
68    }
69}