You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
78 lines
2.0 KiB
Markdown
78 lines
2.0 KiB
Markdown
2 years ago
|
# embed-nu
|
||
|
|
||
|
*embed-nu* can be used to call [nu](https://github.com/nushell/nushell) scripts and expressions
|
||
|
from within your rust application. This crate provides a wrapper around the nu engine to easily build
|
||
|
the nu execution context, parse scripts and call functions. As this crate includes nu as a dependency
|
||
|
calls to nu don't have the overhead of calling an external application.
|
||
|
|
||
|
## Example Usage
|
||
|
|
||
|
```rust
|
||
|
use embed_nu::{rusty_value::RustyValue, CommandGroupConfig, Context, NewEmpty, PipelineData};
|
||
|
|
||
|
fn main() {
|
||
|
let mut ctx = Context::builder()
|
||
|
.with_command_groups(CommandGroupConfig::default().all_groups(true))
|
||
|
.add_parent_env_vars()
|
||
|
.build()
|
||
|
.unwrap();
|
||
|
|
||
|
// eval a nu expression
|
||
|
let pipeline = ctx
|
||
|
.eval_raw(
|
||
|
r#"echo "Hello World from this eval""#,
|
||
|
PipelineData::empty(),
|
||
|
)
|
||
|
.unwrap();
|
||
|
|
||
|
// print the pipeline of this expression. In this case
|
||
|
// this pipeline contains the text of the echo expression
|
||
|
// as it's the last expressin
|
||
|
ctx.print_pipeline(pipeline).unwrap();
|
||
|
|
||
|
// this eval put's the function definition of hello into scope
|
||
|
ctx.eval_raw(
|
||
|
r#"
|
||
|
def hello [] {
|
||
|
echo "Hello World from this script";
|
||
|
echo # dummy echo so I don't have to print the output
|
||
|
}
|
||
|
"#,
|
||
|
PipelineData::empty(),
|
||
|
)
|
||
|
.unwrap();
|
||
|
|
||
|
// hello can now be called as a function
|
||
|
ctx.call_fn("hello", [] as [String; 0]).unwrap();
|
||
|
}
|
||
|
```
|
||
|
|
||
|
|
||
|
## Converting data into nu values
|
||
|
|
||
|
This crate uses [rusty-value](https://github.com/Trivernis/rusty-value) to convert any rust
|
||
|
data type into nu values.
|
||
|
|
||
|
```rust
|
||
|
use embed_nu::{rusty_value::RustyValue, IntoValue};
|
||
|
|
||
|
|
||
|
// derive rusty value
|
||
|
#[derive(RustyValue)]
|
||
|
struct MyStruct {
|
||
|
foo: String,
|
||
|
bar: usize,
|
||
|
}
|
||
|
|
||
|
fn main() {
|
||
|
let instance = MyStruct {
|
||
|
foo: String::from("foo"),
|
||
|
bar: 12
|
||
|
};
|
||
|
// convert this struct into a nu value
|
||
|
// this is also done implicitely when passing the value to the nu context
|
||
|
// as function arguments or variables
|
||
|
let value = instance.into_value();
|
||
|
dbg!(value);
|
||
|
}
|
||
|
```
|