use rmcp::schemars::JsonSchema;
use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema)]
#[serde(rename_all = "lowercase")]
pub enum UserContextStatus {
Complete,
Partial,
Empty,
}
#[derive(Debug, Serialize, Deserialize, JsonSchema)]
pub struct UserContext {
pub origin: Option<String>,
pub location: Option<String>,
pub destination: Option<String>,
pub last_updated: String,
pub context_available: bool,
pub status: UserContextStatus,
pub message: String,
}
impl UserContext {
pub fn new(
origin: Option<String>,
location: Option<String>,
destination: Option<String>,
) -> Self {
let any_set = origin.is_some() || location.is_some() || destination.is_some();
let all_set = origin.is_some() && location.is_some() && destination.is_some();
let status = if all_set {
UserContextStatus::Complete
} else if any_set {
UserContextStatus::Partial
} else {
UserContextStatus::Empty
};
let message = match (&origin, &location, &destination) {
(Some(org), Some(loc), Some(dest)) => {
format!(
"User journey: Origin: {}, Current location: {}, Destination: {}",
org, loc, dest
)
}
(Some(org), Some(loc), None) => {
format!(
"User origin: {}, Current location: {} (destination not set)",
org, loc
)
}
(Some(org), None, Some(dest)) => {
format!(
"User origin: {}, Destination: {} (current location not set)",
org, dest
)
}
(None, Some(loc), Some(dest)) => {
format!(
"Current location: {}, Destination: {} (origin not set)",
loc, dest
)
}
(Some(org), None, None) => {
format!("User origin: {} (location and destination not set)", org)
}
(None, Some(loc), None) => {
format!("Current location: {} (origin and destination not set)", loc)
}
(None, None, Some(dest)) => {
format!("Destination: {} (origin and location not set)", dest)
}
(None, None, None) => "No user context saved yet".to_string(),
};
Self {
origin,
location,
destination,
last_updated: chrono::Local::now().to_rfc3339(),
context_available: any_set,
status,
message,
}
}
}