use unilang::{ VerifiedCommand, ExecutionContext, OutputData, ErrorData, ErrorCode };
use super::storage::{ create_storage, load_project_for_param, find_session_mut };
#[ allow( clippy::needless_pass_by_value ) ]
#[ inline ]
pub fn export_routine( cmd : VerifiedCommand, _ctx : ExecutionContext )
-> core::result::Result< OutputData, ErrorData >
{
let session_id = cmd.get_string( "session_id" )
.ok_or_else( || ErrorData::new( ErrorCode::InternalError, "session_id is required".to_string() ) )?;
let output_path_str = cmd.get_string( "output" )
.ok_or_else( || ErrorData::new( ErrorCode::InternalError, "output is required".to_string() ) )?;
let format_str = cmd.get_string( "format" ).unwrap_or( "markdown" );
let project_id = cmd.get_string( "project" );
let format = claude_storage_core::ExportFormat::from_str( format_str )
.map_err( | e | ErrorData::new( ErrorCode::InternalError, format!( "Invalid format: {e}" ) ) )?;
let storage = create_storage()?;
let project = if let Some( proj_id ) = project_id
{
load_project_for_param( &storage, proj_id )
}
else
{
storage.load_project_for_cwd()
.map_err( | e | ErrorData::new( ErrorCode::InternalError, format!( "Failed to load project: {e}" ) ) )
}?;
let mut sessions = project.all_sessions()
.map_err( | e | ErrorData::new( ErrorCode::InternalError, format!( "Failed to list sessions: {e}" ) ) )?;
let session = find_session_mut( &mut sessions, session_id )?;
let output_path = std::path::Path::new( output_path_str );
claude_storage_core::export_session_to_file( session, format, output_path )
.map_err( | e | ErrorData::new( ErrorCode::InternalError, format!( "Export failed: {e}" ) ) )?;
let output = format!( "Exported session '{session_id}' to {} (format: {format:?})", output_path.display() );
Ok( OutputData::new( output, "text" ) )
}