wasm_wave/
lib.rs

1//! Web Assembly Value Encoding
2//!
3//! WAVE is a human-oriented text encoding of WebAssembly Component Model values.
4//!
5//! For more information, see the [README](https://github.com/bytecodealliance/wasm-tools/tree/main/crates/wasm-wave#readme).
6#![deny(missing_docs)]
7#![no_std]
8
9extern crate alloc;
10#[cfg(feature = "std")]
11extern crate std;
12
13pub mod ast;
14pub mod lex;
15pub mod parser;
16mod strings;
17pub mod untyped;
18pub mod value;
19pub mod wasm;
20pub mod writer;
21
22use alloc::string::String;
23use parser::Parser;
24use wasm::WasmValue;
25use writer::Writer;
26
27/// Parses a [`WasmValue`] from the given WAVE-encoded string.
28/// ```
29/// # fn main() -> Result<(), wasm_wave::parser::ParserError> {
30/// use wasm_wave::{wasm::WasmValue, value::{Type, Value}};
31/// let val: Value = wasm_wave::from_str(&Type::CHAR, r"'\u{1F44B}'")?;
32/// assert_eq!(val, Value::make_char('👋'));
33/// # Ok(())
34/// # }
35/// ```
36pub fn from_str<V: WasmValue>(ty: &V::Type, s: &str) -> Result<V, parser::ParserError> {
37    let mut parser = Parser::new(s);
38
39    let value = parser.parse_value(ty)?;
40
41    // Ensure that we've parsed the entire string.
42    parser.finish()?;
43
44    Ok(value)
45}
46
47/// Returns the given [`WasmValue`] as a WAVE-encoded string.
48/// ```
49/// # fn main() -> Result<(), wasm_wave::writer::WriterError> {
50/// use wasm_wave::{wasm::WasmValue, value::Value};
51/// let wave_str = wasm_wave::to_string(&Value::make_char('\u{1F44B}'))?;
52/// assert_eq!(wave_str, "'👋'");
53/// # Ok(())
54/// # }
55pub fn to_string(val: &impl WasmValue) -> Result<String, writer::WriterError> {
56    let mut buf = String::new();
57    Writer::new(&mut buf).write_value(val)?;
58    Ok(buf)
59}
60
61fn canonicalize_nan32(val: f32) -> f32 {
62    if val.is_nan() {
63        f32::from_bits(0x7fc00000)
64    } else {
65        val
66    }
67}
68
69fn canonicalize_nan64(val: f64) -> f64 {
70    if val.is_nan() {
71        f64::from_bits(0x7ff8000000000000)
72    } else {
73        val
74    }
75}