echo_failure/
echo_failure.rs1use async_trait::async_trait;
6use maelstrom::protocol::{ErrorMessageBody, Message};
7use maelstrom::{done, Node, Result, Runtime};
8use serde_json::{Map, Value};
9use std::sync::atomic::Ordering;
10use std::sync::Arc;
11
12pub(crate) fn main() -> Result<()> {
13 Runtime::init(try_main())
14}
15
16async fn try_main() -> Result<()> {
17 let handler = Arc::new(Handler::default());
18 Runtime::new().with_handler(handler).run().await
19}
20
21#[derive(Clone, Default)]
22struct Handler {
23 inter: Arc<std::sync::atomic::AtomicI32>,
24}
25
26#[async_trait]
27impl Node for Handler {
28 async fn process(&self, runtime: Runtime, message: Message) -> Result<()> {
29 if message.get_type() == "echo" {
30 if self.inter.fetch_add(1, Ordering::SeqCst) > 0 {
31 let err = maelstrom::Error::TemporarilyUnavailable {};
32 let body = ErrorMessageBody::from_error(err);
33 return runtime.reply(message, body).await;
34 }
35
36 let echo = format!("Another echo {}", message.body.msg_id);
37 let msg = Value::Object(Map::from_iter([("echo".to_string(), Value::String(echo))]));
38 return runtime.reply(message, msg).await;
39 }
40
41 done(runtime, message)
42 }
43}
44
45