From e9df852fb88ecfa0bd69e5a5386601f970d2e169 Mon Sep 17 00:00:00 2001 From: Joep Meindertsma Date: Fri, 7 Jun 2024 22:02:22 +0200 Subject: [PATCH] Add `atomic-cli search` command #778 --- CHANGELOG.md | 3 ++- cli/src/main.rs | 14 ++++++++++++-- cli/src/new.rs | 2 +- cli/src/search.rs | 30 ++++++++++++++++++++++++++++++ lib/src/client/search.rs | 4 +--- 5 files changed, 46 insertions(+), 7 deletions(-) create mode 100644 cli/src/search.rs diff --git a/CHANGELOG.md b/CHANGELOG.md index c7ae56aa1..0eb120e01 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,7 +8,8 @@ See [STATUS.md](server/STATUS.md) to learn more about which features will remain ## [v0.38.0] - UNRELEASED - Remove `process-management` feature #324 #334 -- Add `atomic_lib::client::search` for building queries +- Add `atomic_lib::client::search` for building queries #778 +- Add `atomic-cli search` command #778 - Migrate atomic_cli to use the derive API #890 ## [v0.37.0] - 2024-02-01 diff --git a/cli/src/main.rs b/cli/src/main.rs index 3a0ddaeec..756432f5c 100644 --- a/cli/src/main.rs +++ b/cli/src/main.rs @@ -11,6 +11,7 @@ mod commit; mod new; mod path; mod print; +mod search; #[derive(Parser)] #[command( @@ -92,6 +93,12 @@ enum Commands { #[arg(required = true)] subject: String, }, + /// Full text search + Search { + /// The search query + #[arg(required = true)] + query: String, + }, /// List all bookmarks List, /// Validates the store @@ -129,8 +136,8 @@ pub struct Context { } impl Context { - /// Sets an agent - pub fn get_write_context(&self) -> Config { + /// Returns the config (agent, key) from the user config dir + pub fn read_config(&self) -> Config { if let Some(write_ctx) = self.write.borrow().as_ref() { return write_ctx.clone(); }; @@ -250,6 +257,9 @@ fn exec_command(context: &mut Context) -> AtomicResult<()> { } => { commit::set(context, &subject, &property, &value)?; } + Commands::Search { query } => { + search::search(context, query)?; + } Commands::Validate => { validate(context); } diff --git a/cli/src/new.rs b/cli/src/new.rs index 7aea49788..70f8bf7d5 100644 --- a/cli/src/new.rs +++ b/cli/src/new.rs @@ -45,7 +45,7 @@ fn prompt_instance( // I think URL generation could be better, though. Perhaps use a let path = SystemTime::now().duration_since(UNIX_EPOCH)?.subsec_nanos(); - let write_ctx = context.get_write_context(); + let write_ctx = context.read_config(); let mut subject = format!("{}/{}", write_ctx.server, path); if let Some(sn) = &preferred_shortname { diff --git a/cli/src/search.rs b/cli/src/search.rs new file mode 100644 index 000000000..b8c774093 --- /dev/null +++ b/cli/src/search.rs @@ -0,0 +1,30 @@ +use atomic_lib::{errors::AtomicResult, urls, Storelike}; + +pub fn search(context: &crate::Context, query: String) -> AtomicResult<()> { + let opts = atomic_lib::client::search::SearchOpts { + limit: Some(10), + include: Some(true), + ..Default::default() + }; + let subject = atomic_lib::client::search::build_search_subject( + &context.read_config().server, + &query, + opts, + ); + let resource = context.store.get_resource(&subject)?; + let members = resource + .get(urls::ENDPOINT_RESULTS) + .expect("No members?") + .to_subjects(None) + .unwrap(); + if members.is_empty() { + println!("No results found."); + println!("URL: {}", subject); + return Ok(()); + } else { + for member in members { + println!("{}", member); + } + } + Ok(()) +} diff --git a/lib/src/client/search.rs b/lib/src/client/search.rs index a55c4e1ea..598b63fdd 100644 --- a/lib/src/client/search.rs +++ b/lib/src/client/search.rs @@ -60,9 +60,7 @@ fn build_filter_string(filters: &HashMap) -> String { pub fn build_search_subject(server_url: &str, query: &str, opts: SearchOpts) -> String { let mut url = base_url(server_url); - if let Some(q) = query.strip_prefix("q=") { - url.query_pairs_mut().append_pair("q", q); - } + url.query_pairs_mut().append_pair("q", query); if let Some(include) = opts.include { url.query_pairs_mut() .append_pair("include", &include.to_string());