#![allow(clippy::unused_async)]
use blazen::prelude::*;
#[derive(Debug, Clone, Serialize, Deserialize, Event)]
struct AnalyzeEvent {
text: String,
sentiment: f64,
}
#[derive(Debug, Clone, Serialize, Deserialize, Event)]
struct PositiveEvent {
text: String,
}
#[derive(Debug, Clone, Serialize, Deserialize, Event)]
struct NegativeEvent {
text: String,
}
#[step]
async fn analyze(event: StartEvent, _ctx: Context) -> Result<AnalyzeEvent, WorkflowError> {
let text = event.data["text"].as_str().unwrap_or("").to_string();
let lower = text.to_lowercase();
let sentiment = if lower.contains("good") || lower.contains("great") {
0.9
} else {
0.2
};
println!("[analyze] text={text:?} sentiment={sentiment}");
Ok(AnalyzeEvent { text, sentiment })
}
#[step(emits = [PositiveEvent, NegativeEvent])]
async fn route(event: AnalyzeEvent, _ctx: Context) -> Result<StepOutput, WorkflowError> {
if event.sentiment > 0.5 {
println!("[route] -> PositiveEvent");
Ok(StepOutput::Single(Box::new(PositiveEvent {
text: event.text,
})))
} else {
println!("[route] -> NegativeEvent");
Ok(StepOutput::Single(Box::new(NegativeEvent {
text: event.text,
})))
}
}
#[step]
async fn handle_positive(event: PositiveEvent, _ctx: Context) -> Result<StopEvent, WorkflowError> {
let response = format!("Glad you feel positive about: {}", event.text);
println!("[handle_positive] {response}");
Ok(StopEvent {
result: serde_json::json!({ "response": response }),
})
}
#[step]
async fn handle_negative(event: NegativeEvent, _ctx: Context) -> Result<StopEvent, WorkflowError> {
let response = format!("Sorry to hear about: {}", event.text);
println!("[handle_negative] {response}");
Ok(StopEvent {
result: serde_json::json!({ "response": response }),
})
}
#[tokio::main]
async fn main() -> anyhow::Result<()> {
let workflow = WorkflowBuilder::new("sentiment_router")
.step(analyze_registration())
.step(route_registration())
.step(handle_positive_registration())
.step(handle_negative_registration())
.build()?;
println!("=== Positive Input ===");
let result = workflow
.run(serde_json::json!({ "text": "This is a great day!" }))
.await?
.result()
.await?
.event;
println!("Result: {}\n", result.to_json());
println!("=== Negative Input ===");
let result = workflow
.run(serde_json::json!({ "text": "This is terrible" }))
.await?
.result()
.await?
.event;
println!("Result: {}", result.to_json());
Ok(())
}