Загрузка файла из Wasm? - PullRequest
0 голосов
/ 14 ноября 2018

Я использую ржавчину и веб-сборку. Я получаю это сообщение об ошибке operation not supported on wasm yet. Так что происходит одно из двух, и мне было любопытно, если бы кто-нибудь знал ответ. Поэтому либо мой путь к файлу неверен, и это наименее полезное сообщение об ошибке, либо wasm не поддерживает загрузку файлов.

#[wasm_bindgen]
#[macro_use]
pub fn file() -> () {
    let mut data: Vec<u8> = Vec::new();
    ///I would load the png with the same path in my javascript.
    let opened = File::open("./png/A_SingleCell.png");
    let unwraped = match opened {
        Ok(a) => log(&format!("opened {}", "worked")),
        Err(e) => log(&format!("{}", e)),
    };
    // .read_to_end(&mut data)
    // .unwrap();
    return ();
}

#[wasm_bindgen]
extern "C" {
    #[wasm_bindgen(js_namespace = console)]
    fn log(msg: &str);
}

и вызов javascript просто file().

Есть ли другой путь к каталогу, который мне нужно использовать для получения png, или вы действительно не можете загрузить файл?

Редактировать Добавление моего index.js, чтобы показать, что веб-пакет уже загрузил png.

import { memory } from "break-game/break_game_bg";
import A from './png/A_SingleCell.png';
import { alloc, fill, decode, file } from "break-game";


file();

1 Ответ

0 голосов
/ 14 ноября 2018

Загрузка файла из файловой системы не работает со стандартной библиотекой Rust и целью wasm32-unknown-unknown. Следовательно, эта ошибка является ожидаемой ошибкой времени выполнения для использования File::open.

Стандартная библиотека Rust в настоящее время предоставляет единую площадь поверхности API для всех целей, независимо от того, поддерживает ли цель функциональность или нет. Оказывается, что почти все платформы реализуют в основном всю стабильную площадь поверхности стандартной библиотеки, но цель wasm32-unknown-unknown в определенном смысле немного странная. В этой цели wasm стандартная библиотека не имеет возможности реализовывать функции в таких модулях, как std::net или std::fs, поэтому функции безоговорочно возвращают ошибку. Здесь вы видите, что File::open безусловно возвращает ошибку на цели wasm32-unknown-unknown.

Говоря конкретно о цели wasm32-unknown-unknown, эта цель используется для представления "базового уровня совместимости для Rust and wasm". Для этой цели стандартная библиотека может принимать только набор инструкций WebAssembly, ничего больше. Поскольку WebAssembly не предоставляет никаких средств для ввода-вывода или загрузки файлов, это означает, что эти заглушки оставлены для возврата ошибок в стандартной библиотеке.

Обратите внимание, что альтернативный способ предоставления стандартной библиотеки для цели wasm32-unknown-unknown состоит в том, чтобы просто вообще не предоставлять эти функции, что приводит к ошибке времени компиляции при попытке их использования. Мы решили не идти по этому пути, что бы там ни было, чтобы оставаться последовательными в отношении целей в Rust. Есть надежда, что что-то вроде предложенного ворса переносимости может изменить исчисление этой истории, но Rust еще не совсем там!


В то же время, вы, вероятно, все еще хотите сделать это! В проекте wasm-bindgen есть несколько руководств по цели wasm32-unknown-unknown, которые могут помочь вам в этом:

Примечательно, что веб-платформа в настоящее время не обеспечивает возможность загрузки файлов из файловой системы, поэтому нет прекрасного способа реализовать File::open в качестве API в Rust для цели wasm32-unknown-unknown, даже если используется JS. Однако, если вы используете Node.js, я рекомендую прочитать о JS interop , а также проверить wasm-bindgen guide для импорта функций Node.js для реализации этого. ,

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...