#nu #applications #embed #engine #script #call #wrapper

embed-nu

将 nu 引擎嵌入您的 Rust 应用程序

28 个版本

0.9.1 2024 年 3 月 2 日
0.8.0 2023 年 5 月 22 日
0.5.6 2023 年 3 月 27 日
0.4.0 2022 年 12 月 14 日
0.3.5 2022 年 11 月 14 日

#881 in 算法

Download history

每月 624 次下载
用于 2 个 crate(通过 sloppy-core

Apache-2.0 和可能 CC-PDDC

40KB
1K SLoC

embed-nu

embed-nu 可以用于在您的 Rust 应用程序中调用 nu 脚本和表达式。此 crate 提供了对 nu 引擎的包装,以便轻松构建 nu 执行上下文、解析脚本和调用函数。由于此 crate 将 nu 作为依赖项,因此调用 nu 不需要调用外部应用程序的开销。

示例用法

use embed_nu::{rusty_value::*, CommandGroupConfig, Context, NewEmpty, PipelineData};

fn main() {
  let mut ctx = Context::builder()
    .with_command_groups(CommandGroupConfig::default().all_groups(true))
    .unwrap()
    .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();
}

将数据转换为 nu 值

此 crate 使用 rusty-value 将任何 Rust 数据类型转换为 nu 值。

use embed_nu::{rusty_value::*, 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 implicitly when passing the value to the nu context
  // as function arguments or variables
  let value = instance.into_value();
  dbg!(value);
}

依赖项

~43–75MB
~1.5M SLoC