use postcard_schema::schema::NamedType;
pub struct Service {
pub name: &'static str,
pub methods: &'static [&'static [Method]],
}
pub struct Method {
pub name: &'static str,
pub args: &'static [Arg],
pub ret: Return,
}
pub struct Arg {
pub name: &'static str,
pub desc: &'static Desc,
}
pub enum Desc {
Js {
name: &'static str,
transfer: bool,
},
Postcard(&'static NamedType),
Inline(&'static NamedType),
Option(&'static Desc),
Result(&'static Desc, &'static Desc),
}
pub enum Return {
Notify,
Value(&'static Desc),
Stream(&'static Desc),
}
pub trait JsName {
const NAME: &'static str;
}
macro_rules! impl_js_name {
($($ty:ty => $name:literal),* $(,)?) => {
$(impl JsName for $ty {
const NAME: &'static str = $name;
})*
};
}
impl_js_name! {
wasm_bindgen::JsValue => "unknown",
js_sys::Object => "object",
js_sys::Array => "unknown[]",
js_sys::Function => "Function",
js_sys::Promise => "Promise<unknown>",
js_sys::JsString => "string",
js_sys::Error => "Error",
js_sys::Date => "Date",
js_sys::RegExp => "RegExp",
js_sys::Map => "Map<unknown, unknown>",
js_sys::Set => "Set<unknown>",
js_sys::ArrayBuffer => "ArrayBuffer",
js_sys::SharedArrayBuffer => "SharedArrayBuffer",
js_sys::DataView => "DataView",
js_sys::Int8Array => "Int8Array",
js_sys::Uint8Array => "Uint8Array",
js_sys::Uint8ClampedArray => "Uint8ClampedArray",
js_sys::Int16Array => "Int16Array",
js_sys::Uint16Array => "Uint16Array",
js_sys::Int32Array => "Int32Array",
js_sys::Uint32Array => "Uint32Array",
js_sys::Float32Array => "Float32Array",
js_sys::Float64Array => "Float64Array",
js_sys::BigInt64Array => "BigInt64Array",
js_sys::BigUint64Array => "BigUint64Array",
web_sys::MessagePort => "MessagePort",
web_sys::OffscreenCanvas => "OffscreenCanvas",
web_sys::ImageBitmap => "ImageBitmap",
web_sys::ReadableStream => "ReadableStream",
web_sys::WritableStream => "WritableStream",
web_sys::TransformStream => "TransformStream",
}