From 3ad1cc215e0788121a36116bb5f2d38cc3d8a4cb Mon Sep 17 00:00:00 2001 From: Niklas Adolfsson Date: Wed, 1 Sep 2021 19:16:17 +0200 Subject: [PATCH] feat: alias attribute for proc macros (#442) * feat: alias attribute for proc macros * implement David's suggested no more unsub field * keep aliases outside namespace * revert example * fix build * Update proc-macros/src/attributes.rs Co-authored-by: David * grumbles: alias -> aliases * grumbles v2: alias -> aliases Co-authored-by: David --- examples/proc_macro.rs | 2 +- proc-macros/src/attributes.rs | 8 +- proc-macros/src/helpers.rs | 2 +- proc-macros/src/lib.rs | 2 +- proc-macros/src/render_client.rs | 2 +- proc-macros/src/render_server.rs | 78 +++++++++++++++++-- proc-macros/src/rpc_macro.rs | 41 +++++++--- .../ui/correct/alias_doesnt_use_namespace.rs | 13 ++++ proc-macros/tests/ui/correct/basic.rs | 6 +- proc-macros/tests/ui/correct/only_client.rs | 2 +- proc-macros/tests/ui/correct/only_server.rs | 2 +- .../method/method_unexpected_field.stderr | 2 +- .../ui/incorrect/rpc/rpc_conflicting_alias.rs | 9 +++ .../rpc/rpc_conflicting_alias.stderr | 5 ++ .../tests/ui/incorrect/sub/sub_async.rs | 2 +- .../tests/ui/incorrect/sub/sub_async.stderr | 2 +- .../ui/incorrect/sub/sub_conflicting_alias.rs | 9 +++ .../sub/sub_conflicting_alias.stderr | 5 ++ .../tests/ui/incorrect/sub/sub_no_item.rs | 2 +- .../tests/ui/incorrect/sub/sub_no_item.stderr | 4 +- .../tests/ui/incorrect/sub/sub_no_name.rs | 4 +- .../tests/ui/incorrect/sub/sub_no_name.stderr | 7 +- .../tests/ui/incorrect/sub/sub_no_unsub.rs | 10 --- .../ui/incorrect/sub/sub_no_unsub.stderr | 5 -- .../tests/ui/incorrect/sub/sub_return_type.rs | 2 +- .../ui/incorrect/sub/sub_return_type.stderr | 2 +- .../ui/incorrect/sub/sub_unsupported_field.rs | 2 +- .../sub/sub_unsupported_field.stderr | 6 +- tests/tests/proc_macros.rs | 8 +- 29 files changed, 177 insertions(+), 67 deletions(-) create mode 100644 proc-macros/tests/ui/correct/alias_doesnt_use_namespace.rs create mode 100644 proc-macros/tests/ui/incorrect/rpc/rpc_conflicting_alias.rs create mode 100644 proc-macros/tests/ui/incorrect/rpc/rpc_conflicting_alias.stderr create mode 100644 proc-macros/tests/ui/incorrect/sub/sub_conflicting_alias.rs create mode 100644 proc-macros/tests/ui/incorrect/sub/sub_conflicting_alias.stderr delete mode 100644 proc-macros/tests/ui/incorrect/sub/sub_no_unsub.rs delete mode 100644 proc-macros/tests/ui/incorrect/sub/sub_no_unsub.stderr diff --git a/examples/proc_macro.rs b/examples/proc_macro.rs index cae238060f..fcfadf13dd 100644 --- a/examples/proc_macro.rs +++ b/examples/proc_macro.rs @@ -45,7 +45,7 @@ where async fn storage_keys(&self, storage_key: StorageKey, hash: Option) -> Result, Error>; /// Subscription that takes a `StorageKey` as input and produces a `Vec`. - #[subscription(name = "subscribeStorage", unsub = "unsubscribeStorage", item = Vec)] + #[subscription(name = "subscribeStorage", item = Vec)] fn subscribe_storage(&self, keys: Option>); } diff --git a/proc-macros/src/attributes.rs b/proc-macros/src/attributes.rs index 2b2ce66094..ad7f5bb740 100644 --- a/proc-macros/src/attributes.rs +++ b/proc-macros/src/attributes.rs @@ -63,6 +63,8 @@ impl Rpc { pub(crate) struct Method { /// Method name pub name: syn::LitStr, + /// Aliases for the method. + pub aliases: Option, } /// Input for the `#[subscription(...)]` attribute. @@ -70,8 +72,10 @@ pub(crate) struct Method { pub(crate) struct Subscription { /// Subscription name pub name: syn::LitStr, - /// Name of the method to unsubscribe. - pub unsub: syn::LitStr, /// Type yielded by the subscription. pub item: syn::Type, + /// Aliases for the subscribe method. + pub aliases: Option, + /// Aliases for the unsubscribe method. + pub unsubscribe_aliases: Option, } diff --git a/proc-macros/src/helpers.rs b/proc-macros/src/helpers.rs index dca992ea5b..93b35cfd38 100644 --- a/proc-macros/src/helpers.rs +++ b/proc-macros/src/helpers.rs @@ -77,7 +77,7 @@ fn find_jsonrpsee_crate(http_name: &str, ws_name: &str) -> Result JsonRpcResult; /// -/// #[subscription(name = "sub", unsub = "unsub", item = Vec)] +/// #[subscription(name = "sub", item = Vec)] /// fn sub(&self); /// } /// ``` diff --git a/proc-macros/src/lib.rs b/proc-macros/src/lib.rs index 3b2e4c7869..df3dfbaa62 100644 --- a/proc-macros/src/lib.rs +++ b/proc-macros/src/lib.rs @@ -214,7 +214,7 @@ pub(crate) mod visitor; /// #[method(name = "bar")] /// fn sync_method(&self) -> JsonRpcResult; /// -/// #[subscription(name = "sub", unsub = "unsub", item = String)] +/// #[subscription(name = "sub", item = String)] /// fn sub(&self); /// } /// diff --git a/proc-macros/src/render_client.rs b/proc-macros/src/render_client.rs index 1ec17642b9..8e1221dc39 100644 --- a/proc-macros/src/render_client.rs +++ b/proc-macros/src/render_client.rs @@ -129,7 +129,7 @@ impl RpcDescription { // Name of the RPC subscription (e.g. `foo_sub`). let rpc_sub_name = self.rpc_identifier(&sub.name); // Name of the RPC method to unsubscribe (e.g. `foo_unsub`). - let rpc_unsub_name = self.rpc_identifier(&sub.unsub_method); + let rpc_unsub_name = self.rpc_identifier(&sub.unsubscribe); // `returns` represent the return type of the *rust method*, which is wrapped // into the `Subscription` object. diff --git a/proc-macros/src/render_server.rs b/proc-macros/src/render_server.rs index 342363f32d..8fe26f0d2d 100644 --- a/proc-macros/src/render_server.rs +++ b/proc-macros/src/render_server.rs @@ -79,12 +79,12 @@ impl RpcDescription { let mut registered = HashSet::new(); let mut errors = Vec::new(); - let mut check_name = |name: String, span: Span| { - if registered.contains(&name) { + let mut check_name = |name: &str, span: Span| { + if registered.contains(name) { let message = format!("{:?} is already defined", name); errors.push(quote_spanned!(span => compile_error!(#message);)); } else { - registered.insert(name); + registered.insert(name.to_string()); } }; @@ -113,7 +113,7 @@ impl RpcDescription { // `params_seq` is the comma-delimited sequence of parameters. let (parsing, params_seq) = self.render_params_decoding(&method.params); - check_name(rpc_method_name.clone(), rust_method_name.span()); + check_name(&rpc_method_name, rust_method_name.span()); if method.signature.sig.asyncness.is_some() { handle_register_result(quote! { @@ -145,14 +145,14 @@ impl RpcDescription { // Name of the RPC method to subscribe to (e.g. `foo_sub`). let rpc_sub_name = self.rpc_identifier(&sub.name); // Name of the RPC method to unsubscribe (e.g. `foo_sub`). - let rpc_unsub_name = self.rpc_identifier(&sub.unsub_method); + let rpc_unsub_name = self.rpc_identifier(&sub.unsubscribe); // `parsing` is the code associated with parsing structure from the // provided `RpcParams` object. // `params_seq` is the comma-delimited sequence of parameters. let (parsing, params_seq) = self.render_params_decoding(&sub.params); - check_name(rpc_sub_name.clone(), rust_method_name.span()); - check_name(rpc_unsub_name.clone(), rust_method_name.span()); + check_name(&rpc_sub_name, rust_method_name.span()); + check_name(&rpc_unsub_name, rust_method_name.span()); handle_register_result(quote! { rpc.register_subscription(#rpc_sub_name, #rpc_unsub_name, |params, sink, context| { @@ -163,6 +163,68 @@ impl RpcDescription { }) .collect::>(); + let method_aliases = self + .methods + .iter() + .map(|method| { + let rpc_name = self.rpc_identifier(&method.name); + let rust_method_name = &method.signature.sig.ident; + + // Rust method to invoke (e.g. `self.(...)`). + let aliases: Vec = method + .aliases + .iter() + .map(|alias| { + let alias = alias.trim().to_string(); + check_name(&alias, rust_method_name.span()); + handle_register_result(quote! { + rpc.register_alias(#alias, #rpc_name) + }) + }) + .collect(); + + quote!( #(#aliases)* ) + }) + .collect::>(); + + let subscription_aliases = self + .subscriptions + .iter() + .map(|method| { + let sub_name = self.rpc_identifier(&method.name); + let unsub_name = self.rpc_identifier(&method.unsubscribe); + let rust_method_name = &method.signature.sig.ident; + + let sub: Vec = method + .aliases + .iter() + .map(|alias| { + let alias = alias.trim().to_string(); + check_name(&alias, rust_method_name.span()); + handle_register_result(quote! { + rpc.register_alias(#alias, #sub_name) + }) + }) + .collect(); + let unsub: Vec = method + .unsubscribe_aliases + .iter() + .map(|alias| { + let alias = alias.trim().to_string(); + check_name(&alias, rust_method_name.span()); + handle_register_result(quote! { + rpc.register_alias(#alias, #unsub_name) + }) + }) + .collect(); + + quote! ( + #(#sub)* + #(#unsub)* + ) + }) + .collect::>(); + let doc_comment = "Collects all the methods and subscriptions defined in the trait \ and adds them into a single `RpcModule`."; @@ -178,6 +240,8 @@ impl RpcDescription { #(#errors)* #(#methods)* #(#subscriptions)* + #(#method_aliases)* + #(#subscription_aliases)* rpc } diff --git a/proc-macros/src/rpc_macro.rs b/proc-macros/src/rpc_macro.rs index 6c2ad6ab38..4e679915a0 100644 --- a/proc-macros/src/rpc_macro.rs +++ b/proc-macros/src/rpc_macro.rs @@ -34,17 +34,19 @@ use syn::Attribute; #[derive(Debug, Clone)] pub struct RpcMethod { - pub name: syn::LitStr, + pub name: String, pub params: Vec<(syn::PatIdent, syn::Type)>, pub returns: Option, pub signature: syn::TraitItemMethod, + pub aliases: Vec, } impl RpcMethod { pub fn from_item(mut method: syn::TraitItemMethod) -> Result { let attributes = attributes::Method::from_attributes(&method.attrs).respan(&method.attrs.first())?; let sig = method.sig.clone(); - let name = attributes.name; + let name = attributes.name.value(); + let aliases = attributes.aliases.map(|a| a.value().split(',').map(Into::into).collect()).unwrap_or_default(); let params: Vec<_> = sig .inputs .into_iter() @@ -65,27 +67,31 @@ impl RpcMethod { // We've analyzed attributes and don't need them anymore. method.attrs.clear(); - Ok(Self { name, params, returns, signature: method }) + Ok(Self { aliases, name, params, returns, signature: method }) } } #[derive(Debug, Clone)] pub struct RpcSubscription { - pub name: syn::LitStr, - pub unsub_method: syn::LitStr, + pub name: String, + pub unsubscribe: String, pub params: Vec<(syn::PatIdent, syn::Type)>, pub item: syn::Type, pub signature: syn::TraitItemMethod, + pub aliases: Vec, + pub unsubscribe_aliases: Vec, } impl RpcSubscription { pub fn from_item(mut sub: syn::TraitItemMethod) -> Result { let attributes = attributes::Subscription::from_attributes(&sub.attrs).respan(&sub.attrs.first())?; let sig = sub.sig.clone(); - let name = attributes.name; - let unsub_method = attributes.unsub; + let name = attributes.name.value(); + let unsubscribe = build_unsubscribe_method(&name); let item = attributes.item; - + let aliases = attributes.aliases.map(|a| a.value().split(',').map(Into::into).collect()).unwrap_or_default(); + let unsubscribe_aliases = + attributes.unsubscribe_aliases.map(|a| a.value().split(',').map(Into::into).collect()).unwrap_or_default(); let params: Vec<_> = sig .inputs .into_iter() @@ -101,7 +107,7 @@ impl RpcSubscription { // We've analyzed attributes and don't need them anymore. sub.attrs.clear(); - Ok(Self { name, unsub_method, params, item, signature: sub }) + Ok(Self { name, unsubscribe, unsubscribe_aliases, params, item, signature: sub, aliases }) } } @@ -224,11 +230,11 @@ impl RpcDescription { /// Examples: /// For namespace `foo` and method `makeSpam`, result will be `foo_makeSpam`. /// For no namespace and method `makeSpam` it will be just `makeSpam. - pub(crate) fn rpc_identifier(&self, method: &syn::LitStr) -> String { + pub(crate) fn rpc_identifier(&self, method: &str) -> String { if let Some(ns) = &self.attrs.namespace { - format!("{}_{}", ns.value(), method.value()) + format!("{}_{}", ns.value(), method.trim()) } else { - method.value() + method.to_string() } } } @@ -241,3 +247,14 @@ fn has_attr(attrs: &[Attribute], ident: &str) -> bool { } false } + +fn build_unsubscribe_method(existing_method: &str) -> String { + let method = existing_method.trim(); + let mut new_method = String::from("unsubscribe"); + if method.starts_with("subscribe") { + new_method.extend(method.chars().skip(9)); + } else { + new_method.push_str(method); + } + new_method +} diff --git a/proc-macros/tests/ui/correct/alias_doesnt_use_namespace.rs b/proc-macros/tests/ui/correct/alias_doesnt_use_namespace.rs new file mode 100644 index 0000000000..83c10b641c --- /dev/null +++ b/proc-macros/tests/ui/correct/alias_doesnt_use_namespace.rs @@ -0,0 +1,13 @@ +use jsonrpsee::{proc_macros::rpc, types::JsonRpcResult}; + +#[rpc(client, server, namespace = "myapi")] +pub trait Rpc { + /// Alias doesn't use the namespace so not duplicated. + #[method(name = "getTemp", aliases = "getTemp")] + async fn async_method(&self, param_a: u8, param_b: String) -> JsonRpcResult; + + #[subscription(name = "getFood", item = String, aliases = "getFood", unsubscribe_aliases = "unsubscribegetFood")] + fn sub(&self); +} + +fn main() {} diff --git a/proc-macros/tests/ui/correct/basic.rs b/proc-macros/tests/ui/correct/basic.rs index bdc2cead7a..51bd1bf0cf 100644 --- a/proc-macros/tests/ui/correct/basic.rs +++ b/proc-macros/tests/ui/correct/basic.rs @@ -10,7 +10,7 @@ use std::{net::SocketAddr, sync::mpsc::channel}; #[rpc(client, server, namespace = "foo")] pub trait Rpc { - #[method(name = "foo")] + #[method(name = "foo", aliases = "fooAlias, Other")] async fn async_method(&self, param_a: u8, param_b: String) -> JsonRpcResult; #[method(name = "optional_params")] @@ -25,10 +25,10 @@ pub trait Rpc { #[method(name = "bar")] fn sync_method(&self) -> JsonRpcResult; - #[subscription(name = "sub", unsub = "unsub", item = String)] + #[subscription(name = "sub", item = String)] fn sub(&self); - #[subscription(name = "echo", unsub = "no_more_echo", item = u32)] + #[subscription(name = "echo", aliases = "ECHO", item = u32, unsubscribe_aliases = "NotInterested, listenNoMore")] fn sub_with_params(&self, val: u32); } diff --git a/proc-macros/tests/ui/correct/only_client.rs b/proc-macros/tests/ui/correct/only_client.rs index ee38367ebc..c52f27223f 100644 --- a/proc-macros/tests/ui/correct/only_client.rs +++ b/proc-macros/tests/ui/correct/only_client.rs @@ -10,7 +10,7 @@ pub trait Rpc { #[method(name = "bar")] fn sync_method(&self) -> JsonRpcResult; - #[subscription(name = "sub", unsub = "unsub", item = String)] + #[subscription(name = "sub", item = String)] fn sub(&self); } diff --git a/proc-macros/tests/ui/correct/only_server.rs b/proc-macros/tests/ui/correct/only_server.rs index db3e96afe6..429d461403 100644 --- a/proc-macros/tests/ui/correct/only_server.rs +++ b/proc-macros/tests/ui/correct/only_server.rs @@ -13,7 +13,7 @@ pub trait Rpc { #[method(name = "bar")] fn sync_method(&self) -> JsonRpcResult; - #[subscription(name = "sub", unsub = "unsub", item = String)] + #[subscription(name = "sub", item = String)] fn sub(&self); } diff --git a/proc-macros/tests/ui/incorrect/method/method_unexpected_field.stderr b/proc-macros/tests/ui/incorrect/method/method_unexpected_field.stderr index ab51a49ab4..be1e832d48 100644 --- a/proc-macros/tests/ui/incorrect/method/method_unexpected_field.stderr +++ b/proc-macros/tests/ui/incorrect/method/method_unexpected_field.stderr @@ -1,4 +1,4 @@ -error: `#[method]` got unknown `magic` argument. Supported arguments are `name` +error: `#[method]` got unknown `magic` argument. Supported arguments are `aliases`, `name` --> $DIR/method_unexpected_field.rs:6:2 | 6 | #[method(name = "foo", magic = false)] diff --git a/proc-macros/tests/ui/incorrect/rpc/rpc_conflicting_alias.rs b/proc-macros/tests/ui/incorrect/rpc/rpc_conflicting_alias.rs new file mode 100644 index 0000000000..74f0eb6931 --- /dev/null +++ b/proc-macros/tests/ui/incorrect/rpc/rpc_conflicting_alias.rs @@ -0,0 +1,9 @@ +use jsonrpsee::proc_macros::rpc; + +#[rpc(client, server)] +pub trait DuplicatedAlias { + #[method(name = "foo", aliases = "foo_dup, foo_dup")] + async fn async_method(&self) -> jsonrpsee::types::JsonRpcResult; +} + +fn main() {} diff --git a/proc-macros/tests/ui/incorrect/rpc/rpc_conflicting_alias.stderr b/proc-macros/tests/ui/incorrect/rpc/rpc_conflicting_alias.stderr new file mode 100644 index 0000000000..34a95cc4e0 --- /dev/null +++ b/proc-macros/tests/ui/incorrect/rpc/rpc_conflicting_alias.stderr @@ -0,0 +1,5 @@ +error: "foo_dup" is already defined + --> $DIR/rpc_conflicting_alias.rs:6:11 + | +6 | async fn async_method(&self) -> jsonrpsee::types::JsonRpcResult; + | ^^^^^^^^^^^^ diff --git a/proc-macros/tests/ui/incorrect/sub/sub_async.rs b/proc-macros/tests/ui/incorrect/sub/sub_async.rs index ec1ff98e45..b77d9ed945 100644 --- a/proc-macros/tests/ui/incorrect/sub/sub_async.rs +++ b/proc-macros/tests/ui/incorrect/sub/sub_async.rs @@ -3,7 +3,7 @@ use jsonrpsee::proc_macros::rpc; // Subscription method must not be async. #[rpc(client, server)] pub trait AsyncSub { - #[subscription(name = "sub", unsub = "unsub", item = u8)] + #[subscription(name = "sub", item = u8)] async fn sub(&self); } diff --git a/proc-macros/tests/ui/incorrect/sub/sub_async.stderr b/proc-macros/tests/ui/incorrect/sub/sub_async.stderr index c524c677ef..352c2410dd 100644 --- a/proc-macros/tests/ui/incorrect/sub/sub_async.stderr +++ b/proc-macros/tests/ui/incorrect/sub/sub_async.stderr @@ -1,6 +1,6 @@ error: Subscription methods must not be `async` --> $DIR/sub_async.rs:6:2 | -6 | / #[subscription(name = "sub", unsub = "unsub", item = u8)] +6 | / #[subscription(name = "sub", item = u8)] 7 | | async fn sub(&self); | |________________________^ diff --git a/proc-macros/tests/ui/incorrect/sub/sub_conflicting_alias.rs b/proc-macros/tests/ui/incorrect/sub/sub_conflicting_alias.rs new file mode 100644 index 0000000000..dd05c6b1df --- /dev/null +++ b/proc-macros/tests/ui/incorrect/sub/sub_conflicting_alias.rs @@ -0,0 +1,9 @@ +use jsonrpsee::proc_macros::rpc; + +#[rpc(client, server)] +pub trait DuplicatedSubAlias { + #[subscription(name = "alias", item = String, aliases = "hello_is_goodbye", unsubscribe_aliases = "hello_is_goodbye")] + fn async_method(&self); +} + +fn main() {} diff --git a/proc-macros/tests/ui/incorrect/sub/sub_conflicting_alias.stderr b/proc-macros/tests/ui/incorrect/sub/sub_conflicting_alias.stderr new file mode 100644 index 0000000000..7c08822b38 --- /dev/null +++ b/proc-macros/tests/ui/incorrect/sub/sub_conflicting_alias.stderr @@ -0,0 +1,5 @@ +error: "hello_is_goodbye" is already defined + --> $DIR/sub_conflicting_alias.rs:6:5 + | +6 | fn async_method(&self); + | ^^^^^^^^^^^^ diff --git a/proc-macros/tests/ui/incorrect/sub/sub_no_item.rs b/proc-macros/tests/ui/incorrect/sub/sub_no_item.rs index 27c5573240..fbb65eff3f 100644 --- a/proc-macros/tests/ui/incorrect/sub/sub_no_item.rs +++ b/proc-macros/tests/ui/incorrect/sub/sub_no_item.rs @@ -3,7 +3,7 @@ use jsonrpsee::proc_macros::rpc; // Missing mandatory `item` field. #[rpc(client, server)] pub trait NoSubItem { - #[subscription(name = "sub", unsub = "unsub")] + #[subscription(name = "sub")] fn sub(&self); } diff --git a/proc-macros/tests/ui/incorrect/sub/sub_no_item.stderr b/proc-macros/tests/ui/incorrect/sub/sub_no_item.stderr index 93317246dd..13e5187ec5 100644 --- a/proc-macros/tests/ui/incorrect/sub/sub_no_item.stderr +++ b/proc-macros/tests/ui/incorrect/sub/sub_no_item.stderr @@ -1,5 +1,5 @@ error: unexpected end of input, `#[subscription]` is missing `item` argument --> $DIR/sub_no_item.rs:6:2 | -6 | #[subscription(name = "sub", unsub = "unsub")] - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +6 | #[subscription(name = "sub")] + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ diff --git a/proc-macros/tests/ui/incorrect/sub/sub_no_name.rs b/proc-macros/tests/ui/incorrect/sub/sub_no_name.rs index 4f2786b148..3bab992b0b 100644 --- a/proc-macros/tests/ui/incorrect/sub/sub_no_name.rs +++ b/proc-macros/tests/ui/incorrect/sub/sub_no_name.rs @@ -3,8 +3,8 @@ use jsonrpsee::proc_macros::rpc; // Missing mandatory `name` field. #[rpc(client, server)] pub trait NoSubName { - #[subscription(unsub = "unsub", item = String)] - async fn async_method(&self) -> u8; + #[subscription(item = String)] + fn async_method(&self); } fn main() {} diff --git a/proc-macros/tests/ui/incorrect/sub/sub_no_name.stderr b/proc-macros/tests/ui/incorrect/sub/sub_no_name.stderr index d4f7828790..096f8f37cc 100644 --- a/proc-macros/tests/ui/incorrect/sub/sub_no_name.stderr +++ b/proc-macros/tests/ui/incorrect/sub/sub_no_name.stderr @@ -1,6 +1,5 @@ -error: Subscription methods must not be `async` +error: unexpected end of input, `#[subscription]` is missing `name` argument --> $DIR/sub_no_name.rs:6:2 | -6 | / #[subscription(unsub = "unsub", item = String)] -7 | | async fn async_method(&self) -> u8; - | |_______________________________________^ +6 | #[subscription(item = String)] + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ diff --git a/proc-macros/tests/ui/incorrect/sub/sub_no_unsub.rs b/proc-macros/tests/ui/incorrect/sub/sub_no_unsub.rs deleted file mode 100644 index a8e13ac144..0000000000 --- a/proc-macros/tests/ui/incorrect/sub/sub_no_unsub.rs +++ /dev/null @@ -1,10 +0,0 @@ -use jsonrpsee::proc_macros::rpc; - -// Missing mandatory `unsub` field. -#[rpc(client, server)] -pub trait NoSubUnsub { - #[subscription(name = "sub", item = String)] - fn sub(&self); -} - -fn main() {} diff --git a/proc-macros/tests/ui/incorrect/sub/sub_no_unsub.stderr b/proc-macros/tests/ui/incorrect/sub/sub_no_unsub.stderr deleted file mode 100644 index 59b99c643d..0000000000 --- a/proc-macros/tests/ui/incorrect/sub/sub_no_unsub.stderr +++ /dev/null @@ -1,5 +0,0 @@ -error: unexpected end of input, `#[subscription]` is missing `unsub` argument - --> $DIR/sub_no_unsub.rs:6:2 - | -6 | #[subscription(name = "sub", item = String)] - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ diff --git a/proc-macros/tests/ui/incorrect/sub/sub_return_type.rs b/proc-macros/tests/ui/incorrect/sub/sub_return_type.rs index b208deaaeb..14d77b422e 100644 --- a/proc-macros/tests/ui/incorrect/sub/sub_return_type.rs +++ b/proc-macros/tests/ui/incorrect/sub/sub_return_type.rs @@ -3,7 +3,7 @@ use jsonrpsee::proc_macros::rpc; // Subscription method must not have return type. #[rpc(client, server)] pub trait SubWithReturnType { - #[subscription(name = "sub", unsub = "unsub", item = u8)] + #[subscription(name = "sub", item = u8)] fn sub(&self) -> u8; } diff --git a/proc-macros/tests/ui/incorrect/sub/sub_return_type.stderr b/proc-macros/tests/ui/incorrect/sub/sub_return_type.stderr index aceb16d2fc..1e690ebb54 100644 --- a/proc-macros/tests/ui/incorrect/sub/sub_return_type.stderr +++ b/proc-macros/tests/ui/incorrect/sub/sub_return_type.stderr @@ -1,6 +1,6 @@ error: Subscription methods must not return anything --> $DIR/sub_return_type.rs:6:2 | -6 | / #[subscription(name = "sub", unsub = "unsub", item = u8)] +6 | / #[subscription(name = "sub", item = u8)] 7 | | fn sub(&self) -> u8; | |________________________^ diff --git a/proc-macros/tests/ui/incorrect/sub/sub_unsupported_field.rs b/proc-macros/tests/ui/incorrect/sub/sub_unsupported_field.rs index a12f1da41f..4272dcb7c3 100644 --- a/proc-macros/tests/ui/incorrect/sub/sub_unsupported_field.rs +++ b/proc-macros/tests/ui/incorrect/sub/sub_unsupported_field.rs @@ -3,7 +3,7 @@ use jsonrpsee::proc_macros::rpc; // Unsupported attribute field. #[rpc(client, server)] pub trait UnsupportedField { - #[subscription(name = "sub", unsub = "unsub", item = u8, magic = true)] + #[subscription(name = "sub", item = u8, magic = true)] fn sub(&self); } diff --git a/proc-macros/tests/ui/incorrect/sub/sub_unsupported_field.stderr b/proc-macros/tests/ui/incorrect/sub/sub_unsupported_field.stderr index fed19dfca9..1812492d21 100644 --- a/proc-macros/tests/ui/incorrect/sub/sub_unsupported_field.stderr +++ b/proc-macros/tests/ui/incorrect/sub/sub_unsupported_field.stderr @@ -1,5 +1,5 @@ -error: `#[subscription]` got unknown `magic` argument. Supported arguments are `item`, `name`, `unsub` +error: `#[subscription]` got unknown `magic` argument. Supported arguments are `aliases`, `item`, `name`, `unsubscribe_aliases` --> $DIR/sub_unsupported_field.rs:6:2 | -6 | #[subscription(name = "sub", unsub = "unsub", item = u8, magic = true)] - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +6 | #[subscription(name = "sub", item = u8, magic = true)] + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ diff --git a/tests/tests/proc_macros.rs b/tests/tests/proc_macros.rs index 84bcb3e9dd..97a81ec442 100644 --- a/tests/tests/proc_macros.rs +++ b/tests/tests/proc_macros.rs @@ -47,10 +47,10 @@ mod rpc_impl { #[method(name = "bar")] fn sync_method(&self) -> JsonRpcResult; - #[subscription(name = "sub", unsub = "unsub", item = String)] + #[subscription(name = "sub", item = String)] fn sub(&self); - #[subscription(name = "echo", unsub = "no_more_echo", item = u32)] + #[subscription(name = "echo", aliases = "alias_echo", item = u32)] fn sub_with_params(&self, val: u32); #[method(name = "params")] @@ -101,7 +101,7 @@ mod rpc_impl { fn finalized_head(&self) -> JsonRpcResult; /// All head subscription - #[subscription(name = "subscribeAllHeads", unsub = "unsubscribeAllHeads", item = Header)] + #[subscription(name = "subscribeAllHeads", item = Header)] fn subscribe_all_heads(&self, hash: Hash); } @@ -116,7 +116,7 @@ mod rpc_impl { #[rpc(client, server, namespace = "generic_sub")] pub trait OnlyGenericSubscription { /// Get header of a relay chain block. - #[subscription(name = "sub", unsub = "unsub", item = Vec)] + #[subscription(name = "sub", item = Vec)] fn sub(&self, hash: Input); }