mirror of
https://github.com/NotAShelf/stash.git
synced 2026-04-17 00:03:46 +00:00
stash: move import logic into stash::commmands
Signed-off-by: NotAShelf <raf@notashelf.dev> Change-Id: I6a6a6964f8fb8c9b14049ba3a343bb453ca59004
This commit is contained in:
parent
8423dffdfe
commit
1ed518a3b6
3 changed files with 47 additions and 15 deletions
|
|
@ -2,14 +2,41 @@ use std::io::{self, BufRead};
|
||||||
|
|
||||||
use log::{error, info};
|
use log::{error, info};
|
||||||
|
|
||||||
use crate::db::{Entry, SqliteClipboardDb, detect_mime};
|
use crate::db::{
|
||||||
|
ClipboardDb,
|
||||||
|
Entry,
|
||||||
|
SqliteClipboardDb,
|
||||||
|
StashError,
|
||||||
|
detect_mime,
|
||||||
|
};
|
||||||
|
|
||||||
pub trait ImportCommand {
|
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 {
|
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 reader = io::BufReader::new(input);
|
||||||
let mut imported = 0;
|
let mut imported = 0;
|
||||||
for line in reader.lines().map_while(Result::ok) {
|
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.");
|
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(())
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -1,5 +1,6 @@
|
||||||
pub mod decode;
|
pub mod decode;
|
||||||
pub mod delete;
|
pub mod delete;
|
||||||
|
pub mod import;
|
||||||
pub mod list;
|
pub mod list;
|
||||||
pub mod query;
|
pub mod query;
|
||||||
pub mod store;
|
pub mod store;
|
||||||
|
|
|
||||||
23
src/main.rs
23
src/main.rs
|
|
@ -11,19 +11,16 @@ use inquire::Confirm;
|
||||||
|
|
||||||
mod commands;
|
mod commands;
|
||||||
mod db;
|
mod db;
|
||||||
mod import;
|
|
||||||
|
|
||||||
use crate::{
|
use crate::commands::{
|
||||||
commands::{
|
decode::DecodeCommand,
|
||||||
decode::DecodeCommand,
|
delete::DeleteCommand,
|
||||||
delete::DeleteCommand,
|
|
||||||
list::ListCommand,
|
|
||||||
query::QueryCommand,
|
|
||||||
store::StoreCommand,
|
|
||||||
watch::WatchCommand,
|
|
||||||
wipe::WipeCommand,
|
|
||||||
},
|
|
||||||
import::ImportCommand,
|
import::ImportCommand,
|
||||||
|
list::ListCommand,
|
||||||
|
query::QueryCommand,
|
||||||
|
store::StoreCommand,
|
||||||
|
watch::WatchCommand,
|
||||||
|
wipe::WipeCommand,
|
||||||
};
|
};
|
||||||
|
|
||||||
#[derive(Parser)]
|
#[derive(Parser)]
|
||||||
|
|
@ -299,7 +296,9 @@ fn main() {
|
||||||
let format = r#type.as_deref().unwrap_or("tsv");
|
let format = r#type.as_deref().unwrap_or("tsv");
|
||||||
match format {
|
match format {
|
||||||
"tsv" => {
|
"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}");
|
log::error!("Failed to import TSV: {e}");
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue