mirror of
https://github.com/Dummi26/mers.git
synced 2025-03-10 14:13:52 +01:00
forgot to add files to last commit. L.
This commit is contained in:
parent
0feb1b8778
commit
ca3dd4c798
4
build_scripts/build.sh
Executable file
4
build_scripts/build.sh
Executable file
@ -0,0 +1,4 @@
|
|||||||
|
#!/usr/bin/env sh
|
||||||
|
cd ../mers
|
||||||
|
cargo build --release
|
||||||
|
cp target/release/mers ../build_scripts
|
5
build_scripts/install_nu_plugin.sh
Executable file
5
build_scripts/install_nu_plugin.sh
Executable file
@ -0,0 +1,5 @@
|
|||||||
|
#!/usr/bin/env sh
|
||||||
|
cd ../mers
|
||||||
|
cargo build --features nushell_plugin --profile nushellplugin
|
||||||
|
cp target/nushellplugin/mers ../build_scripts/nu_plugin_mers
|
||||||
|
echo "done. now run 'register nu_plugin_mers' in nu. You should then be able to use mers-nu."
|
4
build_scripts/install_nu_plugin_auto.sh
Executable file
4
build_scripts/install_nu_plugin_auto.sh
Executable file
@ -0,0 +1,4 @@
|
|||||||
|
#!/usr/bin/env nu
|
||||||
|
./install_nu_plugin.sh
|
||||||
|
register nu_plugin_mers
|
||||||
|
echo "registered plugin automatically."
|
BIN
build_scripts/mers
Executable file
BIN
build_scripts/mers
Executable file
Binary file not shown.
BIN
build_scripts/nu_plugin_mers
Executable file
BIN
build_scripts/nu_plugin_mers
Executable file
Binary file not shown.
0
custom_type.mers
Normal file → Executable file
0
custom_type.mers
Normal file → Executable file
132
mers/src/nushell_plugin.rs
Executable file
132
mers/src/nushell_plugin.rs
Executable file
@ -0,0 +1,132 @@
|
|||||||
|
use std::{fs, path::PathBuf};
|
||||||
|
|
||||||
|
use nu_plugin::{serve_plugin, MsgPackSerializer, Plugin};
|
||||||
|
use nu_protocol::{PluginExample, PluginSignature, ShellError, Span, Spanned, SyntaxShape, Value};
|
||||||
|
|
||||||
|
use crate::{
|
||||||
|
parse,
|
||||||
|
script::{
|
||||||
|
global_info::GlobalScriptInfo,
|
||||||
|
val_data::{VData, VDataEnum},
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
pub fn main() {
|
||||||
|
serve_plugin(&mut MersNuPlugin(), MsgPackSerializer {});
|
||||||
|
}
|
||||||
|
|
||||||
|
struct MersNuPlugin();
|
||||||
|
|
||||||
|
impl Plugin for MersNuPlugin {
|
||||||
|
fn signature(&self) -> Vec<nu_protocol::PluginSignature> {
|
||||||
|
vec![PluginSignature::build("mers-nu")
|
||||||
|
.required(
|
||||||
|
"mers",
|
||||||
|
SyntaxShape::String,
|
||||||
|
"the path to the .mers file to run or the mers source code if -e is set",
|
||||||
|
)
|
||||||
|
.optional(
|
||||||
|
"args",
|
||||||
|
SyntaxShape::List(Box::new(SyntaxShape::String)),
|
||||||
|
"the arguments passed to the mers program. defaults to an empty list.",
|
||||||
|
)
|
||||||
|
.switch(
|
||||||
|
"execute",
|
||||||
|
"instead of reading from a file, interpret the 'mers' input as source code",
|
||||||
|
Some('e'),
|
||||||
|
)]
|
||||||
|
}
|
||||||
|
fn run(
|
||||||
|
&mut self,
|
||||||
|
name: &str,
|
||||||
|
call: &nu_plugin::EvaluatedCall,
|
||||||
|
input: &nu_protocol::Value,
|
||||||
|
) -> Result<nu_protocol::Value, nu_plugin::LabeledError> {
|
||||||
|
// no need to 'match name {...}' because we only register mers-nu and nothing else.
|
||||||
|
let source: String = call.req(0)?;
|
||||||
|
let source_span = Span::unknown(); // source.span;
|
||||||
|
// let source = source.item;
|
||||||
|
let mut file = if call.has_flag("execute") {
|
||||||
|
parse::file::File::new(source, PathBuf::new())
|
||||||
|
} else {
|
||||||
|
parse::file::File::new(
|
||||||
|
match fs::read_to_string(&source) {
|
||||||
|
Ok(v) => v,
|
||||||
|
Err(e) => {
|
||||||
|
return Ok(Value::Error {
|
||||||
|
error: Box::new(ShellError::FileNotFound(source_span)),
|
||||||
|
})
|
||||||
|
}
|
||||||
|
},
|
||||||
|
source.into(),
|
||||||
|
)
|
||||||
|
};
|
||||||
|
Ok(match parse::parse::parse(&mut file) {
|
||||||
|
Ok(code) => {
|
||||||
|
let args = match call.opt(1)? {
|
||||||
|
Some(v) => v,
|
||||||
|
_ => vec![],
|
||||||
|
};
|
||||||
|
fn to_nu_val(val: VData, info: &GlobalScriptInfo) -> Value {
|
||||||
|
let span = Span::unknown();
|
||||||
|
match val.data {
|
||||||
|
VDataEnum::Bool(val) => Value::Bool { val, span },
|
||||||
|
VDataEnum::Int(val) => Value::Int {
|
||||||
|
val: val as _,
|
||||||
|
span,
|
||||||
|
},
|
||||||
|
VDataEnum::Float(val) => Value::Float { val, span },
|
||||||
|
VDataEnum::String(val) => Value::String { val, span },
|
||||||
|
VDataEnum::Tuple(vals) | VDataEnum::List(_, vals) => Value::List {
|
||||||
|
vals: vals.into_iter().map(|v| to_nu_val(v, info)).collect(),
|
||||||
|
span,
|
||||||
|
},
|
||||||
|
VDataEnum::Reference(r) => to_nu_val(
|
||||||
|
std::mem::replace(
|
||||||
|
&mut *r.lock().unwrap(),
|
||||||
|
VDataEnum::Tuple(vec![]).to(),
|
||||||
|
),
|
||||||
|
info,
|
||||||
|
),
|
||||||
|
VDataEnum::EnumVariant(variant, val) => {
|
||||||
|
let name = info
|
||||||
|
.enum_variants
|
||||||
|
.iter()
|
||||||
|
.find_map(|(name, id)| {
|
||||||
|
if *id == variant {
|
||||||
|
Some(name.to_owned())
|
||||||
|
} else {
|
||||||
|
None
|
||||||
|
}
|
||||||
|
})
|
||||||
|
.unwrap();
|
||||||
|
Value::Record {
|
||||||
|
cols: vec![format!("Enum"), format!("Value")],
|
||||||
|
vals: vec![
|
||||||
|
Value::String {
|
||||||
|
val: name,
|
||||||
|
span: span,
|
||||||
|
},
|
||||||
|
to_nu_val(*val, info),
|
||||||
|
],
|
||||||
|
span,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
VDataEnum::Function(func) => Value::Nothing { span },
|
||||||
|
VDataEnum::Thread(t, _) => to_nu_val(t.get(), info),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
to_nu_val(code.run(args), code.info().as_ref())
|
||||||
|
}
|
||||||
|
Err(e) => Value::Error {
|
||||||
|
error: Box::new(ShellError::IncorrectValue {
|
||||||
|
msg: format!(
|
||||||
|
"Couldn't compile mers, error: {}",
|
||||||
|
e.0.with_file_and_gsinfo(&file, e.1.as_ref())
|
||||||
|
),
|
||||||
|
span: source_span,
|
||||||
|
}),
|
||||||
|
},
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user