return errors from handlers
This commit is contained in:
parent
b7728d43c5
commit
94c2e1a46b
|
@ -10,7 +10,7 @@ use std::{
|
|||
pub struct Malestorm<'a> {
|
||||
node: RefCell<Node>,
|
||||
io: MalestormIo,
|
||||
pub handlers: HashMap<&'a str, Box<dyn Fn(Message, Rc<Malestorm>)>>,
|
||||
pub handlers: HashMap<&'a str, Box<dyn Fn(Message, Rc<Malestorm>) -> Result<(), String>>>,
|
||||
}
|
||||
|
||||
struct Node {
|
||||
|
@ -96,7 +96,9 @@ impl<'a> Malestorm<'a> {
|
|||
}
|
||||
};
|
||||
|
||||
handler(message, pc);
|
||||
if let Err(e) = handler(message, pc) {
|
||||
eprintln!("error in serving request: {}", e);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -113,7 +115,7 @@ impl<'a> Malestorm<'a> {
|
|||
pub fn register(
|
||||
&mut self,
|
||||
name: &'a str,
|
||||
func: impl Fn(Message, Rc<Malestorm>) + 'a + 'static,
|
||||
func: impl Fn(Message, Rc<Malestorm>) -> Result<(), String> + 'a + 'static,
|
||||
) {
|
||||
self.handlers.insert(name, Box::new(func));
|
||||
}
|
||||
|
|
51
src/main.rs
51
src/main.rs
|
@ -7,37 +7,38 @@ use std::rc::Rc;
|
|||
fn main() {
|
||||
let mut program = Malestorm::default();
|
||||
|
||||
program.register("init", |mut msg: Message, program: Rc<Malestorm>| {
|
||||
let message_body: InitMessage = serde_json::from_value(msg.body.message_body.take())
|
||||
.expect("error in parsing message body");
|
||||
program.register(
|
||||
"init",
|
||||
// TODO: Replace error string with a type
|
||||
|mut msg: Message, program: Rc<Malestorm>| -> Result<(), String> {
|
||||
let message_body: InitMessage = serde_json::from_value(msg.body.message_body.take())
|
||||
.map_err(|e| format!("error in parsing response body: {}", e))?;
|
||||
|
||||
program.set_node_id(message_body.node_id);
|
||||
program.set_nodes(message_body.nodes);
|
||||
program.set_node_id(message_body.node_id);
|
||||
program.set_nodes(message_body.nodes);
|
||||
|
||||
msg.body.message_type = "init_ok".into();
|
||||
msg.body.message_type = "init_ok".into();
|
||||
|
||||
match program.reply(msg) {
|
||||
Ok(_) => (),
|
||||
Err(e) => {
|
||||
eprintln!("init: error in writing response: {}", e);
|
||||
}
|
||||
}
|
||||
});
|
||||
program
|
||||
.reply(msg)
|
||||
.map_err(|e| format!("init: error in writing response: {}", e))
|
||||
},
|
||||
);
|
||||
|
||||
program.register("echo", |mut msg: Message, program: Rc<Malestorm>| {
|
||||
let message_body: EchoMessage = serde_json::from_value(msg.body.message_body.take())
|
||||
.expect("error in parsing message body");
|
||||
program.register(
|
||||
"echo",
|
||||
|mut msg: Message, program: Rc<Malestorm>| -> Result<(), String> {
|
||||
let message_body: EchoMessage = serde_json::from_value(msg.body.message_body.take())
|
||||
.map_err(|e| format!("error in parsing response body: {}", e))?;
|
||||
|
||||
msg.body.message_type = "echo_ok".into();
|
||||
msg.body.message_body = serde_json::to_value(message_body).unwrap();
|
||||
msg.body.message_type = "echo_ok".into();
|
||||
msg.body.message_body = serde_json::to_value(message_body).unwrap();
|
||||
|
||||
match program.reply(msg) {
|
||||
Ok(_) => (),
|
||||
Err(e) => {
|
||||
eprintln!("echo: error in writing response: {}", e);
|
||||
}
|
||||
}
|
||||
});
|
||||
program
|
||||
.reply(msg)
|
||||
.map_err(|e| format!("echo: error in writing response: {}", e))
|
||||
},
|
||||
);
|
||||
|
||||
program.run();
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue
Block a user