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}