From 956b1685d1b6cadea5cb98ed1dd69fd3d61f19d3 Mon Sep 17 00:00:00 2001 From: Oguz Kocer Date: Fri, 21 Jun 2024 11:29:41 -0400 Subject: [PATCH 1/8] Remove the '2' suffix from the generated request builder type --- wp_api/src/lib.rs | 18 +++++++++--------- wp_derive_request_builder/src/generate.rs | 4 +--- 2 files changed, 10 insertions(+), 12 deletions(-) diff --git a/wp_api/src/lib.rs b/wp_api/src/lib.rs index 358041f83..92cb0cc79 100644 --- a/wp_api/src/lib.rs +++ b/wp_api/src/lib.rs @@ -3,10 +3,10 @@ use request::{ endpoint::{ application_passwords_endpoint::{ - ApplicationPasswordsRequestBuilder2, ApplicationPasswordsRequestExecutor, + ApplicationPasswordsRequestBuilder, ApplicationPasswordsRequestExecutor, }, - plugins_endpoint::{PluginsRequestBuilder2, PluginsRequestExecutor}, - users_endpoint::{UsersRequestBuilder2, UsersRequestExecutor}, + plugins_endpoint::{PluginsRequestBuilder, PluginsRequestExecutor}, + users_endpoint::{UsersRequestBuilder, UsersRequestExecutor}, ApiBaseUrl, }, RequestExecutor, WpNetworkResponse, @@ -36,7 +36,7 @@ mod unit_test_common; // properly generated and utilized in `test_manual_request_builder_immut` integration tests #[derive(Debug, uniffi::Object)] pub struct WpApiRequestBuilder { - users: Arc, + users: Arc, } #[uniffi::export] @@ -58,11 +58,11 @@ impl WpApiRequestBuilder { )); Ok(Self { - users: UsersRequestBuilder2::new(api_base_url.clone(), request_builder.clone()).into(), + users: UsersRequestBuilder::new(api_base_url.clone(), request_builder.clone()).into(), }) } - pub fn users(&self) -> Arc { + pub fn users(&self) -> Arc { self.users.clone() } } @@ -94,7 +94,7 @@ impl WpRequestBuilder { Ok(Self { application_passwords: ApplicationPasswordsRequestExecutor::new( - ApplicationPasswordsRequestBuilder2::new( + ApplicationPasswordsRequestBuilder::new( api_base_url.clone(), request_builder.clone(), ), @@ -102,12 +102,12 @@ impl WpRequestBuilder { ) .into(), users: UsersRequestExecutor::new( - UsersRequestBuilder2::new(api_base_url.clone(), request_builder.clone()), + UsersRequestBuilder::new(api_base_url.clone(), request_builder.clone()), request_executor.clone(), ) .into(), plugins: PluginsRequestExecutor::new( - PluginsRequestBuilder2::new(api_base_url.clone(), request_builder.clone()), + PluginsRequestBuilder::new(api_base_url.clone(), request_builder.clone()), request_executor.clone(), ) .into(), diff --git a/wp_derive_request_builder/src/generate.rs b/wp_derive_request_builder/src/generate.rs index 69d11464d..bf3ada7bb 100644 --- a/wp_derive_request_builder/src/generate.rs +++ b/wp_derive_request_builder/src/generate.rs @@ -301,9 +301,7 @@ impl Config { api_endpoint_url_type, crate_ident, endpoint_ident: format_ident!("{}Endpoint", parsed_enum.enum_ident), - // TODO: We use `2` suffix here to prevent the name clash with the current - // implementation - request_builder_ident: format_ident!("{}Builder2", parsed_enum.enum_ident), + request_builder_ident: format_ident!("{}Builder", parsed_enum.enum_ident), request_builder_type, request_executor_ident: format_ident!("{}Executor", parsed_enum.enum_ident), request_executor_type, From 0c0fde88b42f3287f776638db4436b9ce3f03ba0 Mon Sep 17 00:00:00 2001 From: Oguz Kocer Date: Fri, 21 Jun 2024 11:40:07 -0400 Subject: [PATCH 2/8] Simplify and rename RequestBuilder to InnerRequestBuilder --- wp_api/src/lib.rs | 23 +++------ wp_api/src/request.rs | 50 ++++--------------- .../test_manual_request_builder_immut.rs | 14 ++---- wp_derive_request_builder/src/generate.rs | 15 +++--- .../generate/helpers_to_generate_tokens.rs | 20 ++++---- 5 files changed, 38 insertions(+), 84 deletions(-) diff --git a/wp_api/src/lib.rs b/wp_api/src/lib.rs index 92cb0cc79..791b37281 100644 --- a/wp_api/src/lib.rs +++ b/wp_api/src/lib.rs @@ -42,20 +42,13 @@ pub struct WpApiRequestBuilder { #[uniffi::export] impl WpApiRequestBuilder { #[uniffi::constructor] - pub fn new( - site_url: String, - authentication: WpAuthentication, - request_executor: Arc, - ) -> Result { + pub fn new(site_url: String, authentication: WpAuthentication) -> Result { let api_base_url: Arc = ApiBaseUrl::try_from(site_url.as_str()) .map_err(|err| WpApiError::SiteUrlParsingError { reason: err.to_string(), })? .into(); - let request_builder = Arc::new(request::RequestBuilder::new( - request_executor, - authentication.clone(), - )); + let request_builder = Arc::new(request::InnerRequestBuilder::new(authentication.clone())); Ok(Self { users: UsersRequestBuilder::new(api_base_url.clone(), request_builder.clone()).into(), @@ -87,27 +80,25 @@ impl WpRequestBuilder { reason: err.to_string(), })? .into(); - let request_builder = Arc::new(request::RequestBuilder::new( - request_executor.clone(), - authentication.clone(), - )); + let inner_request_builder = + Arc::new(request::InnerRequestBuilder::new(authentication.clone())); Ok(Self { application_passwords: ApplicationPasswordsRequestExecutor::new( ApplicationPasswordsRequestBuilder::new( api_base_url.clone(), - request_builder.clone(), + inner_request_builder.clone(), ), request_executor.clone(), ) .into(), users: UsersRequestExecutor::new( - UsersRequestBuilder::new(api_base_url.clone(), request_builder.clone()), + UsersRequestBuilder::new(api_base_url.clone(), inner_request_builder.clone()), request_executor.clone(), ) .into(), plugins: PluginsRequestExecutor::new( - PluginsRequestBuilder::new(api_base_url.clone(), request_builder.clone()), + PluginsRequestBuilder::new(api_base_url.clone(), inner_request_builder.clone()), request_executor.clone(), ) .into(), diff --git a/wp_api/src/request.rs b/wp_api/src/request.rs index 5adadd43b..0488766a7 100644 --- a/wp_api/src/request.rs +++ b/wp_api/src/request.rs @@ -1,7 +1,7 @@ -use std::{collections::HashMap, fmt::Debug, sync::Arc}; +use std::{collections::HashMap, fmt::Debug}; use endpoint::ApiEndpointUrl; -use serde::{de::DeserializeOwned, Deserialize, Serialize}; +use serde::{Deserialize, Serialize}; use url::Url; use crate::{api_error::RequestExecutionError, WpApiError, WpAuthentication}; @@ -14,23 +14,16 @@ const CONTENT_TYPE_JSON: &str = "application/json"; const LINK_HEADER_KEY: &str = "Link"; #[derive(Debug)] -pub(crate) struct RequestBuilder { - executor: Arc, +pub(crate) struct InnerRequestBuilder { authentication: WpAuthentication, } -impl RequestBuilder { - pub(crate) fn new( - executor: Arc, - authentication: WpAuthentication, - ) -> Self { - Self { - executor, - authentication, - } +impl InnerRequestBuilder { + pub(crate) fn new(authentication: WpAuthentication) -> Self { + Self { authentication } } - fn build_get_request(&self, url: ApiEndpointUrl) -> WpNetworkRequest { + fn get(&self, url: ApiEndpointUrl) -> WpNetworkRequest { WpNetworkRequest { method: RequestMethod::GET, url: url.into(), @@ -39,14 +32,7 @@ impl RequestBuilder { } } - async fn get(&self, url: ApiEndpointUrl) -> Result { - self.executor - .execute(self.build_get_request(url)) - .await? - .parse() - } - - fn build_post_request(&self, url: ApiEndpointUrl, json_body: &T) -> WpNetworkRequest + fn post(&self, url: ApiEndpointUrl, json_body: &T) -> WpNetworkRequest where T: ?Sized + Serialize, { @@ -58,18 +44,7 @@ impl RequestBuilder { } } - async fn post(&self, url: ApiEndpointUrl, json_body: &T) -> Result - where - T: ?Sized + Serialize, - R: DeserializeOwned, - { - self.executor - .execute(self.build_post_request(url, json_body)) - .await? - .parse() - } - - fn build_delete_request(&self, url: ApiEndpointUrl) -> WpNetworkRequest { + fn delete(&self, url: ApiEndpointUrl) -> WpNetworkRequest { WpNetworkRequest { method: RequestMethod::DELETE, url: url.into(), @@ -78,13 +53,6 @@ impl RequestBuilder { } } - async fn delete(&self, url: ApiEndpointUrl) -> Result { - self.executor - .execute(self.build_delete_request(url)) - .await? - .parse() - } - fn header_map(&self) -> HashMap { let mut header_map = HashMap::new(); header_map.insert( diff --git a/wp_api/tests/test_manual_request_builder_immut.rs b/wp_api/tests/test_manual_request_builder_immut.rs index ecca5d5ad..8867ab94c 100644 --- a/wp_api/tests/test_manual_request_builder_immut.rs +++ b/wp_api/tests/test_manual_request_builder_immut.rs @@ -5,7 +5,6 @@ use integration_test_common::{ use reusable_test_cases::list_users_cases; use rstest::*; use rstest_reuse::{self, apply}; -use std::sync::Arc; use wp_api::{ generate, users::UserWithEditContext, @@ -26,16 +25,11 @@ async fn list_users_with_edit_context(#[case] params: UserListParams) { TEST_CREDENTIALS_ADMIN_USERNAME.to_string(), TEST_CREDENTIALS_ADMIN_PASSWORD.to_string(), ); - let async_wp_networking = Arc::new(AsyncWpNetworking::default()); + let async_wp_networking = AsyncWpNetworking::default(); - let request_builder = WpApiRequestBuilder::new( - TEST_CREDENTIALS_SITE_URL.to_string(), - authentication, - // TODO: A request executor shouldn't be necessary, but we don't have a standalone request - // builder yet - async_wp_networking.clone(), - ) - .expect("Site url is generated by our tooling"); + let request_builder = + WpApiRequestBuilder::new(TEST_CREDENTIALS_SITE_URL.to_string(), authentication) + .expect("Site url is generated by our tooling"); let wp_request = request_builder.users().list_with_edit_context(¶ms); let response = async_wp_networking.async_request(wp_request).await; let result = response.unwrap().parse::>(); diff --git a/wp_derive_request_builder/src/generate.rs b/wp_derive_request_builder/src/generate.rs index bf3ada7bb..9f5c39d90 100644 --- a/wp_derive_request_builder/src/generate.rs +++ b/wp_derive_request_builder/src/generate.rs @@ -94,7 +94,7 @@ fn generate_request_builder(config: &Config, parsed_enum: &ParsedEnum) -> TokenS let api_base_url_type = &config.api_base_url_type; let endpoint_ident = &config.endpoint_ident; let request_builder_ident = &config.request_builder_ident; - let request_builder_type = &config.request_builder_type; + let inner_request_builder_type = &config.inner_request_builder_type; let wp_network_request_type = &config.wp_network_request_type; let functions = parsed_enum.variants.iter().map(|variant| { @@ -136,13 +136,13 @@ fn generate_request_builder(config: &Config, parsed_enum: &ParsedEnum) -> TokenS #[derive(Debug, uniffi::Object)] pub struct #request_builder_ident { endpoint: #endpoint_ident, - request_builder: #request_builder_type, + inner: #inner_request_builder_type, } impl #request_builder_ident { - pub(crate) fn new(api_base_url: #api_base_url_type, request_builder: #request_builder_type) -> Self { + pub(crate) fn new(api_base_url: #api_base_url_type, inner_request_builder: #inner_request_builder_type) -> Self { Self { endpoint: #endpoint_ident::new(api_base_url), - request_builder, + inner: inner_request_builder, } } } @@ -270,7 +270,7 @@ pub struct Config { pub crate_ident: Ident, pub endpoint_ident: Ident, pub request_builder_ident: Ident, - pub request_builder_type: TokenStream, + pub inner_request_builder_type: TokenStream, pub request_executor_ident: Ident, pub request_executor_type: TokenStream, pub sparse_field_type: SparseFieldAttr, @@ -291,7 +291,8 @@ impl Config { let api_base_url_type = quote! { std::sync::Arc<#crate_ident::request::endpoint::ApiBaseUrl> }; let api_endpoint_url_type = quote! { #crate_ident::request::endpoint::ApiEndpointUrl }; - let request_builder_type = quote! { std::sync::Arc<#crate_ident::request::RequestBuilder> }; + let inner_request_builder_type = + quote! { std::sync::Arc<#crate_ident::request::InnerRequestBuilder> }; let request_executor_type = quote! { std::sync::Arc }; let wp_api_error_type = quote! { #crate_ident::WpApiError }; @@ -302,7 +303,7 @@ impl Config { crate_ident, endpoint_ident: format_ident!("{}Endpoint", parsed_enum.enum_ident), request_builder_ident: format_ident!("{}Builder", parsed_enum.enum_ident), - request_builder_type, + inner_request_builder_type, request_executor_ident: format_ident!("{}Executor", parsed_enum.enum_ident), request_executor_type, sparse_field_type: parsed_enum.sparse_field_attr.clone(), diff --git a/wp_derive_request_builder/src/generate/helpers_to_generate_tokens.rs b/wp_derive_request_builder/src/generate/helpers_to_generate_tokens.rs index b891c4d25..585adef96 100644 --- a/wp_derive_request_builder/src/generate/helpers_to_generate_tokens.rs +++ b/wp_derive_request_builder/src/generate/helpers_to_generate_tokens.rs @@ -337,19 +337,19 @@ pub fn fn_body_build_request_from_url( ) -> TokenStream { match request_type { RequestType::ContextualGet => quote! { - self.request_builder.build_get_request(url) + self.inner.get(url) }, RequestType::Delete => quote! { - self.request_builder.build_delete_request(url) + self.inner.delete(url) }, RequestType::Post => { if params_type.tokens().is_some() { quote! { - self.request_builder.build_post_request(url, params) + self.inner.post(url, params) } } else { quote! { - self.request_builder.build_post_request(url) + self.inner.post(url) } } } @@ -1019,23 +1019,23 @@ mod tests { } #[rstest] - #[case(&ParamsType::new(None), RequestType::ContextualGet, "self . request_builder . build_get_request (url)")] + #[case(&ParamsType::new(None), RequestType::ContextualGet, "self . inner . get (url)")] #[case( &referenced_params_type("UserListParams"), RequestType::ContextualGet, - "self . request_builder . build_get_request (url)" + "self . inner . get (url)" )] - #[case(&ParamsType::new(None), RequestType::Delete, "self . request_builder . build_delete_request (url)")] + #[case(&ParamsType::new(None), RequestType::Delete, "self . inner . delete (url)")] #[case( &referenced_params_type("UserListParams"), RequestType::Delete, - "self . request_builder . build_delete_request (url)" + "self . inner . delete (url)" )] - #[case(&ParamsType::new(None), RequestType::Post, "self . request_builder . build_post_request (url)")] + #[case(&ParamsType::new(None), RequestType::Post, "self . inner . post (url)")] #[case( &referenced_params_type("UserListParams"), RequestType::Post, - "self . request_builder . build_post_request (url , params)" + "self . inner . post (url , params)" )] fn test_fn_body_build_request_from_url( #[case] params: &ParamsType, From 49c484b4b4ad5c422c438aa5c608680145b904f8 Mon Sep 17 00:00:00 2001 From: Oguz Kocer Date: Fri, 21 Jun 2024 11:54:19 -0400 Subject: [PATCH 3/8] Introduce ConfigStaticTypes for WpDerivedRequest impl --- fastlane/Fastfile | 1 - wp_derive_request_builder/src/generate.rs | 82 ++++++++++++----------- 2 files changed, 44 insertions(+), 39 deletions(-) diff --git a/fastlane/Fastfile b/fastlane/Fastfile index cc7da943e..c64c3401c 100644 --- a/fastlane/Fastfile +++ b/fastlane/Fastfile @@ -21,7 +21,6 @@ lane :release do |options| build_xcframework update_swift_package publish_github_release - # TODO: publish android library end lane :validate do diff --git a/wp_derive_request_builder/src/generate.rs b/wp_derive_request_builder/src/generate.rs index 9f5c39d90..4fa395a52 100644 --- a/wp_derive_request_builder/src/generate.rs +++ b/wp_derive_request_builder/src/generate.rs @@ -28,11 +28,11 @@ pub(crate) fn generate_types(parsed_enum: &ParsedEnum) -> TokenStream { } fn generate_async_request_executor(config: &Config, parsed_enum: &ParsedEnum) -> TokenStream { - let api_base_url_type = &config.api_base_url_type; + let static_api_base_url_type = &config.static_types.api_base_url; + let static_request_executor_type = &config.static_types.request_executor; + let static_wp_api_error_type = &config.static_types.wp_api_error; let request_builder_ident = &config.request_builder_ident; let request_executor_ident = &config.request_executor_ident; - let request_executor_type = &config.request_executor_type; - let wp_api_error_type = &config.wp_api_error_type; let functions = parsed_enum.variants.iter().map(|variant| { let url_parts = variant.attr.url_parts.as_slice(); @@ -60,7 +60,7 @@ fn generate_async_request_executor(config: &Config, parsed_enum: &ParsedEnum) -> &config.sparse_field_type, ); quote! { - pub async #fn_signature -> Result<#output_type, #wp_api_error_type> { + pub async #fn_signature -> Result<#output_type, #static_wp_api_error_type> { #request_from_request_builder self.request_executor.execute(request).await?.parse() } @@ -73,10 +73,10 @@ fn generate_async_request_executor(config: &Config, parsed_enum: &ParsedEnum) -> #[derive(Debug, uniffi::Object)] pub struct #request_executor_ident { request_builder: #request_builder_ident, - request_executor: #request_executor_type, + request_executor: #static_request_executor_type, } impl #request_executor_ident { - pub(crate) fn new(request_builder: #request_builder_ident, request_executor: #request_executor_type) -> Self { + pub(crate) fn new(request_builder: #request_builder_ident, request_executor: #static_request_executor_type) -> Self { Self { request_builder, request_executor, @@ -91,11 +91,11 @@ fn generate_async_request_executor(config: &Config, parsed_enum: &ParsedEnum) -> } fn generate_request_builder(config: &Config, parsed_enum: &ParsedEnum) -> TokenStream { - let api_base_url_type = &config.api_base_url_type; + let static_api_base_url_type = &config.static_types.api_base_url; + let static_inner_request_builder_type = &config.static_types.inner_request_builder; + let static_wp_network_request_type = &config.static_types.wp_network_request; let endpoint_ident = &config.endpoint_ident; let request_builder_ident = &config.request_builder_ident; - let inner_request_builder_type = &config.inner_request_builder_type; - let wp_network_request_type = &config.wp_network_request_type; let functions = parsed_enum.variants.iter().map(|variant| { let url_parts = variant.attr.url_parts.as_slice(); @@ -123,7 +123,7 @@ fn generate_request_builder(config: &Config, parsed_enum: &ParsedEnum) -> TokenS let fn_body_build_request_from_url = fn_body_build_request_from_url(params_type, variant.attr.request_type); quote! { - pub #fn_signature -> #wp_network_request_type { + pub #fn_signature -> #static_wp_network_request_type { #url_from_endpoint #fn_body_build_request_from_url } @@ -136,10 +136,10 @@ fn generate_request_builder(config: &Config, parsed_enum: &ParsedEnum) -> TokenS #[derive(Debug, uniffi::Object)] pub struct #request_builder_ident { endpoint: #endpoint_ident, - inner: #inner_request_builder_type, + inner: #static_inner_request_builder_type, } impl #request_builder_ident { - pub(crate) fn new(api_base_url: #api_base_url_type, inner_request_builder: #inner_request_builder_type) -> Self { + pub(crate) fn new(api_base_url: #static_api_base_url_type, inner_request_builder: #static_inner_request_builder_type) -> Self { Self { endpoint: #endpoint_ident::new(api_base_url), inner: inner_request_builder, @@ -154,7 +154,8 @@ fn generate_request_builder(config: &Config, parsed_enum: &ParsedEnum) -> TokenS } fn generate_endpoint_type(config: &Config, parsed_enum: &ParsedEnum) -> TokenStream { - let api_base_url_type = &config.api_base_url_type; + let static_api_base_url_type = &config.static_types.api_base_url; + let static_api_endpoint_url_type = &config.static_types.api_endpoint_url; let endpoint_ident = &config.endpoint_ident; let functions = parsed_enum.variants.iter().map(|variant| { @@ -178,11 +179,10 @@ fn generate_endpoint_type(config: &Config, parsed_enum: &ParsedEnum) -> TokenStr ); let context_query_pair = fn_body_context_query_pairs(&config.crate_ident, context_and_filter_handler); - let api_endpoint_url_type = &config.api_endpoint_url_type; let fields_query_pairs = fn_body_fields_query_pairs(&config.crate_ident, context_and_filter_handler); quote! { - pub #fn_signature -> #api_endpoint_url_type { + pub #fn_signature -> #static_api_endpoint_url_type { #url_from_api_base_url #context_query_pair #query_pairs @@ -197,11 +197,11 @@ fn generate_endpoint_type(config: &Config, parsed_enum: &ParsedEnum) -> TokenStr quote! { #[derive(Debug)] pub struct #endpoint_ident { - api_base_url: #api_base_url_type, + api_base_url: #static_api_base_url_type, } impl #endpoint_ident { - pub fn new(api_base_url: #api_base_url_type) -> Self { + pub fn new(api_base_url: #static_api_base_url_type) -> Self { Self { api_base_url } } @@ -265,17 +265,12 @@ impl Display for WpContext { pub struct Config { // TODO: It's not clear what some of the names refer to and the difference between them // For example, with "request_builder_ident" & "request_builder_type" - pub api_base_url_type: TokenStream, - pub api_endpoint_url_type: TokenStream, pub crate_ident: Ident, pub endpoint_ident: Ident, pub request_builder_ident: Ident, - pub inner_request_builder_type: TokenStream, pub request_executor_ident: Ident, - pub request_executor_type: TokenStream, pub sparse_field_type: SparseFieldAttr, - pub wp_api_error_type: TokenStream, - pub wp_network_request_type: TokenStream, + pub static_types: ConfigStaticTypes, } impl Config { @@ -288,27 +283,38 @@ impl Config { FoundCrate::Itself => format_ident!("crate"), FoundCrate::Name(name) => Ident::new(&name, Span::call_site()), }; - let api_base_url_type = - quote! { std::sync::Arc<#crate_ident::request::endpoint::ApiBaseUrl> }; - let api_endpoint_url_type = quote! { #crate_ident::request::endpoint::ApiEndpointUrl }; - let inner_request_builder_type = - quote! { std::sync::Arc<#crate_ident::request::InnerRequestBuilder> }; - let request_executor_type = - quote! { std::sync::Arc }; - let wp_api_error_type = quote! { #crate_ident::WpApiError }; - let wp_network_request_type = quote! { #crate_ident::request::WpNetworkRequest }; + let static_types = ConfigStaticTypes::new(&crate_ident); + Self { - api_base_url_type, - api_endpoint_url_type, crate_ident, endpoint_ident: format_ident!("{}Endpoint", parsed_enum.enum_ident), request_builder_ident: format_ident!("{}Builder", parsed_enum.enum_ident), - inner_request_builder_type, request_executor_ident: format_ident!("{}Executor", parsed_enum.enum_ident), - request_executor_type, sparse_field_type: parsed_enum.sparse_field_attr.clone(), - wp_api_error_type, - wp_network_request_type, + static_types, + } + } +} + +#[derive(Debug)] +pub struct ConfigStaticTypes { + pub api_base_url: TokenStream, + pub api_endpoint_url: TokenStream, + pub inner_request_builder: TokenStream, + pub request_executor: TokenStream, + pub wp_api_error: TokenStream, + pub wp_network_request: TokenStream, +} + +impl ConfigStaticTypes { + fn new(crate_ident: &Ident) -> Self { + Self { + api_base_url: quote! { std::sync::Arc<#crate_ident::request::endpoint::ApiBaseUrl> }, + api_endpoint_url: quote! { #crate_ident::request::endpoint::ApiEndpointUrl }, + inner_request_builder: quote! { std::sync::Arc<#crate_ident::request::InnerRequestBuilder> }, + request_executor: quote! { std::sync::Arc }, + wp_api_error: quote! { #crate_ident::WpApiError }, + wp_network_request: quote! { #crate_ident::request::WpNetworkRequest }, } } } From 08f94a76f9dee777cc5e5e5a0588db5b9267a9d3 Mon Sep 17 00:00:00 2001 From: Oguz Kocer Date: Fri, 21 Jun 2024 12:00:08 -0400 Subject: [PATCH 4/8] Introduce ConfigGeneratedIdents for WpDerivedRequest impl --- wp_derive_request_builder/src/generate.rs | 62 ++++++++++++++--------- 1 file changed, 37 insertions(+), 25 deletions(-) diff --git a/wp_derive_request_builder/src/generate.rs b/wp_derive_request_builder/src/generate.rs index 4fa395a52..d8c45a5b0 100644 --- a/wp_derive_request_builder/src/generate.rs +++ b/wp_derive_request_builder/src/generate.rs @@ -31,8 +31,8 @@ fn generate_async_request_executor(config: &Config, parsed_enum: &ParsedEnum) -> let static_api_base_url_type = &config.static_types.api_base_url; let static_request_executor_type = &config.static_types.request_executor; let static_wp_api_error_type = &config.static_types.wp_api_error; - let request_builder_ident = &config.request_builder_ident; - let request_executor_ident = &config.request_executor_ident; + let generated_request_builder_ident = &config.generated_idents.request_builder; + let generated_request_executor_ident = &config.generated_idents.request_executor; let functions = parsed_enum.variants.iter().map(|variant| { let url_parts = variant.attr.url_parts.as_slice(); @@ -71,12 +71,12 @@ fn generate_async_request_executor(config: &Config, parsed_enum: &ParsedEnum) -> quote! { #[derive(Debug, uniffi::Object)] - pub struct #request_executor_ident { - request_builder: #request_builder_ident, + pub struct #generated_request_executor_ident { + request_builder: #generated_request_builder_ident, request_executor: #static_request_executor_type, } - impl #request_executor_ident { - pub(crate) fn new(request_builder: #request_builder_ident, request_executor: #static_request_executor_type) -> Self { + impl #generated_request_executor_ident { + pub(crate) fn new(request_builder: #generated_request_builder_ident, request_executor: #static_request_executor_type) -> Self { Self { request_builder, request_executor, @@ -84,7 +84,7 @@ fn generate_async_request_executor(config: &Config, parsed_enum: &ParsedEnum) -> } } #[uniffi::export] - impl #request_executor_ident { + impl #generated_request_executor_ident { #(#functions)* } } @@ -94,8 +94,8 @@ fn generate_request_builder(config: &Config, parsed_enum: &ParsedEnum) -> TokenS let static_api_base_url_type = &config.static_types.api_base_url; let static_inner_request_builder_type = &config.static_types.inner_request_builder; let static_wp_network_request_type = &config.static_types.wp_network_request; - let endpoint_ident = &config.endpoint_ident; - let request_builder_ident = &config.request_builder_ident; + let generated_endpoint_ident = &config.generated_idents.endpoint; + let generated_request_builder_ident = &config.generated_idents.request_builder; let functions = parsed_enum.variants.iter().map(|variant| { let url_parts = variant.attr.url_parts.as_slice(); @@ -134,20 +134,20 @@ fn generate_request_builder(config: &Config, parsed_enum: &ParsedEnum) -> TokenS quote! { #[derive(Debug, uniffi::Object)] - pub struct #request_builder_ident { - endpoint: #endpoint_ident, + pub struct #generated_request_builder_ident { + endpoint: #generated_endpoint_ident, inner: #static_inner_request_builder_type, } - impl #request_builder_ident { + impl #generated_request_builder_ident { pub(crate) fn new(api_base_url: #static_api_base_url_type, inner_request_builder: #static_inner_request_builder_type) -> Self { Self { - endpoint: #endpoint_ident::new(api_base_url), + endpoint: #generated_endpoint_ident::new(api_base_url), inner: inner_request_builder, } } } #[uniffi::export] - impl #request_builder_ident { + impl #generated_request_builder_ident { #(#functions)* } } @@ -156,7 +156,7 @@ fn generate_request_builder(config: &Config, parsed_enum: &ParsedEnum) -> TokenS fn generate_endpoint_type(config: &Config, parsed_enum: &ParsedEnum) -> TokenStream { let static_api_base_url_type = &config.static_types.api_base_url; let static_api_endpoint_url_type = &config.static_types.api_endpoint_url; - let endpoint_ident = &config.endpoint_ident; + let generated_endpoint_ident = &config.generated_idents.endpoint; let functions = parsed_enum.variants.iter().map(|variant| { let url_parts = variant.attr.url_parts.as_slice(); @@ -196,11 +196,11 @@ fn generate_endpoint_type(config: &Config, parsed_enum: &ParsedEnum) -> TokenStr quote! { #[derive(Debug)] - pub struct #endpoint_ident { + pub struct #generated_endpoint_ident { api_base_url: #static_api_base_url_type, } - impl #endpoint_ident { + impl #generated_endpoint_ident { pub fn new(api_base_url: #static_api_base_url_type) -> Self { Self { api_base_url } } @@ -263,13 +263,9 @@ impl Display for WpContext { #[derive(Debug)] pub struct Config { - // TODO: It's not clear what some of the names refer to and the difference between them - // For example, with "request_builder_ident" & "request_builder_type" pub crate_ident: Ident, - pub endpoint_ident: Ident, - pub request_builder_ident: Ident, - pub request_executor_ident: Ident, pub sparse_field_type: SparseFieldAttr, + pub generated_idents: ConfigGeneratedIdents, pub static_types: ConfigStaticTypes, } @@ -283,14 +279,13 @@ impl Config { FoundCrate::Itself => format_ident!("crate"), FoundCrate::Name(name) => Ident::new(&name, Span::call_site()), }; + let generated_idents = ConfigGeneratedIdents::new(parsed_enum); let static_types = ConfigStaticTypes::new(&crate_ident); Self { crate_ident, - endpoint_ident: format_ident!("{}Endpoint", parsed_enum.enum_ident), - request_builder_ident: format_ident!("{}Builder", parsed_enum.enum_ident), - request_executor_ident: format_ident!("{}Executor", parsed_enum.enum_ident), sparse_field_type: parsed_enum.sparse_field_attr.clone(), + generated_idents, static_types, } } @@ -318,3 +313,20 @@ impl ConfigStaticTypes { } } } + +#[derive(Debug)] +pub struct ConfigGeneratedIdents { + pub endpoint: Ident, + pub request_builder: Ident, + pub request_executor: Ident, +} + +impl ConfigGeneratedIdents { + fn new(parsed_enum: &ParsedEnum) -> Self { + Self { + endpoint: format_ident!("{}Endpoint", parsed_enum.enum_ident), + request_builder: format_ident!("{}Builder", parsed_enum.enum_ident), + request_executor: format_ident!("{}Executor", parsed_enum.enum_ident), + } + } +} From c3e26ba6cf5f0f1f021b55a6bfa77ce0c5dbcc2b Mon Sep 17 00:00:00 2001 From: Oguz Kocer Date: Fri, 21 Jun 2024 12:08:55 -0400 Subject: [PATCH 5/8] Generated request executor now builds its own request builder --- wp_api/src/lib.rs | 18 ++++++++---------- wp_derive_request_builder/src/generate.rs | 5 +++-- 2 files changed, 11 insertions(+), 12 deletions(-) diff --git a/wp_api/src/lib.rs b/wp_api/src/lib.rs index 791b37281..065ed03db 100644 --- a/wp_api/src/lib.rs +++ b/wp_api/src/lib.rs @@ -2,10 +2,8 @@ use request::{ endpoint::{ - application_passwords_endpoint::{ - ApplicationPasswordsRequestBuilder, ApplicationPasswordsRequestExecutor, - }, - plugins_endpoint::{PluginsRequestBuilder, PluginsRequestExecutor}, + application_passwords_endpoint::ApplicationPasswordsRequestExecutor, + plugins_endpoint::PluginsRequestExecutor, users_endpoint::{UsersRequestBuilder, UsersRequestExecutor}, ApiBaseUrl, }, @@ -85,20 +83,20 @@ impl WpRequestBuilder { Ok(Self { application_passwords: ApplicationPasswordsRequestExecutor::new( - ApplicationPasswordsRequestBuilder::new( - api_base_url.clone(), - inner_request_builder.clone(), - ), + api_base_url.clone(), + inner_request_builder.clone(), request_executor.clone(), ) .into(), users: UsersRequestExecutor::new( - UsersRequestBuilder::new(api_base_url.clone(), inner_request_builder.clone()), + api_base_url.clone(), + inner_request_builder.clone(), request_executor.clone(), ) .into(), plugins: PluginsRequestExecutor::new( - PluginsRequestBuilder::new(api_base_url.clone(), inner_request_builder.clone()), + api_base_url.clone(), + inner_request_builder.clone(), request_executor.clone(), ) .into(), diff --git a/wp_derive_request_builder/src/generate.rs b/wp_derive_request_builder/src/generate.rs index d8c45a5b0..dafdbf1b0 100644 --- a/wp_derive_request_builder/src/generate.rs +++ b/wp_derive_request_builder/src/generate.rs @@ -29,6 +29,7 @@ pub(crate) fn generate_types(parsed_enum: &ParsedEnum) -> TokenStream { fn generate_async_request_executor(config: &Config, parsed_enum: &ParsedEnum) -> TokenStream { let static_api_base_url_type = &config.static_types.api_base_url; + let static_inner_request_builder_type = &config.static_types.inner_request_builder; let static_request_executor_type = &config.static_types.request_executor; let static_wp_api_error_type = &config.static_types.wp_api_error; let generated_request_builder_ident = &config.generated_idents.request_builder; @@ -76,9 +77,9 @@ fn generate_async_request_executor(config: &Config, parsed_enum: &ParsedEnum) -> request_executor: #static_request_executor_type, } impl #generated_request_executor_ident { - pub(crate) fn new(request_builder: #generated_request_builder_ident, request_executor: #static_request_executor_type) -> Self { + pub(crate) fn new(api_base_url: #static_api_base_url_type, inner_request_builder: #static_inner_request_builder_type, request_executor: #static_request_executor_type) -> Self { Self { - request_builder, + request_builder: #generated_request_builder_ident::new(api_base_url, inner_request_builder), request_executor, } } From 0e08f7d43810355d3124c84ac906225d74bff52b Mon Sep 17 00:00:00 2001 From: Oguz Kocer Date: Fri, 21 Jun 2024 12:28:10 -0400 Subject: [PATCH 6/8] Generated request builder/executor now builds its own inner request builder --- wp_api/src/lib.rs | 11 ++++------- wp_api/src/request.rs | 4 ++-- wp_derive_request_builder/src/generate.rs | 14 +++++++++----- 3 files changed, 15 insertions(+), 14 deletions(-) diff --git a/wp_api/src/lib.rs b/wp_api/src/lib.rs index 065ed03db..c1bb28590 100644 --- a/wp_api/src/lib.rs +++ b/wp_api/src/lib.rs @@ -46,10 +46,9 @@ impl WpApiRequestBuilder { reason: err.to_string(), })? .into(); - let request_builder = Arc::new(request::InnerRequestBuilder::new(authentication.clone())); Ok(Self { - users: UsersRequestBuilder::new(api_base_url.clone(), request_builder.clone()).into(), + users: UsersRequestBuilder::new(api_base_url.clone(), authentication).into(), }) } @@ -78,25 +77,23 @@ impl WpRequestBuilder { reason: err.to_string(), })? .into(); - let inner_request_builder = - Arc::new(request::InnerRequestBuilder::new(authentication.clone())); Ok(Self { application_passwords: ApplicationPasswordsRequestExecutor::new( api_base_url.clone(), - inner_request_builder.clone(), + authentication.clone(), request_executor.clone(), ) .into(), users: UsersRequestExecutor::new( api_base_url.clone(), - inner_request_builder.clone(), + authentication.clone(), request_executor.clone(), ) .into(), plugins: PluginsRequestExecutor::new( api_base_url.clone(), - inner_request_builder.clone(), + authentication.clone(), request_executor.clone(), ) .into(), diff --git a/wp_api/src/request.rs b/wp_api/src/request.rs index 0488766a7..c0c5d47b9 100644 --- a/wp_api/src/request.rs +++ b/wp_api/src/request.rs @@ -14,12 +14,12 @@ const CONTENT_TYPE_JSON: &str = "application/json"; const LINK_HEADER_KEY: &str = "Link"; #[derive(Debug)] -pub(crate) struct InnerRequestBuilder { +struct InnerRequestBuilder { authentication: WpAuthentication, } impl InnerRequestBuilder { - pub(crate) fn new(authentication: WpAuthentication) -> Self { + fn new(authentication: WpAuthentication) -> Self { Self { authentication } } diff --git a/wp_derive_request_builder/src/generate.rs b/wp_derive_request_builder/src/generate.rs index dafdbf1b0..9b8571d47 100644 --- a/wp_derive_request_builder/src/generate.rs +++ b/wp_derive_request_builder/src/generate.rs @@ -29,6 +29,7 @@ pub(crate) fn generate_types(parsed_enum: &ParsedEnum) -> TokenStream { fn generate_async_request_executor(config: &Config, parsed_enum: &ParsedEnum) -> TokenStream { let static_api_base_url_type = &config.static_types.api_base_url; + let static_wp_authentication_type = &config.static_types.wp_authentication; let static_inner_request_builder_type = &config.static_types.inner_request_builder; let static_request_executor_type = &config.static_types.request_executor; let static_wp_api_error_type = &config.static_types.wp_api_error; @@ -77,9 +78,9 @@ fn generate_async_request_executor(config: &Config, parsed_enum: &ParsedEnum) -> request_executor: #static_request_executor_type, } impl #generated_request_executor_ident { - pub(crate) fn new(api_base_url: #static_api_base_url_type, inner_request_builder: #static_inner_request_builder_type, request_executor: #static_request_executor_type) -> Self { + pub(crate) fn new(api_base_url: #static_api_base_url_type, authentication: #static_wp_authentication_type, request_executor: #static_request_executor_type) -> Self { Self { - request_builder: #generated_request_builder_ident::new(api_base_url, inner_request_builder), + request_builder: #generated_request_builder_ident::new(api_base_url, authentication), request_executor, } } @@ -94,6 +95,7 @@ fn generate_async_request_executor(config: &Config, parsed_enum: &ParsedEnum) -> fn generate_request_builder(config: &Config, parsed_enum: &ParsedEnum) -> TokenStream { let static_api_base_url_type = &config.static_types.api_base_url; let static_inner_request_builder_type = &config.static_types.inner_request_builder; + let static_wp_authentication_type = &config.static_types.wp_authentication; let static_wp_network_request_type = &config.static_types.wp_network_request; let generated_endpoint_ident = &config.generated_idents.endpoint; let generated_request_builder_ident = &config.generated_idents.request_builder; @@ -140,10 +142,10 @@ fn generate_request_builder(config: &Config, parsed_enum: &ParsedEnum) -> TokenS inner: #static_inner_request_builder_type, } impl #generated_request_builder_ident { - pub(crate) fn new(api_base_url: #static_api_base_url_type, inner_request_builder: #static_inner_request_builder_type) -> Self { + pub(crate) fn new(api_base_url: #static_api_base_url_type, authentication: #static_wp_authentication_type) -> Self { Self { endpoint: #generated_endpoint_ident::new(api_base_url), - inner: inner_request_builder, + inner: #static_inner_request_builder_type::new(authentication), } } } @@ -299,6 +301,7 @@ pub struct ConfigStaticTypes { pub inner_request_builder: TokenStream, pub request_executor: TokenStream, pub wp_api_error: TokenStream, + pub wp_authentication: TokenStream, pub wp_network_request: TokenStream, } @@ -307,9 +310,10 @@ impl ConfigStaticTypes { Self { api_base_url: quote! { std::sync::Arc<#crate_ident::request::endpoint::ApiBaseUrl> }, api_endpoint_url: quote! { #crate_ident::request::endpoint::ApiEndpointUrl }, - inner_request_builder: quote! { std::sync::Arc<#crate_ident::request::InnerRequestBuilder> }, + inner_request_builder: quote! { #crate_ident::request::InnerRequestBuilder }, request_executor: quote! { std::sync::Arc }, wp_api_error: quote! { #crate_ident::WpApiError }, + wp_authentication: quote! { #crate_ident::WpAuthentication }, wp_network_request: quote! { #crate_ident::request::WpNetworkRequest }, } } From 847add250531eef718c48e3fdcd3d3abd62e46bd Mon Sep 17 00:00:00 2001 From: Oguz Kocer Date: Fri, 21 Jun 2024 12:29:30 -0400 Subject: [PATCH 7/8] Make generated request builder/executor available to pub --- wp_derive_request_builder/src/generate.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/wp_derive_request_builder/src/generate.rs b/wp_derive_request_builder/src/generate.rs index 9b8571d47..3f21e96a2 100644 --- a/wp_derive_request_builder/src/generate.rs +++ b/wp_derive_request_builder/src/generate.rs @@ -78,7 +78,7 @@ fn generate_async_request_executor(config: &Config, parsed_enum: &ParsedEnum) -> request_executor: #static_request_executor_type, } impl #generated_request_executor_ident { - pub(crate) fn new(api_base_url: #static_api_base_url_type, authentication: #static_wp_authentication_type, request_executor: #static_request_executor_type) -> Self { + pub fn new(api_base_url: #static_api_base_url_type, authentication: #static_wp_authentication_type, request_executor: #static_request_executor_type) -> Self { Self { request_builder: #generated_request_builder_ident::new(api_base_url, authentication), request_executor, @@ -142,7 +142,7 @@ fn generate_request_builder(config: &Config, parsed_enum: &ParsedEnum) -> TokenS inner: #static_inner_request_builder_type, } impl #generated_request_builder_ident { - pub(crate) fn new(api_base_url: #static_api_base_url_type, authentication: #static_wp_authentication_type) -> Self { + pub fn new(api_base_url: #static_api_base_url_type, authentication: #static_wp_authentication_type) -> Self { Self { endpoint: #generated_endpoint_ident::new(api_base_url), inner: #static_inner_request_builder_type::new(authentication), From 5ab163f382985bd3d5aa1403e1c1498b05bbc0c6 Mon Sep 17 00:00:00 2001 From: Oguz Kocer Date: Fri, 21 Jun 2024 12:33:54 -0400 Subject: [PATCH 8/8] Remove TODO from WpApiRequestBuilder --- wp_api/src/lib.rs | 4 ---- 1 file changed, 4 deletions(-) diff --git a/wp_api/src/lib.rs b/wp_api/src/lib.rs index c1bb28590..01597c24b 100644 --- a/wp_api/src/lib.rs +++ b/wp_api/src/lib.rs @@ -28,10 +28,6 @@ pub mod users; #[cfg(test)] mod unit_test_common; -// TODO: This is a temporary type that allows building a request type -// Although we'll have a type that does that, it's unlikely that it'll look like this. -// It still does its job for now to prove that `UsersRequestBuilder2` (temporary) type is -// properly generated and utilized in `test_manual_request_builder_immut` integration tests #[derive(Debug, uniffi::Object)] pub struct WpApiRequestBuilder { users: Arc,