use clap::Args; use eyre::{Result, bail}; use crate::command::client::daemon as daemon_cmd; use crate::atuin_client::{ database::ClientSqlite, encryption, history::store::HistoryStore, record::sqlite_store::SqliteStore, settings::Settings, }; #[derive(Args, Debug)] pub(crate) struct Rebuild { pub(crate) tag: String, } impl Rebuild { pub(crate) async fn run( &self, settings: &Settings, store: SqliteStore, database: &ClientSqlite, ) -> Result<()> { // keep it as a string and not an enum atm // would be super cool to build this dynamically in the future // eg register handles for rebuilding various tags without having to make this part of the // binary big match self.tag.as_str() { "history" => { self.rebuild_history(settings, store.clone(), database) .await?; } tag => bail!("unknown tag: {tag}"), } Ok(()) } async fn rebuild_history( &self, settings: &Settings, store: SqliteStore, database: &ClientSqlite, ) -> Result<()> { let encryption_key: [u8; 32] = encryption::load_key(settings)?.into(); let host_id = Settings::host_id().await?; let history_store = HistoryStore::new(store, host_id, encryption_key); history_store.build(database).await?; daemon_cmd::emit_event(settings, crate::atuin_daemon::DaemonEvent::HistoryRebuilt).await; Ok(()) } }