gpt4 book ai didi

rust - 使用 wasm-bindgen 对大型 rust 对象进行 Js 绑定(bind)

转载 作者:行者123 更新时间:2023-12-03 11:36:35 27 4
gpt4 key购买 nike

我想写一个vscode扩展来显示一个大二进制文件的内容,用bincode写:

#[macro_use]
extern crate serde_derive;

use std::collections::HashMap;
use std::fs::File;
use std::io::{BufReader, BufWriter};

#[derive(Serialize, Deserialize)]
pub struct MyValue {
pub name: String,
}

#[derive(Serialize, Deserialize)]
pub struct MyStruct {
pub data: HashMap<String, MyValue>,
}

impl MyStruct {
pub fn dump(&self, filename: &str) -> Result<(), String> {
let file = File::create(filename).map_err(|msg| msg.to_string())?;
let writer = BufWriter::new(file);
bincode::serialize_into(writer, self).map_err(|msg| msg.to_string())
}

pub fn load(filename: &str) -> Result<Self, String> {
let file = File::open(filename).map_err(|msg| msg.to_string())?;
let reader = BufReader::new(file);
bincode::deserialize_from::<BufReader<_>, Self>(reader).map_err(|msg| msg.to_string())
}
}
因此有一个 wasm 绑定(bind):

#[wasm_bindgen]
#[derive(Clone)]
pub struct PyMyStruct {
inner: Arc<MyStruct>,
}

#[wasm_bindgen]
impl PyMyStruct {
pub fn new(filename: &str) -> Self {
Self {
inner: Arc::new(MyStruct::load(filename).unwrap()),
}
}

pub fn header(self) -> Array {
let keys = Array::new();
for key in self.inner.data.keys() {
keys.push(&JsValue::from_str(key));
}
keys
}

pub fn value(&self, name: &str) -> JsValue {
if let Some(value) = self.inner.data.get(name) {
JsValue::from_serde(value).unwrap_or(JsValue::NULL)
} else {
JsValue::NULL
}
}
}
它为 JavaScript 世界提供了一个简单的接口(interface),以便访问该文件的内容。
使用 Arc为了防止在 JavaScript 端处理时昂贵的意外内存复制。
( keys 没有标记为可变,但 rust 编译器推荐这种方式可能看起来很奇怪)
运行测试代码时:
const {PyMyStruct} = require("./corejs.js");

let obj = new PyMyStruct("../../dump.spb")
console.log(obj.header())
您收到错误消息:

Error: null pointer passed to rust


有人知道如何处理这个用例吗?
谢谢!

最佳答案

这里的问题是您正在使用 new PyMyStruct()而不是 PyMyStruct.new() .在 wasm-bindgen 的 Debug模式下,您将在运行时收到关于此的错误。使用 .new()将解决您的问题:

let obj = PyMyStruct.new("../../dump.spb")
如果添加 #[wasm_bindgen(constructor)] new 的注释方法,然后 new PyMyStruct()也可以:
#[wasm_bindgen]
impl PyMyStruct {
#[wasm_bindgen(constructor)]
pub fn new(filename: &str) -> Self {
Self {
inner: 1,
}
}
}
现在这很好:
let obj = new PyMyStruct("../../dump.spb")

关于rust - 使用 wasm-bindgen 对大型 rust 对象进行 Js 绑定(bind),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65242336/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com