Skip to content

Commit 51e0127

Browse files
committed
Remove service trait from everywhere including the macro
1 parent 1aae569 commit 51e0127

File tree

11 files changed

+117
-154
lines changed

11 files changed

+117
-154
lines changed

Cargo.lock

Lines changed: 1 addition & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Cargo.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@ n0-future = { workspace = true }
4343
futures-util = { workspace = true, optional = true }
4444
# for the derive reexport/feature
4545
irpc-derive = { version = "0.4.0", path = "./irpc-derive", optional = true }
46+
hex = "0.4.3"
4647

4748
[target.'cfg(not(all(target_family = "wasm", target_os = "unknown")))'.dependencies]
4849
quinn = { workspace = true, optional = true, features = ["runtime-tokio"] }

examples/compute.rs

Lines changed: 4 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ use irpc::{
1111
rpc::{listen, Handler},
1212
rpc_requests,
1313
util::{make_client_endpoint, make_server_endpoint},
14-
Client, LocalSender, Request, Service, WithChannels,
14+
Client, LocalSender, Request, WithChannels,
1515
};
1616
use n0_future::{
1717
stream::StreamExt,
@@ -21,12 +21,6 @@ use serde::{Deserialize, Serialize};
2121
use thousands::Separable;
2222
use tracing::trace;
2323

24-
// Define the ComputeService
25-
#[derive(Debug, Clone, Copy)]
26-
struct ComputeService;
27-
28-
impl Service for ComputeService {}
29-
3024
// Define ComputeRequest sub-messages
3125
#[derive(Debug, Serialize, Deserialize)]
3226
struct Sqr {
@@ -56,7 +50,7 @@ enum ComputeRequest {
5650
}
5751

5852
// Define the protocol and message enums using the macro
59-
#[rpc_requests(ComputeService, message = ComputeMessage)]
53+
#[rpc_requests(message = ComputeMessage)]
6054
#[derive(Serialize, Deserialize)]
6155
enum ComputeProtocol {
6256
#[rpc(tx=oneshot::Sender<u128>)]
@@ -79,7 +73,7 @@ impl ComputeActor {
7973
let (tx, rx) = tokio::sync::mpsc::channel(128);
8074
let actor = Self { recv: rx };
8175
n0_future::task::spawn(actor.run());
82-
let local = LocalSender::<ComputeMessage, ComputeService>::from(tx);
76+
let local = LocalSender::<ComputeMessage>::from(tx);
8377
ComputeApi {
8478
inner: local.into(),
8579
}
@@ -157,7 +151,7 @@ impl ComputeActor {
157151
// The API for interacting with the ComputeService
158152
#[derive(Clone)]
159153
struct ComputeApi {
160-
inner: Client<ComputeMessage, ComputeProtocol, ComputeService>,
154+
inner: Client<ComputeMessage, ComputeProtocol>,
161155
}
162156

163157
impl ComputeApi {

examples/derive.rs

Lines changed: 4 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -10,19 +10,13 @@ use irpc::{
1010
rpc::Handler,
1111
rpc_requests,
1212
util::{make_client_endpoint, make_server_endpoint},
13-
Client, LocalSender, Service, WithChannels,
13+
Client, LocalSender, WithChannels,
1414
};
1515
// Import the macro
1616
use n0_future::task::{self, AbortOnDropHandle};
1717
use serde::{Deserialize, Serialize};
1818
use tracing::info;
1919

20-
/// A simple storage service, just to try it out
21-
#[derive(Debug, Clone, Copy)]
22-
struct StorageService;
23-
24-
impl Service for StorageService {}
25-
2620
#[derive(Debug, Serialize, Deserialize)]
2721
struct Get {
2822
key: String,
@@ -48,7 +42,7 @@ struct SetMany;
4842

4943
// Use the macro to generate both the StorageProtocol and StorageMessage enums
5044
// plus implement Channels for each type
51-
#[rpc_requests(StorageService, message = StorageMessage)]
45+
#[rpc_requests(message = StorageMessage)]
5246
#[derive(Serialize, Deserialize)]
5347
enum StorageProtocol {
5448
#[rpc(tx=oneshot::Sender<Option<String>>)]
@@ -74,7 +68,7 @@ impl StorageActor {
7468
state: BTreeMap::new(),
7569
};
7670
n0_future::task::spawn(actor.run());
77-
let local = LocalSender::<StorageMessage, StorageService>::from(tx);
71+
let local = LocalSender::<StorageMessage>::from(tx);
7872
StorageApi {
7973
inner: local.into(),
8074
}
@@ -123,7 +117,7 @@ impl StorageActor {
123117
}
124118

125119
struct StorageApi {
126-
inner: Client<StorageMessage, StorageProtocol, StorageService>,
120+
inner: Client<StorageMessage, StorageProtocol>,
127121
}
128122

129123
impl StorageApi {

examples/storage.rs

Lines changed: 9 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -9,32 +9,26 @@ use irpc::{
99
channel::{mpsc, none::NoReceiver, oneshot},
1010
rpc::{listen, Handler},
1111
util::{make_client_endpoint, make_server_endpoint},
12-
Channels, Client, LocalSender, Request, Service, WithChannels,
12+
Channels, Client, LocalSender, Request, WithChannels,
1313
};
1414
use n0_future::task::{self, AbortOnDropHandle};
1515
use serde::{Deserialize, Serialize};
1616
use tracing::info;
1717

18-
/// A simple storage service, just to try it out
19-
#[derive(Debug, Clone, Copy)]
20-
struct StorageService;
21-
22-
impl Service for StorageService {}
23-
2418
#[derive(Debug, Serialize, Deserialize)]
2519
struct Get {
2620
key: String,
2721
}
2822

29-
impl Channels<StorageService> for Get {
23+
impl Channels for Get {
3024
type Rx = NoReceiver;
3125
type Tx = oneshot::Sender<Option<String>>;
3226
}
3327

3428
#[derive(Debug, Serialize, Deserialize)]
3529
struct List;
3630

37-
impl Channels<StorageService> for List {
31+
impl Channels for List {
3832
type Rx = NoReceiver;
3933
type Tx = mpsc::Sender<String>;
4034
}
@@ -45,7 +39,7 @@ struct Set {
4539
value: String,
4640
}
4741

48-
impl Channels<StorageService> for Set {
42+
impl Channels for Set {
4943
type Rx = NoReceiver;
5044
type Tx = oneshot::Sender<()>;
5145
}
@@ -59,9 +53,9 @@ enum StorageProtocol {
5953

6054
#[derive(derive_more::From)]
6155
enum StorageMessage {
62-
Get(WithChannels<Get, StorageService>),
63-
Set(WithChannels<Set, StorageService>),
64-
List(WithChannels<List, StorageService>),
56+
Get(WithChannels<Get>),
57+
Set(WithChannels<Set>),
58+
List(WithChannels<List>),
6559
}
6660

6761
struct StorageActor {
@@ -77,7 +71,7 @@ impl StorageActor {
7771
state: BTreeMap::new(),
7872
};
7973
n0_future::task::spawn(actor.run());
80-
let local = LocalSender::<StorageMessage, StorageService>::from(tx);
74+
let local = LocalSender::<StorageMessage>::from(tx);
8175
StorageApi {
8276
inner: local.into(),
8377
}
@@ -115,7 +109,7 @@ impl StorageActor {
115109
}
116110
}
117111
struct StorageApi {
118-
inner: Client<StorageMessage, StorageProtocol, StorageService>,
112+
inner: Client<StorageMessage, StorageProtocol>,
119113
}
120114

121115
impl StorageApi {

irpc-derive/src/lib.rs

Lines changed: 20 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,6 @@ fn generate_parent_span_impl(enum_name: &Ident, variant_names: &[&Ident]) -> Tok
4141

4242
fn generate_channels_impl(
4343
mut args: NamedTypeArgs,
44-
service_name: &Ident,
4544
request_type: &Type,
4645
attr_span: Span,
4746
) -> syn::Result<TokenStream2> {
@@ -54,7 +53,7 @@ fn generate_channels_impl(
5453
let tx = args.get(TX_ATTR, attr_span)?;
5554

5655
let res = quote! {
57-
impl ::irpc::Channels<#service_name> for #request_type {
56+
impl ::irpc::Channels for #request_type {
5857
type Tx = #tx;
5958
type Rx = #rx;
6059
}
@@ -94,15 +93,14 @@ fn generate_case_from_impls(
9493
fn generate_message_enum_from_impls(
9594
message_enum_name: &Ident,
9695
variants_with_attr: &[(Ident, Type)],
97-
service_name: &Ident,
9896
) -> TokenStream2 {
9997
let mut impls = quote! {};
10098

10199
// Generate From<WithChannels<T, Service>> implementations for each case with an rpc attribute
102100
for (variant_name, inner_type) in variants_with_attr {
103101
let impl_tokens = quote! {
104-
impl From<::irpc::WithChannels<#inner_type, #service_name>> for #message_enum_name {
105-
fn from(value: ::irpc::WithChannels<#inner_type, #service_name>) -> Self {
102+
impl From<::irpc::WithChannels<#inner_type>> for #message_enum_name {
103+
fn from(value: ::irpc::WithChannels<#inner_type>) -> Self {
106104
#message_enum_name::#variant_name(value)
107105
}
108106
}
@@ -118,11 +116,7 @@ fn generate_message_enum_from_impls(
118116
}
119117

120118
/// Generate type aliases for WithChannels<T, Service>
121-
fn generate_type_aliases(
122-
variants: &[(Ident, Type)],
123-
service_name: &Ident,
124-
suffix: &str,
125-
) -> TokenStream2 {
119+
fn generate_type_aliases(variants: &[(Ident, Type)], suffix: &str) -> TokenStream2 {
126120
let mut aliases = quote! {};
127121

128122
for (variant_name, inner_type) in variants {
@@ -132,8 +126,8 @@ fn generate_type_aliases(
132126
let type_ident = Ident::new(&type_name, variant_name.span());
133127

134128
let alias = quote! {
135-
/// Type alias for WithChannels<#inner_type, #service_name>
136-
pub type #type_ident = ::irpc::WithChannels<#inner_type, #service_name>;
129+
/// Type alias for WithChannels<#inner_type>
130+
pub type #type_ident = ::irpc::WithChannels<#inner_type>;
137131
};
138132

139133
aliases = quote! {
@@ -169,7 +163,7 @@ fn generate_type_aliases(
169163
///
170164
/// Basic usage:
171165
/// ```
172-
/// #[rpc_requests(ComputeService)]
166+
/// #[rpc_requests]
173167
/// enum ComputeProtocol {
174168
/// #[rpc(tx=oneshot::Sender<u128>)]
175169
/// Sqr(Sqr),
@@ -180,7 +174,7 @@ fn generate_type_aliases(
180174
///
181175
/// With a message enum:
182176
/// ```
183-
/// #[rpc_requests(ComputeService, message = ComputeMessage)]
177+
/// #[rpc_requests(message = ComputeMessage)]
184178
/// enum ComputeProtocol {
185179
/// #[rpc(tx=oneshot::Sender<u128>)]
186180
/// Sqr(Sqr),
@@ -191,7 +185,7 @@ fn generate_type_aliases(
191185
///
192186
/// With type aliases:
193187
/// ```
194-
/// #[rpc_requests(ComputeService, alias = "Msg")]
188+
/// #[rpc_requests(alias = "Msg")]
195189
/// enum ComputeProtocol {
196190
/// #[rpc(tx=oneshot::Sender<u128>)]
197191
/// Sqr(Sqr), // Generates type SqrMsg = WithChannels<Sqr, ComputeService>
@@ -204,7 +198,6 @@ pub fn rpc_requests(attr: TokenStream, item: TokenStream) -> TokenStream {
204198
let mut input = parse_macro_input!(item as DeriveInput);
205199
let args = parse_macro_input!(attr as MacroArgs);
206200

207-
let service_name = args.service_name;
208201
let message_enum_name = args.message_enum_name;
209202
let alias_suffix = args.alias_suffix;
210203

@@ -277,7 +270,7 @@ pub fn rpc_requests(attr: TokenStream, item: TokenStream) -> TokenStream {
277270
Err(e) => return e.to_compile_error().into(),
278271
};
279272

280-
match generate_channels_impl(args, &service_name, request_type, attr.span()) {
273+
match generate_channels_impl(args, request_type, attr.span()) {
281274
Ok(impls) => channel_impls.push(impls),
282275
Err(e) => return e.to_compile_error().into(),
283276
}
@@ -290,7 +283,7 @@ pub fn rpc_requests(attr: TokenStream, item: TokenStream) -> TokenStream {
290283
// Generate type aliases if requested
291284
let type_aliases = if let Some(suffix) = alias_suffix {
292285
// Use all variants for type aliases, not just those with rpc attributes
293-
generate_type_aliases(&all_variants, &service_name, &suffix)
286+
generate_type_aliases(&all_variants, &suffix)
294287
} else {
295288
quote! {}
296289
};
@@ -302,7 +295,7 @@ pub fn rpc_requests(attr: TokenStream, item: TokenStream) -> TokenStream {
302295
.map(|(variant_name, inner_type)| {
303296
quote! {
304297
#[allow(missing_docs)]
305-
#variant_name(::irpc::WithChannels<#inner_type, #service_name>)
298+
#variant_name(::irpc::WithChannels<#inner_type>)
306299
}
307300
})
308301
.collect::<Vec<_>>();
@@ -323,11 +316,8 @@ pub fn rpc_requests(attr: TokenStream, item: TokenStream) -> TokenStream {
323316
let parent_span_impl = generate_parent_span_impl(&message_enum_name, &variant_names);
324317

325318
// Generate From implementations for the message enum (only for variants with rpc attributes)
326-
let message_from_impls = generate_message_enum_from_impls(
327-
&message_enum_name,
328-
&variants_with_attr,
329-
&service_name,
330-
);
319+
let message_from_impls =
320+
generate_message_enum_from_impls(&message_enum_name, &variants_with_attr);
331321

332322
quote! {
333323
#message_enum
@@ -361,23 +351,16 @@ pub fn rpc_requests(attr: TokenStream, item: TokenStream) -> TokenStream {
361351

362352
// Parse arguments for the macro
363353
struct MacroArgs {
364-
service_name: Ident,
365354
message_enum_name: Option<Ident>,
366355
alias_suffix: Option<String>,
367356
}
368357

369358
impl Parse for MacroArgs {
370359
fn parse(input: ParseStream) -> syn::Result<Self> {
371-
// First argument must be the service name (positional)
372-
let service_name: Ident = input.parse()?;
373-
374-
// Initialize optional parameters
375360
let mut message_enum_name = None;
376361
let mut alias_suffix = None;
377362

378-
// Parse any additional named parameters
379-
while input.peek(Token![,]) {
380-
input.parse::<Token![,]>()?;
363+
while !input.is_empty() {
381364
let param_name: Ident = input.parse()?;
382365
input.parse::<Token![=]>()?;
383366

@@ -392,14 +375,17 @@ impl Parse for MacroArgs {
392375
_ => {
393376
return Err(syn::Error::new(
394377
param_name.span(),
395-
format!("Unknown parameter: {param_name}"),
378+
format!("Unknown parameter: {}", param_name),
396379
));
397380
}
398381
}
382+
383+
if !input.is_empty() {
384+
input.parse::<Token![,]>()?;
385+
}
399386
}
400387

401388
Ok(MacroArgs {
402-
service_name,
403389
message_enum_name,
404390
alias_suffix,
405391
})

0 commit comments

Comments
 (0)