use std::collections::HashMap;
use std::sync::atomic::{AtomicU64, Ordering};
use serde_json::Value as JsonValue;
use tokio::sync::{Mutex, oneshot};
pub struct TicketRegistry {
next_id: AtomicU64,
pending: Mutex<HashMap<String, oneshot::Sender<JsonValue>>>,
}
impl TicketRegistry {
pub fn new() -> Self {
Self {
next_id: AtomicU64::new(1),
pending: Mutex::new(HashMap::new()),
}
}
pub async fn create_ticket(&self) -> (String, oneshot::Receiver<JsonValue>) {
let id = self.next_id.fetch_add(1, Ordering::Relaxed);
let ticket = format!("nav-{id}");
let (tx, rx) = oneshot::channel();
let mut pending = self.pending.lock().await;
pending.insert(ticket.clone(), tx);
(ticket, rx)
}
pub async fn resolve(&self, ticket: &str, result: JsonValue) -> bool {
let tx = {
let mut pending = self.pending.lock().await;
pending.remove(ticket)
};
if let Some(tx) = tx {
let _ = tx.send(result);
true
} else {
false
}
}
}