use std::path::{ Path, PathBuf };
use core::str::FromStr;
#[ derive( Debug, Clone, Copy, PartialEq, Eq ) ]
pub enum Strategy
{
Resume,
Fresh,
}
impl FromStr for Strategy
{
type Err = String;
#[ inline ]
fn from_str( s : &str ) -> Result< Self, Self::Err >
{
match s
{
"resume" => Ok( Strategy::Resume ),
"fresh" => Ok( Strategy::Fresh ),
_ => Err( format!( "Invalid strategy: '{s}'. Use 'resume' or 'fresh'" ) ),
}
}
}
#[ derive( Debug ) ]
pub struct SessionManager
{
sessions_base_dir : PathBuf,
}
impl SessionManager
{
#[ inline ]
pub fn new( sessions_base_dir : impl AsRef< Path > ) -> Self
{
Self
{
sessions_base_dir : sessions_base_dir.as_ref().to_path_buf(),
}
}
#[ inline ]
#[ must_use ]
pub fn session_dir( &self, session_name : &str ) -> PathBuf
{
self.sessions_base_dir
.join( format!( "-{session_name}" ) )
}
#[ deprecated(
since = "0.2.0",
note = "Only detects Claude Code v1.x sessions. \
Use `claude_storage_core::continuation::check_continuation()` for v2.0+ compatibility."
) ]
#[ inline ]
#[ must_use ]
pub fn session_exists( &self, session_name : &str ) -> bool
{
let session_dir = self.session_dir( session_name );
let history_file = session_dir.join( ".claude_history" );
session_dir.exists() && history_file.exists()
}
#[ inline ]
pub fn ensure_session(
&self,
session_name : &str,
strategy : Strategy,
) -> Result< PathBuf, std::io::Error >
{
let session_dir = self.session_dir( session_name );
match strategy
{
Strategy::Fresh if session_dir.exists() =>
{
std::fs::remove_dir_all( &session_dir )?;
}
_ => {}
}
std::fs::create_dir_all( &session_dir )?;
Ok( session_dir )
}
#[ inline ]
#[ must_use ]
pub fn sessions_base_dir( &self ) -> &Path
{
&self.sessions_base_dir
}
}