feat: extract digest and compression type handling into common command functions

This commit is contained in:
Andrew Phillips
2025-05-14 21:54:45 -03:00
committed by Andrew Phillips (aider)
parent 947ed55fb7
commit d1edd20845
2 changed files with 59 additions and 35 deletions

View File

@@ -1,15 +1,19 @@
use humansize::{BINARY, FormatSizeOptions}; use humansize::{BINARY, FormatSizeOptions};
use clap::Command;
use log::debug; use log::debug;
use prettytable::format::TableFormat; use prettytable::format::TableFormat;
use clap::error::ErrorKind;
use regex::Regex; use regex::Regex;
use std::collections::HashMap; use std::collections::HashMap;
use std::env; use std::env;
use rusqlite::Connection; use rusqlite::Connection;
use std::str::FromStr;
use crate::db::Item; use crate::db::Item;
use crate::db::Meta; use crate::db::Meta;
use crate::db::store_meta; use crate::db::store_meta;
use crate::compression_engine::CompressionType;
use crate::digest_engine::DigestType; use crate::digest_engine::DigestType;
use crate::digest_engine::get_digest_type_meta; use crate::Args;
pub fn get_meta_from_env() -> HashMap<String, String> { pub fn get_meta_from_env() -> HashMap<String, String> {
debug!("MAIN: Getting meta from KEEP_META_*"); debug!("MAIN: Getting meta from KEEP_META_*");
@@ -97,6 +101,11 @@ pub fn get_format_box_chars_no_border_line_separator() -> TableFormat {
.build() .build()
} }
pub fn get_digest_type_meta(digest_type: DigestType) -> String {
format!("digest_{}", digest_type.to_string().to_lowercase())
}
pub fn store_item_digest_value( pub fn store_item_digest_value(
conn: &mut Connection, conn: &mut Connection,
item: Item, item: Item,
@@ -113,3 +122,41 @@ pub fn store_item_digest_value(
store_meta(conn, digest_meta)?; store_meta(conn, digest_meta)?;
Ok(()) Ok(())
} }
pub fn cmd_args_digest_type(cmd: &mut Command, args: Args) -> DigestType {
let digest_name = args
.item
.digest
.clone()
.unwrap_or(DigestType::Sha256.to_string());
let digest_type_opt = DigestType::from_str(&digest_name);
if digest_type_opt.is_err() {
cmd.error(
ErrorKind::InvalidValue,
format!("Unknown digest type: {}", digest_name),
)
.exit();
}
digest_type_opt.unwrap()
}
pub fn cmd_args_compression_type(cmd: &mut Command, args: Args) -> CompressionType {
let compression_name = args
.item
.compression
.clone()
.unwrap_or(CompressionType::LZ4.to_string());
let compression_type_opt = CompressionType::from_str(&compression_name);
if compression_type_opt.is_err() {
cmd.error(
ErrorKind::InvalidValue,
format!("Unknown compression type: {}", compression_name),
)
.exit();
}
compression_type_opt.unwrap()
}

View File

@@ -1,8 +1,8 @@
use anyhow::{Context, Result, anyhow}; use gethostname::gethostname;
use anyhow::{anyhow, Context, Result};
use is_terminal::IsTerminal; use is_terminal::IsTerminal;
use std::collections::HashMap; use std::collections::HashMap;
use std::io::{self, Read}; use std::io::{self, Read, Write};
use std::str::FromStr;
use clap::Command; use clap::Command;
use clap::error::ErrorKind; use clap::error::ErrorKind;
@@ -10,10 +10,10 @@ use log::debug;
use rusqlite::Connection; use rusqlite::Connection;
use std::path::PathBuf; use std::path::PathBuf;
use crate::compression_engine::{CompressionType, get_compression_engine}; use crate::compression_engine::get_compression_engine;
use crate::db::{self}; use crate::db::{self};
use crate::digest_engine::{DigestType, get_digest_engine}; use crate::digest_engine::get_digest_engine;
use crate::modes::common::{get_meta_from_env, store_item_digest_value}; use crate::modes::common::{get_meta_from_env, store_item_digest_value, cmd_args_compression_type, cmd_args_digest_type};
use chrono::Utc; use chrono::Utc;
pub fn mode_save( pub fn mode_save(
@@ -36,35 +36,14 @@ pub fn mode_save(
tags.push("none".to_string()); tags.push("none".to_string());
} }
// Get the digest type to use let digest_type = cmd_args_digest_type(cmd, args);
let digest_name = args let compression_type = cmd_args_compression_type(cmd, args);
.item
.digest
.clone()
.unwrap_or(DigestType::Sha256.to_string());
let compression_name = args
.item
.compression
.unwrap_or(crate::compression_engine::default_compression_type().to_string());
use gethostname::gethostname;
use std::io::Write;
let compression_type_opt = CompressionType::from_str(&compression_name);
if compression_type_opt.is_err() {
cmd.error(
ErrorKind::InvalidValue,
format!("Unknown compression type: {}", compression_name),
)
.exit();
}
let compression_type = compression_type_opt.unwrap();
debug!("MAIN: Compression type: {}", compression_type); debug!("MAIN: Compression type: {}", compression_type);
debug!("MAIN: Digest type: {}", digest_type);
// Create a new digest engine
let digest_type = DigestType::from_str(&digest_name).unwrap_or(DigestType::Sha256);
let mut digest_engine = get_digest_engine(digest_type.clone()); let mut digest_engine = get_digest_engine(digest_type.clone());
let compression_engine =
get_compression_engine(compression_type.clone()).expect("Unable to get compression engine");
let mut item = db::Item { let mut item = db::Item {
id: None, id: None,
@@ -133,8 +112,6 @@ pub fn mode_save(
let mut stdout = io::stdout().lock(); let mut stdout = io::stdout().lock();
let mut buffer = [0; libc::BUFSIZ as usize]; let mut buffer = [0; libc::BUFSIZ as usize];
let compression_engine =
get_compression_engine(compression_type.clone()).expect("Unable to get compression engine");
let mut item_out: Box<dyn Write> = let mut item_out: Box<dyn Write> =
compression_engine compression_engine
.create(item_path.clone()) .create(item_path.clone())