pub mod database;
pub mod error;
pub mod localfile;
pub mod redis;
pub mod types;
use error::StorageError;
use types::{StorageType, WriteCompactedEntryOptions, WriteEntryOptions};
pub async fn write_entry(options: &WriteEntryOptions) -> Result<(), StorageError> {
match options.storage_type {
StorageType::LocalFile => {
localfile::writer::write_entry_to_file(
&options.session_id, &options.role, &options.content,
options.tools.as_ref(), options.token_consumption, options.create_at.as_deref(),
)?;
Ok(())
}
StorageType::Database | StorageType::Mysql => {
let db_config = options.database_config.as_ref().ok_or_else(|| {
StorageError::ConfigError("database_config is required".to_string())
})?;
if matches!(options.storage_type, StorageType::Mysql) {
database::mysql::write_entry_mysql(
db_config, &options.session_id, &options.role, &options.content,
options.tools.as_ref(), options.token_consumption,
).await?;
} else {
database::writer::write_entry_to_database(
db_config, &options.session_id, &options.role, &options.content,
options.tools.as_ref(), options.token_consumption, options.create_at.as_deref(),
).await?;
}
Ok(())
}
StorageType::Mongodb => {
let db_config = options.database_config.as_ref().ok_or_else(|| {
StorageError::ConfigError("database_config is required".to_string())
})?;
let mongo = database::mongodb::MongoClient::new(
&format!("mongodb://{}:{}@{}:{}/{}",
db_config.user, db_config.password, db_config.host, db_config.port, db_config.database),
&db_config.database,
).await?;
mongo.write_entry(
&options.session_id, &options.role, &options.content,
options.tools.as_ref(), options.token_consumption,
).await?;
Ok(())
}
StorageType::Redis => {
let _ = options; Ok(())
}
}
}
pub async fn write_compacted_entry(options: &WriteCompactedEntryOptions) -> Result<(), StorageError> {
match options.storage_type {
StorageType::LocalFile => {
localfile::writer::write_compacted_entry_to_file(
&options.session_id, &options.summary, &options.trigger_entry_id, options.create_at.as_deref(),
)?;
Ok(())
}
StorageType::Database | StorageType::Mysql | StorageType::Mongodb | StorageType::Redis => {
let db_config = options.database_config.as_ref().ok_or_else(|| {
StorageError::ConfigError("database_config is required".to_string())
})?;
if matches!(options.storage_type, StorageType::Database) {
database::writer::write_compacted_entry_to_database(
db_config, &options.session_id, &options.summary,
&options.trigger_entry_id, options.create_at.as_deref(),
).await?;
}
Ok(())
}
}
}