#serialization #proc-macro #function #data #faas #json-format

rline_macro

一个用于生成具有自定义序列化格式的 WebAssembly stubs 的 Rust 程序化宏。

1 个稳定版本

1.0.0 2023 年 12 月 12 日

#792 in WebAssembly

Apache-2.0

14KB
169

rline_macro

一个用于生成具有自定义序列化格式的 WebAssembly stubs 的 Rust 程序化宏。

概述

rline_bindgen 是一个用于简化生成 Rust 函数 WebAssembly (Wasm) stubs 的程序化宏属性。它允许您选择输入和输出的序列化格式,支持 "bincode" 和 "json"。

安装

将以下行添加到您的 Cargo.toml 文件中

[dependencies]
rline_macro = "1.0"

数据类型

Row 定义在 rline_api 中。它是数据处理中的基本项。

由宏封装的函数接受一个 Row 作为参数。在成功的情况下返回包含生成的 Row 的 Result<Row, String>,或者在失败的情况下返回错误信息。

示例

默认格式

use rline_api::row::Row;
use rline_api::value::Value;
use rline_macro::rline_bindgen;

/// Transform each string value to uppercase using 
/// the default serialization format.
#[rline_bindgen]
pub fn uppercase(row: Row) -> Result<Row, String> {
    let mut result = Row::with_capacity(row.len());
    for (column_name, value) in row {
        match value {
            Value::String(s) => result.insert(
                column_name, 
                Value::from(s.to_uppercase())
            ),
            _ => result.insert(column_name, value),
        };
    }
    Ok(result)
}

显式指定 json 格式

use rline_api::row::Row;
use rline_api::value::Value;
use rline_macro::rline_bindgen;

/// Repeat one time each string value using 
/// the json serialization format.
#[rline_bindgen(json)]
pub fn repeat_json(row: Row) -> Result<Row, String> {
    // You are able to write to stderr.
    eprintln!("Printing to stderr from the Wasm");
    // However, writing to stdout will be ignored.
    println!("Printing to stdout will be ignored");
    let mut result = Row::with_capacity(row.len());
    for (column_name, value) in row {
        match value {
            Value::String(s) => result.insert(
                column_name,
                Value::from(s.repeat(2))
            ),
            _ => result.insert(column_name, value),
        };
    }
    Ok(result)
}

显式指定 bincode 格式

use rline_api::row::Row;
use rline_api::value::Value;
use rline_macro::rline_bindgen;

/// Transform each string value to to_lowercase using 
/// the bincode serialization format.
#[rline_bindgen(bincode)]
pub fn lowercase_bincode(row: Row) -> Result<Row, String> {
    let mut result = Row::with_capacity(row.len());
    for (column_name, value) in row {
        match value {
            Value::String(s) => result.insert(
                column_name,
                Value::from(s.to_lowercase())
            ),
            _ => result.insert(column_name, value),
        };
    }
    Ok(result)
}

致谢

此 crate 受 wasmedge-bindgen 启发,https://github.com/second-state/wasmedge-bindgen,在 MIT/Apache v2 许可下。

依赖项

~270–720KB
~17K SLoC