use anyhow::Result;
use bmux_session_models::{Session, SessionId, SessionInfo};
use std::collections::BTreeMap;
#[derive(Debug, Default)]
pub struct SessionManager {
sessions: BTreeMap<SessionId, Session>,
}
impl SessionManager {
#[must_use]
pub const fn new() -> Self {
Self {
sessions: BTreeMap::new(),
}
}
pub fn create_session(&mut self, name: Option<String>) -> Result<SessionId> {
let session = Session::new(name);
let id = session.id;
self.sessions.insert(id, session);
Ok(id)
}
pub fn insert_session(&mut self, session: Session) -> Result<()> {
let id = session.id;
if self.sessions.contains_key(&id) {
return Err(anyhow::anyhow!("Session already exists: {id}"));
}
self.sessions.insert(id, session);
Ok(())
}
#[must_use]
pub fn get_session(&self, session_id: &SessionId) -> Option<&Session> {
self.sessions.get(session_id)
}
pub fn rename_session(&mut self, session_id: SessionId, name: String) -> Result<()> {
let Some(session) = self.sessions.get_mut(&session_id) else {
return Err(anyhow::anyhow!("Session not found: {session_id}"));
};
session.name = Some(name);
Ok(())
}
pub fn get_session_mut(&mut self, session_id: &SessionId) -> Option<&mut Session> {
self.sessions.get_mut(session_id)
}
#[must_use]
pub fn list_sessions(&self) -> Vec<SessionInfo> {
self.sessions.values().map(Into::into).collect()
}
pub fn remove_session(&mut self, session_id: &SessionId) -> Result<()> {
if self.sessions.remove(session_id).is_some() {
Ok(())
} else {
Err(anyhow::anyhow!("Session not found: {session_id}"))
}
}
}
#[cfg(test)]
mod tests {
use super::SessionManager;
#[test]
fn rename_session_updates_display_name() {
let mut manager = SessionManager::new();
let session_id = manager
.create_session(Some("old".to_string()))
.expect("create should succeed");
manager
.rename_session(session_id, "new".to_string())
.expect("rename should succeed");
let session = manager
.get_session(&session_id)
.expect("renamed session should exist");
assert_eq!(session.name.as_deref(), Some("new"));
}
}