rustybook-messenger 0.2.1

Messenger client for Rustybook
Documentation
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,
    })
}