extern crate proc_macro;
use proc_macro::TokenStream;
use quote::quote;
use syn::*;
pub fn derive_wasm_signal_impl(input: TokenStream) -> TokenStream {
let input: DeriveInput = parse(input).unwrap();
let name = input.ident;
let wrapper_name = Ident::new(&format!("{}Signal", name), name.span());
let ts_wrapper_interface = format!(
"// Augments the {} class\ninterface {} {{\n subscribe(callback: (value: {}) => void): SubscriptionGuard;\n}}",
wrapper_name, wrapper_name, name
);
let expanded = quote! {
#[::ankurah::derive_deps::wasm_bindgen::prelude::wasm_bindgen]
pub struct #wrapper_name{
pub (crate) sig: Box<dyn ::ankurah::signals::GetAndDynSubscribe<#name>>,
pub (crate) handle: ::std::boxed::Box<dyn ::std::any::Any>
}
#[::ankurah::derive_deps::wasm_bindgen::prelude::wasm_bindgen(typescript_custom_section)]
const TS_APPEND_CONTENT: &'static str = #ts_wrapper_interface;
#[::ankurah::derive_deps::wasm_bindgen::prelude::wasm_bindgen]
impl #wrapper_name {
#[wasm_bindgen(js_name = "subscribe", skip_typescript)]
pub fn subscribe(&self, callback: ::ankurah::derive_deps::js_sys::Function) -> ::ankurah::signals::SubscriptionGuard {
use ::ankurah::signals::DynSubscribe;
let callback = ::ankurah::derive_deps::send_wrapper::SendWrapper::new(callback);
self.sig.dyn_subscribe(Box::new(move |value: #name| {
let _ = callback.call1(
&::ankurah::derive_deps::wasm_bindgen::JsValue::NULL,
&value.into()
);
}))
}
#[wasm_bindgen(getter)]
pub fn value(&self) -> #name {
use ::ankurah::signals::Get;
self.sig.get()
}
#[wasm_bindgen(getter)]
pub fn peek(&self) -> #name {
use ::ankurah::signals::Peek;
self.sig.peek()
}
}
};
TokenStream::from(expanded)
}