pub mod database;
pub mod error;
pub mod maintenance;
pub mod manager;
pub mod migration;
pub mod query;
pub mod table;
#[cfg(test)]
pub mod test_utils;
pub mod transaction;
pub mod types;
pub use database::{CloseDatabaseTool, DatabaseInfoTool, ListDatabasesTool, OpenDatabaseTool};
pub use error::SqliteToolError;
pub use maintenance::{BackupDatabaseTool, ExportSchemaTool, VacuumDatabaseTool};
pub use manager::{with_connection, DATABASE_MANAGER};
pub use migration::{
AddMigrationTool, ExportMigrationsTool, GetMigrationTool, ImportMigrationsTool,
ListMigrationsTool, RemoveMigrationTool, RunMigrationsTool,
};
pub use query::{BulkInsertTool, ReadQueryTool, SchemaQueryTool, WriteQueryTool};
pub use table::{DescribeTableTool, ListTablesTool};
pub use transaction::{BeginTransactionTool, CommitTransactionTool, RollbackTransactionTool};
pub use types::*;
use mixtape_core::tool::{box_tool, DynTool};
pub fn read_only_tools() -> Vec<Box<dyn DynTool>> {
vec![
box_tool(OpenDatabaseTool),
box_tool(CloseDatabaseTool),
box_tool(ListDatabasesTool),
box_tool(DatabaseInfoTool),
box_tool(ListTablesTool),
box_tool(DescribeTableTool),
box_tool(ReadQueryTool),
box_tool(ExportSchemaTool),
box_tool(BackupDatabaseTool),
]
}
pub fn mutative_tools() -> Vec<Box<dyn DynTool>> {
vec![
box_tool(WriteQueryTool),
box_tool(SchemaQueryTool),
box_tool(BulkInsertTool),
box_tool(VacuumDatabaseTool),
]
}
pub fn transaction_tools() -> Vec<Box<dyn DynTool>> {
vec![
box_tool(BeginTransactionTool),
box_tool(CommitTransactionTool),
box_tool(RollbackTransactionTool),
]
}
pub fn migration_tools() -> Vec<Box<dyn DynTool>> {
vec![
box_tool(AddMigrationTool),
box_tool(RunMigrationsTool),
box_tool(ListMigrationsTool),
box_tool(GetMigrationTool),
box_tool(RemoveMigrationTool),
box_tool(ExportMigrationsTool),
box_tool(ImportMigrationsTool),
]
}
pub fn all_tools() -> Vec<Box<dyn DynTool>> {
let mut tools = read_only_tools();
tools.extend(mutative_tools());
tools.extend(transaction_tools());
tools.extend(migration_tools());
tools
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_read_only_tools_count_and_names() {
let tools = read_only_tools();
assert_eq!(tools.len(), 9);
let names: Vec<&str> = tools.iter().map(|t| t.name()).collect();
assert!(names.contains(&"sqlite_open_database"));
assert!(names.contains(&"sqlite_close_database"));
assert!(names.contains(&"sqlite_list_databases"));
assert!(names.contains(&"sqlite_database_info"));
assert!(names.contains(&"sqlite_list_tables"));
assert!(names.contains(&"sqlite_describe_table"));
assert!(names.contains(&"sqlite_read_query"));
assert!(names.contains(&"sqlite_export_schema"));
assert!(names.contains(&"sqlite_backup"));
}
#[test]
fn test_mutative_tools_count_and_names() {
let tools = mutative_tools();
assert_eq!(tools.len(), 4);
let names: Vec<&str> = tools.iter().map(|t| t.name()).collect();
assert!(names.contains(&"sqlite_write_query"));
assert!(names.contains(&"sqlite_schema_query"));
assert!(names.contains(&"sqlite_bulk_insert"));
assert!(names.contains(&"sqlite_vacuum"));
}
#[test]
fn test_transaction_tools_count_and_names() {
let tools = transaction_tools();
assert_eq!(tools.len(), 3);
let names: Vec<&str> = tools.iter().map(|t| t.name()).collect();
assert!(names.contains(&"sqlite_begin_transaction"));
assert!(names.contains(&"sqlite_commit_transaction"));
assert!(names.contains(&"sqlite_rollback_transaction"));
}
#[test]
fn test_migration_tools_count_and_names() {
let tools = migration_tools();
assert_eq!(tools.len(), 7);
let names: Vec<&str> = tools.iter().map(|t| t.name()).collect();
assert!(names.contains(&"sqlite_add_migration"));
assert!(names.contains(&"sqlite_run_migrations"));
assert!(names.contains(&"sqlite_list_migrations"));
assert!(names.contains(&"sqlite_get_migration"));
assert!(names.contains(&"sqlite_remove_migration"));
assert!(names.contains(&"sqlite_export_migrations"));
assert!(names.contains(&"sqlite_import_migrations"));
}
#[test]
fn test_all_tools_combines_categories() {
let all = all_tools();
let read_only = read_only_tools();
let mutative = mutative_tools();
let transaction = transaction_tools();
let migration = migration_tools();
assert_eq!(
all.len(),
read_only.len() + mutative.len() + transaction.len() + migration.len()
);
assert_eq!(all.len(), 23);
}
#[test]
fn test_tools_have_descriptions() {
for tool in all_tools() {
assert!(
!tool.description().is_empty(),
"Tool {} has empty description",
tool.name()
);
}
}
#[test]
fn test_tools_have_schemas() {
for tool in all_tools() {
let schema = tool.input_schema();
assert!(
schema.is_object(),
"Tool {} schema is not an object",
tool.name()
);
}
}
#[test]
fn test_no_duplicate_tool_names() {
let tools = all_tools();
let names: Vec<&str> = tools.iter().map(|t| t.name()).collect();
let mut unique_names = names.clone();
unique_names.sort();
unique_names.dedup();
assert_eq!(
names.len(),
unique_names.len(),
"Duplicate tool names found"
);
}
}