From 91211e2523ada61c2abfac0c8fa453bd5a82751a Mon Sep 17 00:00:00 2001 From: Oguz Kocer Date: Tue, 21 May 2024 14:14:29 -0400 Subject: [PATCH] Implement SparseField trait and append_filter_fields UrlExtension --- wp_api/src/endpoint.rs | 16 ++++++++++++++++ wp_api/src/endpoint/plugins_endpoint.rs | 19 ++++--------------- wp_api/src/endpoint/users_endpoint.rs | 21 +++++---------------- wp_api/src/lib.rs | 4 ++++ wp_api/src/plugins.rs | 8 +++++--- wp_api/src/users.rs | 7 ++++--- 6 files changed, 38 insertions(+), 37 deletions(-) diff --git a/wp_api/src/endpoint.rs b/wp_api/src/endpoint.rs index abccdc1d1..fd52050f9 100644 --- a/wp_api/src/endpoint.rs +++ b/wp_api/src/endpoint.rs @@ -3,6 +3,8 @@ use url::Url; pub use plugins_endpoint::*; pub use users_endpoint::*; +use crate::SparseField; + mod plugins_endpoint; mod users_endpoint; @@ -72,6 +74,7 @@ trait UrlExtension { where I: IntoIterator, I::Item: AsRef; + fn append_filter_fields(self, fields: &[impl SparseField]) -> Url; } impl UrlExtension for Url { @@ -88,6 +91,19 @@ impl UrlExtension for Url { self.path_segments_mut()?.extend(segments); Ok(self) } + + fn append_filter_fields(mut self, fields: &[impl SparseField]) -> Url { + self.query_pairs_mut().append_pair( + "_fields", + fields + .iter() + .map(|f| f.as_str()) + .collect::>() + .join(",") + .as_str(), + ); + self + } } #[cfg(test)] diff --git a/wp_api/src/endpoint/plugins_endpoint.rs b/wp_api/src/endpoint/plugins_endpoint.rs index 3b727ae6d..d26ce0e77 100644 --- a/wp_api/src/endpoint/plugins_endpoint.rs +++ b/wp_api/src/endpoint/plugins_endpoint.rs @@ -2,6 +2,8 @@ use url::Url; use crate::{plugins::PluginListParams, ApiBaseUrl, PluginSlug, SparsePluginField, WPContext}; +use super::UrlExtension; + pub struct PluginsEndpoint { api_base_url: ApiBaseUrl, } @@ -35,7 +37,7 @@ impl PluginsEndpoint { params: Option<&PluginListParams>, fields: &[SparsePluginField], ) -> Url { - self.append_filter_fields(self.list(context, params), fields) + self.list(context, params).append_filter_fields(fields) } pub fn retrieve(&self, context: WPContext, plugin: &PluginSlug) -> Url { @@ -51,7 +53,7 @@ impl PluginsEndpoint { plugin: &PluginSlug, fields: &[SparsePluginField], ) -> Url { - self.append_filter_fields(self.retrieve(context, plugin), fields) + self.retrieve(context, plugin).append_filter_fields(fields) } pub fn update(&self, plugin: &PluginSlug) -> Url { @@ -67,19 +69,6 @@ impl PluginsEndpoint { // The '/' character has to be preserved and not get encoded .by_extending(["plugins"].into_iter().chain(plugin.slug.split('/'))) } - - fn append_filter_fields(&self, mut url: Url, fields: &[SparsePluginField]) -> Url { - url.query_pairs_mut().append_pair( - "_fields", - fields - .iter() - .map(|f| f.as_str()) - .collect::>() - .join(",") - .as_str(), - ); - url - } } #[cfg(test)] diff --git a/wp_api/src/endpoint/users_endpoint.rs b/wp_api/src/endpoint/users_endpoint.rs index bb508c9f9..fc0443651 100644 --- a/wp_api/src/endpoint/users_endpoint.rs +++ b/wp_api/src/endpoint/users_endpoint.rs @@ -2,6 +2,8 @@ use url::Url; use crate::{ApiBaseUrl, SparseUserField, UserDeleteParams, UserId, UserListParams, WPContext}; +use super::UrlExtension; + pub struct UsersEndpoint { api_base_url: ApiBaseUrl, } @@ -45,7 +47,7 @@ impl UsersEndpoint { params: Option<&UserListParams>, fields: &[SparseUserField], ) -> Url { - self.append_filter_fields(self.list(context, params), fields) + self.list(context, params).append_filter_fields(fields) } pub fn retrieve(&self, user_id: UserId, context: WPContext) -> Url { @@ -63,7 +65,7 @@ impl UsersEndpoint { context: WPContext, fields: &[SparseUserField], ) -> Url { - self.append_filter_fields(self.retrieve(user_id, context), fields) + self.retrieve(user_id, context).append_filter_fields(fields) } pub fn retrieve_me(&self, context: WPContext) -> Url { @@ -74,7 +76,7 @@ impl UsersEndpoint { } pub fn filter_retrieve_me(&self, context: WPContext, fields: &[SparseUserField]) -> Url { - self.append_filter_fields(self.retrieve_me(context), fields) + self.retrieve_me(context).append_filter_fields(fields) } pub fn update(&self, user_id: UserId) -> Url { @@ -85,19 +87,6 @@ impl UsersEndpoint { pub fn update_me(&self) -> Url { self.api_base_url.by_extending(["users", "me"]) } - - fn append_filter_fields(&self, mut url: Url, fields: &[SparseUserField]) -> Url { - url.query_pairs_mut().append_pair( - "_fields", - fields - .iter() - .map(|f| f.as_str()) - .collect::>() - .join(",") - .as_str(), - ); - url - } } #[cfg(test)] diff --git a/wp_api/src/lib.rs b/wp_api/src/lib.rs index c7e736d99..5425e9b43 100644 --- a/wp_api/src/lib.rs +++ b/wp_api/src/lib.rs @@ -534,6 +534,10 @@ pub fn get_link_header(response: &WPNetworkResponse, name: &str) -> Option &str; +} + #[macro_export] macro_rules! add_uniffi_exported_parser { ($fn_name:ident, $return_type: ty) => { diff --git a/wp_api/src/plugins.rs b/wp_api/src/plugins.rs index e636bb5f2..b71de24b5 100644 --- a/wp_api/src/plugins.rs +++ b/wp_api/src/plugins.rs @@ -1,7 +1,9 @@ use serde::{Deserialize, Serialize}; use wp_derive::WPContextual; -use crate::{add_uniffi_exported_parser, parse_wp_response, WPApiError, WPNetworkResponse}; +use crate::{ + add_uniffi_exported_parser, parse_wp_response, SparseField, WPApiError, WPNetworkResponse, +}; add_uniffi_exported_parser!(parse_filter_plugins_response, Vec); add_uniffi_exported_parser!(parse_filter_retrieve_plugin_response, SparsePlugin); @@ -109,8 +111,8 @@ pub enum SparsePluginField { Version, } -impl SparsePluginField { - pub fn as_str(&self) -> &str { +impl SparseField for SparsePluginField { + fn as_str(&self) -> &str { match self { Self::Author => "author", Self::Description => "description", diff --git a/wp_api/src/users.rs b/wp_api/src/users.rs index ac8874498..9309da7d3 100644 --- a/wp_api/src/users.rs +++ b/wp_api/src/users.rs @@ -4,7 +4,8 @@ use serde::{Deserialize, Serialize}; use wp_derive::WPContextual; use crate::{ - add_uniffi_exported_parser, parse_wp_response, WPApiError, WPApiParamOrder, WPNetworkResponse, + add_uniffi_exported_parser, parse_wp_response, SparseField, WPApiError, WPApiParamOrder, + WPNetworkResponse, }; add_uniffi_exported_parser!(parse_filter_users_response, Vec); @@ -394,8 +395,8 @@ pub enum SparseUserField { // meta field is omitted for now: https://github.com/Automattic/wordpress-rs/issues/57 } -impl SparseUserField { - pub fn as_str(&self) -> &str { +impl SparseField for SparseUserField { + fn as_str(&self) -> &str { match self { Self::Id => "id", Self::Username => "username",