use serde::Deserialize;
use crate::error::MessengerError;
#[derive(Debug, Clone, Deserialize)]
pub struct Cookie {
pub name: String,
pub value: String,
}
#[derive(Debug, Clone)]
pub struct AuthCookies {
pub cookie_header: String,
pub user_id: String,
}
pub fn load_cookies(path: &str) -> Result<AuthCookies, MessengerError> {
let content = std::fs::read_to_string(path)?;
let cookies: Vec<Cookie> = serde_json::from_str(&content)
.map_err(|error| MessengerError::Auth(format!("failed to parse cookie file: {error}")))?;
let mut parts = Vec::with_capacity(cookies.len());
let mut user_id = None;
let mut has_xs = false;
for cookie in &cookies {
if cookie.name.is_empty() {
continue;
}
parts.push(format!("{}={}", cookie.name, cookie.value));
if cookie.name == "c_user" {
user_id = Some(cookie.value.clone());
}
if cookie.name == "xs" {
has_xs = true;
}
}
let Some(user_id) = user_id else {
return Err(MessengerError::Auth(
"missing c_user cookie in cookie file".to_string(),
));
};
if !has_xs {
return Err(MessengerError::Auth(
"missing xs cookie in cookie file".to_string(),
));
}
Ok(AuthCookies {
cookie_header: parts.join("; "),
user_id,
})
}