From 157edbe1ca0086cf9f80faed87cb8df806ed75ba Mon Sep 17 00:00:00 2001 From: Byson94 Date: Fri, 22 Aug 2025 19:53:15 +0530 Subject: [PATCH] feat: added search command with --log-metadata (or -l) flag --- CHANGELOG.md | 13 ++++++----- src/functions/install.rs | 24 ++++++++------------ src/functions/mod.rs | 13 +++++++++++ src/functions/search.rs | 47 ++++++++++++++++++++++++++++++++++++++++ src/functions/update.rs | 5 +---- src/main.rs | 6 +++++ src/opts.rs | 19 +++++++++++++++- 7 files changed, 101 insertions(+), 26 deletions(-) create mode 100644 src/functions/search.rs diff --git a/CHANGELOG.md b/CHANGELOG.md index 1d90a85..63dfd7c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -10,6 +10,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/). ### Added - Support for unix glob patterns in files key (toml). +- **Search** command with `--log-metadata` (or `-l`) flag. ### Changed @@ -32,11 +33,11 @@ and this project adheres to [Semantic Versioning](https://semver.org/). ### Added -- **install** flag -- **uninstall** flag -- **update** flag -- **list** flag -- **clear-cache** flag -- **check-update** flag +- **install** command +- **uninstall** command +- **update** command +- **list** command +- **clear-cache** command +- **check-update** command - **[git2](https://docs.rs/git2/latest/git2/)** based version control - **Eiipm** not in path warning diff --git a/src/functions/install.rs b/src/functions/install.rs index e768368..67f867b 100644 --- a/src/functions/install.rs +++ b/src/functions/install.rs @@ -1,13 +1,18 @@ use colored::{Colorize}; use dirs; -use log::{debug, info, trace}; -use reqwest::blocking::get; +use log::{info, trace}; use serde::{Deserialize}; use std::env; use std::error::Error; use std::fs; use std::process::Command; -use super::{FileEntry, InstalledPackage, save_db, load_db}; +use super::{ + FileEntry, + InstalledPackage, + save_db, + load_db, + http_get_string +}; use glob::glob; use crate::git::{ @@ -112,10 +117,7 @@ pub fn install_package(package_name: &str) -> Result<(), Box> { .map(|src_path| { let tgt = match dest { Some(d) => target_base_dir.join(d), - None => target_base_dir.join( - src_path.file_name() - .expect("Invalid file name"), - ), + None => target_base_dir.join(src) }; (src_path, tgt) }) @@ -154,11 +156,3 @@ pub fn install_package(package_name: &str) -> Result<(), Box> { Ok(()) } -fn http_get_string(url: &str) -> Result> { - debug!("Sending GET request to {}", url); - let response = get(url)?; - if !response.status().is_success() { - return Err(format!("Failed to fetch URL {}: HTTP {}", url, response.status()).into()); - } - Ok(response.text()?) -} diff --git a/src/functions/mod.rs b/src/functions/mod.rs index ed02f1b..a185017 100644 --- a/src/functions/mod.rs +++ b/src/functions/mod.rs @@ -6,12 +6,14 @@ pub mod clearcache; pub mod checkupdate; pub mod listcache; pub mod purgecache; +pub mod search; use std::fs; use std::error::Error; use serde::{Deserialize, Serialize}; use std::collections::HashMap; use dirs; +use reqwest::blocking::get; pub const DB_FILE: &str = ".local/share/eiipm/installed.toml"; @@ -68,3 +70,14 @@ pub fn save_db(db: &PackageDB) -> Result<(), Box> { fs::write(db_path, content)?; Ok(()) } + +// Sending requests to url's +pub fn http_get_string(url: &str) -> Result> { + log::debug!("Sending GET request to {}", url); + let response = get(url)?; + if !response.status().is_success() { + return Err(format!("Failed to fetch URL {}: HTTP {}", url, response.status()).into()); + } + Ok(response.text()?) +} + diff --git a/src/functions/search.rs b/src/functions/search.rs new file mode 100644 index 0000000..0f7dcaa --- /dev/null +++ b/src/functions/search.rs @@ -0,0 +1,47 @@ +use super::http_get_string; +use log::info; +use std::error::Error; +use colored::Colorize; +use crate::opts::SearchArgs; + +pub fn search_package( + package_name: &str, + flags: SearchArgs +) -> Result<(), Box> { + info!("> Searching for '{}'", package_name.yellow().bold()); + + let raw_manifest_url = format!( + "https://raw.githubusercontent.com/Ewwii-sh/eii-manifests/main/manifests/{}.toml", + package_name + ); + + if let Ok(response) = http_get_string(&raw_manifest_url) { + info!("{}", format!( + "\nPackage with name '{}' is found in eii-manifests!", + package_name + ).green()); + + if flags.log_metadata { + info!("{}", format!( + "\n--- Metadata for '{}' ---\n{}", + package_name.cyan().bold(), + indent_lines(&response, 4) + )); + } + } else { + info!("{}", format!( + "Package '{}' not found.", + package_name.red().bold() + )); + } + + Ok(()) +} + +fn indent_lines(s: &str, spaces: usize) -> String { + let padding = " ".repeat(spaces); + s.lines() + .map(|line| format!("{}{}", padding, line)) + .collect::>() + .join("\n") +} diff --git a/src/functions/update.rs b/src/functions/update.rs index e84f694..4e2e9f1 100644 --- a/src/functions/update.rs +++ b/src/functions/update.rs @@ -137,10 +137,7 @@ fn update_file(pkg: &mut InstalledPackage, package_name: &str) -> Result<(), Box .map(|src_path| { let tgt = match dest { Some(d) => target_base_dir.join(d), - None => target_base_dir.join( - src_path.file_name() - .expect("Invalid file name"), - ), + None => target_base_dir.join(src) }; (src_path, tgt) }) diff --git a/src/main.rs b/src/main.rs index 6d91c0e..50b7f2c 100644 --- a/src/main.rs +++ b/src/main.rs @@ -13,6 +13,7 @@ use functions::{ checkupdate::check_package_updates, listcache::list_all_cache, purgecache::purge_cache, + search::search_package, }; use other::{ confirm_action::confirm, @@ -110,6 +111,11 @@ fn main() { error!("Error purging cache: {}", e); } } + Commands::Search { package, flags } => { + if let Err(e) = search_package(&package, flags) { + error!("Error searching for '{}'. Error: {}", package, e); + } + } } check_eiipm_in_path(); diff --git a/src/opts.rs b/src/opts.rs index dc0b474..5968acf 100644 --- a/src/opts.rs +++ b/src/opts.rs @@ -64,6 +64,16 @@ pub enum Commands { /// Remove all broken/orphaned packages #[command(alias = "pc")] PurgeCache, + + /// Search for a package in eii-manifests + #[command(alias = "s")] + Search { + /// Name of the package to search for + package: String, + + #[command(flatten)] + flags: SearchArgs + }, } #[derive(Args, Debug)] @@ -86,4 +96,11 @@ pub struct ClearCacheArgs { /// Bypass all confirmation #[arg(long, short)] pub force: bool, -} \ No newline at end of file +} + +#[derive(Args, Debug)] +pub struct SearchArgs { + /// Log the metadata of the searched file + #[arg(long, short)] + pub log_metadata: bool, +}