refactor: deduplicate filter plugins, extract helpers across codebase
Bug fixes: - client: add error field to ApiResponse to avoid swallowing server errors - args/config: fix list_format default mismatch (5 vs 7 columns) - client: url-encode size param in set_item_size Dedup - filter plugins: - Extract count_option() and pattern_option() helpers, replace 7 identical options() - Add #[derive(Clone)] to all filter structs; remove verbose clone_box() impls - Simplify FilterChain clone() and impl Clone for Box<dyn FilterPlugin> - Add filter_clone_box! macro for future use - Fix doctest example missing clone_box Dedup - server API: - Extract spawn_body_reader() with LimitBehavior enum for body streaming - Extract check_binary_content() helper - Extract stream_with_offset_and_length() helper - Extract generate_status() helper in status.rs - Extract append_query_params() helper in client.rs Dedup - other: - Extract yaml_value_to_string() in meta_plugin/mod.rs - Extract item_from_row() in db.rs - Delete unused DisplayListItem struct Misc: - Remove duplicate doc comment in compression_service.rs
This commit is contained in:
@@ -35,6 +35,18 @@ fn url_encode(s: &str) -> String {
|
||||
result
|
||||
}
|
||||
|
||||
fn append_query_params(url: &mut String, params: &[(&str, &str)]) {
|
||||
if !params.is_empty() {
|
||||
url.push('?');
|
||||
for (i, (key, value)) in params.iter().enumerate() {
|
||||
if i > 0 {
|
||||
url.push('&');
|
||||
}
|
||||
url.push_str(&format!("{}={}", url_encode(key), url_encode(value)));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
pub struct KeepClient {
|
||||
base_url: String,
|
||||
agent: ureq::Agent,
|
||||
@@ -127,15 +139,7 @@ impl KeepClient {
|
||||
params: &[(&str, &str)],
|
||||
) -> Result<T, CoreError> {
|
||||
let mut url = self.url(path);
|
||||
if !params.is_empty() {
|
||||
url.push('?');
|
||||
for (i, (key, value)) in params.iter().enumerate() {
|
||||
if i > 0 {
|
||||
url.push('&');
|
||||
}
|
||||
url.push_str(&format!("{}={}", url_encode(key), url_encode(value)));
|
||||
}
|
||||
}
|
||||
append_query_params(&mut url, params);
|
||||
let mut req = self.agent.get(&url);
|
||||
if let Some(ref auth) = self.auth_header() {
|
||||
req = req.header("Authorization", auth);
|
||||
@@ -180,15 +184,7 @@ impl KeepClient {
|
||||
params: &[(&str, &str)],
|
||||
) -> Result<ItemInfo, CoreError> {
|
||||
let mut url = self.url(path);
|
||||
if !params.is_empty() {
|
||||
url.push('?');
|
||||
for (i, (key, value)) in params.iter().enumerate() {
|
||||
if i > 0 {
|
||||
url.push('&');
|
||||
}
|
||||
url.push_str(&format!("{}={}", url_encode(key), url_encode(value)));
|
||||
}
|
||||
}
|
||||
append_query_params(&mut url, params);
|
||||
|
||||
let mut req = self.agent.post(&url);
|
||||
if let Some(ref auth) = self.auth_header() {
|
||||
@@ -246,11 +242,17 @@ impl KeepClient {
|
||||
#[derive(serde::Deserialize)]
|
||||
struct ApiResponse {
|
||||
data: Option<ItemInfo>,
|
||||
error: Option<String>,
|
||||
}
|
||||
let response: ApiResponse = self.get_json(&format!("/api/item/{id}/info"))?;
|
||||
response
|
||||
.data
|
||||
.ok_or_else(|| CoreError::Other(anyhow::anyhow!("Item not found")))
|
||||
response.data.ok_or_else(|| {
|
||||
CoreError::Other(anyhow::anyhow!(
|
||||
"{}",
|
||||
response
|
||||
.error
|
||||
.unwrap_or_else(|| "Item not found".to_string())
|
||||
))
|
||||
})
|
||||
}
|
||||
|
||||
pub fn list_items(
|
||||
@@ -265,6 +267,7 @@ impl KeepClient {
|
||||
#[derive(serde::Deserialize)]
|
||||
struct ApiResponse {
|
||||
data: Option<Vec<ItemInfo>>,
|
||||
error: Option<String>,
|
||||
}
|
||||
|
||||
let mut params: Vec<(String, String)> = Vec::new();
|
||||
@@ -296,7 +299,13 @@ impl KeepClient {
|
||||
.collect();
|
||||
|
||||
let response: ApiResponse = self.get_json_with_query("/api/item/", ¶m_refs)?;
|
||||
Ok(response.data.unwrap_or_default())
|
||||
if let Some(data) = response.data {
|
||||
return Ok(data);
|
||||
}
|
||||
if let Some(err) = response.error {
|
||||
return Err(CoreError::Other(anyhow::anyhow!("Server error: {err}")));
|
||||
}
|
||||
Ok(Vec::new())
|
||||
}
|
||||
|
||||
pub fn save_item(
|
||||
@@ -358,7 +367,7 @@ impl KeepClient {
|
||||
let url = format!(
|
||||
"{}?uncompressed_size={}",
|
||||
self.url(&format!("/api/item/{id}/update")),
|
||||
size
|
||||
url_encode(&size.to_string())
|
||||
);
|
||||
let mut req = self.agent.post(&url);
|
||||
if let Some(ref auth) = self.auth_header() {
|
||||
@@ -446,15 +455,7 @@ impl KeepClient {
|
||||
.collect();
|
||||
|
||||
let mut url = self.url("/api/export");
|
||||
if !param_refs.is_empty() {
|
||||
url.push('?');
|
||||
for (i, (key, value)) in param_refs.iter().enumerate() {
|
||||
if i > 0 {
|
||||
url.push('&');
|
||||
}
|
||||
url.push_str(&format!("{}={}", url_encode(key), url_encode(value)));
|
||||
}
|
||||
}
|
||||
append_query_params(&mut url, ¶m_refs);
|
||||
|
||||
let mut req = self.agent.get(&url);
|
||||
if let Some(ref auth) = self.auth_header() {
|
||||
|
||||
Reference in New Issue
Block a user