stash: move import logic into stash::commmands

Signed-off-by: NotAShelf <raf@notashelf.dev>
Change-Id: I6a6a6964f8fb8c9b14049ba3a343bb453ca59004
This commit is contained in:
raf 2025-08-20 10:35:10 +03:00
commit 1ed518a3b6
Signed by: NotAShelf
GPG key ID: 29D95B64378DB4BF
3 changed files with 47 additions and 15 deletions

View file

@ -2,14 +2,41 @@ use std::io::{self, BufRead};
use log::{error, info};
use crate::db::{Entry, SqliteClipboardDb, detect_mime};
use crate::db::{
ClipboardDb,
Entry,
SqliteClipboardDb,
StashError,
detect_mime,
};
pub trait ImportCommand {
fn import_tsv(&self, input: impl io::Read);
/// Import clipboard entries from TSV format.
///
/// # Arguments
///
/// * `input` - A readable stream containing TSV lines, each of the form
/// `<id>\t<contents>`.
/// * `max_items` - The maximum number of clipboard entries to keep after
/// import. If set to `u64::MAX`, no trimming occurs.
///
/// # Returns
///
/// * `Ok(())` if all entries are imported and trimming succeeds.
/// * `Err(StashError)` if any error occurs during import or trimming.
fn import_tsv(
&self,
input: impl io::Read,
max_items: u64,
) -> Result<(), StashError>;
}
impl ImportCommand for SqliteClipboardDb {
fn import_tsv(&self, input: impl io::Read) {
fn import_tsv(
&self,
input: impl io::Read,
max_items: u64,
) -> Result<(), StashError> {
let reader = io::BufReader::new(input);
let mut imported = 0;
for line in reader.lines().map_while(Result::ok) {
@ -41,5 +68,10 @@ impl ImportCommand for SqliteClipboardDb {
}
}
info!("Imported {imported} records from TSV into SQLite database.");
// Trim database to max_items after import
self.trim_db(max_items)?;
info!("Trimmed clipboard database to max_items = {max_items}");
Ok(())
}
}

View file

@ -1,5 +1,6 @@
pub mod decode;
pub mod delete;
pub mod import;
pub mod list;
pub mod query;
pub mod store;

View file

@ -11,19 +11,16 @@ use inquire::Confirm;
mod commands;
mod db;
mod import;
use crate::{
commands::{
decode::DecodeCommand,
delete::DeleteCommand,
list::ListCommand,
query::QueryCommand,
store::StoreCommand,
watch::WatchCommand,
wipe::WipeCommand,
},
use crate::commands::{
decode::DecodeCommand,
delete::DeleteCommand,
import::ImportCommand,
list::ListCommand,
query::QueryCommand,
store::StoreCommand,
watch::WatchCommand,
wipe::WipeCommand,
};
#[derive(Parser)]
@ -299,7 +296,9 @@ fn main() {
let format = r#type.as_deref().unwrap_or("tsv");
match format {
"tsv" => {
if let Err(e) = db.import_tsv(io::stdin(), cli.max_items) {
if let Err(e) =
ImportCommand::import_tsv(&db, io::stdin(), cli.max_items)
{
log::error!("Failed to import TSV: {e}");
}
},