Skip to content

Commit

Permalink
Error handle and consume self in connect function (#11)
Browse files Browse the repository at this point in the history
* use &self for connect function

* more &mut self to &self

* error handle

* add DynError

* remove except, return error

* add error handle for ServiceState trait
  • Loading branch information
al8n authored Dec 10, 2022
1 parent 4e2978e commit d6cc851
Show file tree
Hide file tree
Showing 15 changed files with 238 additions and 70 deletions.
120 changes: 120 additions & 0 deletions Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

7 changes: 4 additions & 3 deletions examples/waku-chat/src/chat.rs
Original file line number Diff line number Diff line change
Expand Up @@ -29,11 +29,11 @@ impl ServiceData for ChatService {

#[async_trait]
impl ServiceCore for ChatService {
fn init(service_state: ServiceStateHandle<Self>) -> Self {
Self { service_state }
fn init(service_state: ServiceStateHandle<Self>) -> Result<Self, overwatch_rs::DynError> {
Ok(Self { service_state })
}

async fn run(self) {
async fn run(self) -> Result<(), overwatch_rs::DynError> {
let Self {
mut service_state, ..
} = self;
Expand Down Expand Up @@ -89,5 +89,6 @@ impl ServiceCore for ChatService {
}
}
}
Ok(())
}
}
3 changes: 2 additions & 1 deletion examples/waku-chat/src/main.rs
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,8 @@ fn main() {
network: NetworkConfig { peers, port },
},
None,
);
)
.unwrap();
app.wait_finished();
}

Expand Down
9 changes: 5 additions & 4 deletions examples/waku-chat/src/network/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -49,16 +49,16 @@ impl<I: NetworkBackend + Send + 'static> ServiceData for NetworkService<I> {

#[async_trait]
impl<I: NetworkBackend + Send + 'static> ServiceCore for NetworkService<I> {
fn init(mut service_state: ServiceStateHandle<Self>) -> Self {
Self {
fn init(mut service_state: ServiceStateHandle<Self>) -> Result<Self, overwatch_rs::DynError> {
Ok(Self {
implem: <I as NetworkBackend>::new(
service_state.settings_reader.get_updated_settings(),
),
service_state,
}
})
}

async fn run(mut self) {
async fn run(mut self) -> Result<(), overwatch_rs::DynError> {
let Self {
service_state,
mut implem,
Expand All @@ -71,6 +71,7 @@ impl<I: NetworkBackend + Send + 'static> ServiceCore for NetworkService<I> {
NetworkMsg::Subscribe { kind: _, sender } => implem.subscribe(sender),
}
}
Ok(())
}
}

Expand Down
27 changes: 14 additions & 13 deletions overwatch-derive/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -145,14 +145,14 @@ fn generate_new_impl(fields: &Punctuated<Field, Comma>) -> proc_macro2::TokenStr
let manager =
::overwatch_rs::services::handle::ServiceHandle::<#service_type>::new(
#settings_field_identifier, overwatch_handle.clone(),
);
)?;
manager
}
}
});

quote! {
fn new(settings: Self::Settings, overwatch_handle: ::overwatch_rs::overwatch::handle::OverwatchHandle) -> Self {
fn new(settings: Self::Settings, overwatch_handle: ::overwatch_rs::overwatch::handle::OverwatchHandle) -> ::std::result::Result<Self, ::overwatch_rs::DynError> {
let Self::Settings {
#( #fields_settings ),*
} = settings;
Expand All @@ -161,7 +161,7 @@ fn generate_new_impl(fields: &Punctuated<Field, Comma>) -> proc_macro2::TokenStr
#( #managers ),*
};

app
::std::result::Result::Ok(app)
}
}
}
Expand All @@ -170,15 +170,16 @@ fn generate_start_all_impl(fields: &Punctuated<Field, Comma>) -> proc_macro2::To
let call_start = fields.iter().map(|field| {
let field_identifier = field.ident.as_ref().expect("A struct attribute identifier");
quote! {
self.#field_identifier.service_runner().run();
self.#field_identifier.service_runner().run()?;
}
});

quote! {
#[::tracing::instrument(skip(self), err)]
fn start_all(&mut self) -> Result<(), ::overwatch_rs::overwatch::Error> {
#( #call_start )*
Ok(())

::std::result::Result::Ok(())
}
}
}
Expand All @@ -189,8 +190,8 @@ fn generate_start_impl(fields: &Punctuated<Field, Comma>) -> proc_macro2::TokenS
let type_id = utils::extract_type_from(&field.ty);
quote! {
<#type_id as ::overwatch_rs::services::ServiceData>::SERVICE_ID => {
self.#field_identifier.service_runner().run();
Ok(())
self.#field_identifier.service_runner().run()?;
::std::result::Result::Ok(())
}
}
});
Expand All @@ -200,7 +201,7 @@ fn generate_start_impl(fields: &Punctuated<Field, Comma>) -> proc_macro2::TokenS
fn start(&mut self, service_id: ::overwatch_rs::services::ServiceId) -> Result<(), ::overwatch_rs::overwatch::Error> {
match service_id {
#( #cases ),*
service_id => Err(::overwatch_rs::overwatch::Error::Unavailable { service_id })
service_id => ::std::result::Result::Err(::overwatch_rs::overwatch::Error::Unavailable { service_id })
}
}
}
Expand All @@ -221,7 +222,7 @@ fn generate_stop_impl(fields: &Punctuated<Field, Comma>) -> proc_macro2::TokenSt
fn stop(&mut self, service_id: ::overwatch_rs::services::ServiceId) -> Result<(), ::overwatch_rs::overwatch::Error> {
match service_id {
#( #cases ),*
service_id => Err(::overwatch_rs::overwatch::Error::Unavailable { service_id })
service_id => ::std::result::Result::Err(::overwatch_rs::overwatch::Error::Unavailable { service_id })
}
}
}
Expand All @@ -233,10 +234,10 @@ fn generate_request_relay_impl(fields: &Punctuated<Field, Comma>) -> proc_macro2
let type_id = utils::extract_type_from(&field.ty);
quote! {
<#type_id as ::overwatch_rs::services::ServiceData>::SERVICE_ID => {
Ok(::std::boxed::Box::new(
::std::result::Result::Ok(::std::boxed::Box::new(
self.#field_identifier
.relay_with()
.expect("An open relay to service is established")
.ok_or(::overwatch_rs::services::relay::RelayError::AlreadyConnected)?
) as ::overwatch_rs::services::relay::AnyMessage)
}
}
Expand All @@ -248,7 +249,7 @@ fn generate_request_relay_impl(fields: &Punctuated<Field, Comma>) -> proc_macro2
{
match service_id {
#( #cases )*
service_id => Err(::overwatch_rs::services::relay::RelayError::Unavailable { service_id })
service_id => ::std::result::Result::Err(::overwatch_rs::services::relay::RelayError::Unavailable { service_id })
}
}
}
Expand Down Expand Up @@ -281,7 +282,7 @@ fn generate_update_settings_impl(fields: &Punctuated<Field, Comma>) -> proc_macr

#( #update_settings_call )*

Ok(())
::std::result::Result::Ok(())
}
}
}
1 change: 1 addition & 0 deletions overwatch-rs/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@ exclude = [
[dependencies]
overwatch-derive = { path = "../overwatch-derive" }
const-str = "0.3"
color-eyre = "0.6"
async-trait = "0.1"
futures = "0.3"
thiserror = "1.0"
Expand Down
2 changes: 2 additions & 0 deletions overwatch-rs/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -27,3 +27,5 @@
pub mod overwatch;
pub mod services;
pub mod utils;

pub type DynError = Box<dyn std::error::Error + Send + Sync + 'static>;
Loading

0 comments on commit d6cc851

Please sign in to comment.