use super::config::SessionConfig;
use super::manager::EditorSessionManager;
use super::session::EditorSession;
use crate::core::{EditorDocument, EditorError, Result};
#[cfg(not(feature = "std"))]
use alloc::{
string::{String, ToString},
vec::Vec,
};
impl EditorSessionManager {
pub fn new() -> Self {
Self::with_config(SessionConfig::default())
}
pub fn create_session(&mut self, session_id: String) -> Result<()> {
self.create_session_with_document(session_id, EditorDocument::new())
}
pub fn create_session_with_document(
&mut self,
session_id: String,
document: EditorDocument,
) -> Result<()> {
self.with_inner_mut(|inner| {
if inner.sessions.len() >= inner.config.max_sessions {
return Err(EditorError::SessionLimitExceeded {
current: inner.sessions.len(),
limit: inner.config.max_sessions,
});
}
let session = EditorSession::new(session_id.clone(), document);
inner.sessions.insert(session_id.clone(), session);
inner.stats.active_sessions += 1;
if inner.active_session_id.is_none() {
inner.active_session_id = Some(session_id);
}
Ok(())
})
}
pub fn switch_session(&mut self, session_id: &str) -> Result<()> {
self.with_inner_mut(|inner| {
if !inner.sessions.contains_key(session_id) {
return Err(EditorError::DocumentNotFound {
id: session_id.to_string(),
});
}
inner.active_session_id = Some(session_id.to_string());
#[cfg(feature = "std")]
if let Some(session) = inner.sessions.get_mut(session_id) {
session.touch();
}
Ok(())
})
}
pub fn active_session(&self) -> Result<Option<String>> {
Ok(self.with_inner(|inner| inner.active_session_id.clone()))
}
pub fn remove_session(&mut self, session_id: &str) -> Result<EditorSession> {
self.with_inner_mut(|inner| {
let session =
inner
.sessions
.remove(session_id)
.ok_or_else(|| EditorError::DocumentNotFound {
id: session_id.to_string(),
})?;
inner.stats.active_sessions -= 1;
inner.stats.total_memory_usage -= session.memory_usage;
if inner.active_session_id.as_ref() == Some(&session_id.to_string()) {
inner.active_session_id = None;
}
Ok(session)
})
}
pub fn list_sessions(&self) -> Result<Vec<String>> {
Ok(self.with_inner(|inner| inner.sessions.keys().cloned().collect()))
}
}
impl Default for EditorSessionManager {
fn default() -> Self {
Self::new()
}
}