From a196c2541d56ade6bdd82bd7c43a33aa5cbc6512 Mon Sep 17 00:00:00 2001 From: vobradovich Date: Fri, 22 Nov 2024 12:24:35 +0100 Subject: [PATCH] wip: service lifetime --- rs/macros/core/src/service/mod.rs | 41 ++++++++++++++++++- ...ice__works_with_extends_and_lifetimes.snap | 4 +- ...vice__works_with_lifetimes_and_events.snap | 4 +- ...ce__works_with_lifetimes_and_generics.snap | 4 +- rs/src/gstd/services.rs | 3 +- 5 files changed, 47 insertions(+), 9 deletions(-) diff --git a/rs/macros/core/src/service/mod.rs b/rs/macros/core/src/service/mod.rs index 5391d987..c05d4403 100644 --- a/rs/macros/core/src/service/mod.rs +++ b/rs/macros/core/src/service/mod.rs @@ -354,14 +354,51 @@ fn generate_gservice(args: TokenStream, service_impl: ItemImpl) -> TokenStream { }); } + let mut exposure_lifetimes: Punctuated = Punctuated::new(); + for lt in lifetimes.iter().map(|lt| { + let lt = format!("'{lt}"); + Lifetime::new(<, Span::call_site()) + }) { + exposure_lifetimes.push(lt); + } + let trait_lifetimes = if !exposure_lifetimes.is_empty() { + quote! { < #exposure_lifetimes> } + } else { + quote! {} + }; + + let mut base_types_funcs = Vec::with_capacity(service_args.base_types().len()); + let mut base_types_impl = Vec::with_capacity(service_args.base_types().len()); + let mut base_exposure_instantiation = Vec::with_capacity(service_args.base_types().len()); + // let mut invocation_dispatches = Vec::with_capacity(service_handlers.len()); + service_args.base_types().iter() + .enumerate() + .for_each(|(idx, base_type)| { + let as_base_ident = Ident::new(&format!("as_base_{}", idx), Span::call_site()); + + base_types_funcs.push(quote!{ + fn #as_base_ident (&self) -> &< #base_type as #sails_path::gstd::services::Service>::Exposure; + }); + + base_types_impl.push(quote!{ + fn #as_base_ident (&self) -> &< #base_type as #sails_path::gstd::services::Service>::Exposure { + &self.extend.#idx + } + }); + + base_exposure_instantiation.push(quote!( + < #base_type as Clone>::clone(AsRef::< #base_type >::as_ref( #inner_ident )).expose( #message_id_ident , #route_ident ), + )); + }); + quote!( #service_impl - pub trait #trait_ident #exposure_lifetimes { + pub trait #trait_ident #trait_lifetimes { #( #trait_funcs )* } - impl #generics #trait_ident #exposure_lifetimes for #sails_path::gstd::services::ServiceExposure< #exposure_args, () > #service_type_constraints { + impl #generics #trait_ident #trait_lifetimes for #sails_path::gstd::services::ServiceExposure< #exposure_args, () > #service_type_constraints { #( #trait_funcs_impl )* } diff --git a/rs/macros/core/tests/snapshots/gservice__works_with_extends_and_lifetimes.snap b/rs/macros/core/tests/snapshots/gservice__works_with_extends_and_lifetimes.snap index e65c751d..73aa1c3d 100644 --- a/rs/macros/core/tests/snapshots/gservice__works_with_extends_and_lifetimes.snap +++ b/rs/macros/core/tests/snapshots/gservice__works_with_extends_and_lifetimes.snap @@ -10,11 +10,11 @@ impl<'a> ExtendedLifetime<'a> { "extended".to_string() } } -trait __ExtendedLifetimeImplTrait { +pub trait ExtendedLifetimeImplTrait<'a> { fn extended_name(&self) -> String; fn name(&self) -> String; } -impl<'a> __ExtendedLifetimeImplTrait +impl<'a> ExtendedLifetimeImplTrait<'a> for sails_rs::gstd::services::ServiceExposure<'a, ExtendedLifetime<'a>, ()> { fn extended_name(&self) -> String { let exposure_scope = sails_rs::gstd::services::ExposureCallScope::new2(self); diff --git a/rs/macros/core/tests/snapshots/gservice__works_with_lifetimes_and_events.snap b/rs/macros/core/tests/snapshots/gservice__works_with_lifetimes_and_events.snap index 3361395d..db2b3f53 100644 --- a/rs/macros/core/tests/snapshots/gservice__works_with_lifetimes_and_events.snap +++ b/rs/macros/core/tests/snapshots/gservice__works_with_lifetimes_and_events.snap @@ -25,10 +25,10 @@ where sails_rs::gstd::events::__notify_on(event) } } -pub trait MyGenericEventsServiceImplTrait { +pub trait MyGenericEventsServiceImplTrait<'a> { fn do_this(&mut self) -> u32; } -impl<'a, T> MyGenericEventsServiceImplTrait +impl<'a, T> MyGenericEventsServiceImplTrait<'a> for sails_rs::gstd::services::ServiceExposure, ()> where T: Clone, diff --git a/rs/macros/core/tests/snapshots/gservice__works_with_lifetimes_and_generics.snap b/rs/macros/core/tests/snapshots/gservice__works_with_lifetimes_and_generics.snap index 8495636b..885b057a 100644 --- a/rs/macros/core/tests/snapshots/gservice__works_with_lifetimes_and_generics.snap +++ b/rs/macros/core/tests/snapshots/gservice__works_with_lifetimes_and_generics.snap @@ -11,10 +11,10 @@ where 42 } } -pub trait SomeServiceImplTrait { +pub trait SomeServiceImplTrait<'a, 'b> { fn do_this(&mut self) -> u32; } -impl<'a, 'b, T, U> SomeServiceImplTrait +impl<'a, 'b, T, U> SomeServiceImplTrait<'a, 'b> for sails_rs::gstd::services::ServiceExposure, ()> where T: Clone, diff --git a/rs/src/gstd/services.rs b/rs/src/gstd/services.rs index 58d0edf1..1032fd9e 100644 --- a/rs/src/gstd/services.rs +++ b/rs/src/gstd/services.rs @@ -37,7 +37,7 @@ pub struct ServiceExposure { pub inner: Box, #[cfg(target_arch = "wasm32")] pub inner: T, - extend: E, + pub extend: E, } impl ServiceExposure { @@ -277,6 +277,7 @@ impl ServiceHandle for (T1, T2) { } } +// todo: make macro_rules impl ServiceHandle for (T1, T2, T3) { async fn try_handle(&mut self, input: &[u8]) -> Option<(Vec, u128)> { if let Some(result) = self.0.try_handle(input).await {