Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 3 additions & 3 deletions wp_api/src/request/endpoint/users_endpoint.rs
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ pub mod generated {
enum UsersRequest {
#[contextual_get(url = "/users", params = &UserListParams, output = Vec<crate::SparseUser>)]
List,
#[post(url = "/users", params = &crate::UserCreateParams, output = UserWithEditContext)]
#[post(url = "/users", params = &crate::UserCreateParams, output = crate::UserWithEditContext)]
Create,
#[delete(url = "/users/<user_id>", params = &UserDeleteParams, output = crate::UserDeleteResponse)]
Delete,
Expand All @@ -27,9 +27,9 @@ pub mod generated {
Retrieve,
#[contextual_get(url = "/users/me", output = crate::SparseUser)]
RetrieveMe,
#[post(url = "/users/<user_id>", params = &crate::UserUpdateParams, output = UserWithEditContext)]
#[post(url = "/users/<user_id>", params = &crate::UserUpdateParams, output = crate::UserWithEditContext)]
Update,
#[post(url = "/users/me", params = &crate::UserUpdateParams, output = UserWithEditContext)]
#[post(url = "/users/me", params = &crate::UserUpdateParams, output = crate::UserWithEditContext)]
UpdateMe,
}
}
Expand Down
88 changes: 76 additions & 12 deletions wp_derive_request_builder/src/generate.rs
Original file line number Diff line number Diff line change
Expand Up @@ -21,11 +21,75 @@ pub(crate) fn generate_types(parsed_enum: &ParsedEnum) -> TokenStream {
&mut [
generate_endpoint_type(&config, parsed_enum),
generate_request_builder(&config, parsed_enum),
generate_async_request_executor(&config, parsed_enum),
]
.into_iter(),
)
}

fn generate_async_request_executor(config: &Config, parsed_enum: &ParsedEnum) -> TokenStream {
let api_base_url_type = &config.api_base_url_type;
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();
let params_type = &variant.attr.params;

ContextAndFilterHandler::from_request_type(variant.attr.request_type)
.into_iter()
.map(|context_and_filter_handler| {
let output_type =
output_type(variant.attr.output.clone(), context_and_filter_handler);
let request_from_request_builder = fn_body_get_request_from_request_builder(
&variant.variant_ident,
url_parts,
params_type,
variant.attr.request_type,
context_and_filter_handler,
);
let fn_signature = fn_signature(
PartOf::RequestExecutor,
&variant.variant_ident,
url_parts,
params_type,
variant.attr.request_type,
context_and_filter_handler,
&config.sparse_field_type,
);
quote! {
pub async #fn_signature -> Result<#output_type, #wp_api_error_type> {
#request_from_request_builder
self.request_executor.execute(request).await?.parse()
}
}
})
.collect::<TokenStream>()
});

quote! {
#[derive(Debug, uniffi::Object)]
pub struct #request_executor_ident {
request_builder: #request_builder_ident,
request_executor: #request_executor_type,
}
impl #request_executor_ident {
pub(crate) fn new(request_builder: #request_builder_ident, request_executor: #request_executor_type) -> Self {
Self {
request_builder,
request_executor,
}
}
}
#[uniffi::export]
impl #request_executor_ident {
#(#functions)*
}
}
}

fn generate_request_builder(config: &Config, parsed_enum: &ParsedEnum) -> TokenStream {
let api_base_url_type = &config.api_base_url_type;
let endpoint_ident = &config.endpoint_ident;
Expand Down Expand Up @@ -56,12 +120,12 @@ fn generate_request_builder(config: &Config, parsed_enum: &ParsedEnum) -> TokenS
context_and_filter_handler,
&config.sparse_field_type,
);
let fn_body =
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 {
#url_from_endpoint
#fn_body
#fn_body_build_request_from_url
}
}
})
Expand Down Expand Up @@ -150,6 +214,7 @@ fn generate_endpoint_type(config: &Config, parsed_enum: &ParsedEnum) -> TokenStr
pub enum PartOf {
Endpoint,
RequestBuilder,
RequestExecutor,
}

#[derive(Debug, Clone, Copy)]
Expand All @@ -171,17 +236,8 @@ impl ContextAndFilterHandler {
v.push(ContextAndFilterHandler::FilterTakeContextAsArgument);
v
}
crate::parse::RequestType::Get => {
vec![
ContextAndFilterHandler::NoFilterTakeContextAsArgument,
ContextAndFilterHandler::FilterTakeContextAsArgument,
]
}
crate::parse::RequestType::Delete | crate::parse::RequestType::Post => {
vec![
ContextAndFilterHandler::None,
ContextAndFilterHandler::FilterNoContext,
]
vec![ContextAndFilterHandler::None]
}
}
}
Expand All @@ -207,12 +263,16 @@ 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 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 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,
Expand All @@ -232,6 +292,8 @@ impl Config {
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 request_executor_type =
quote! { std::sync::Arc<dyn #crate_ident::request::RequestExecutor> };
let wp_api_error_type = quote! { #crate_ident::WpApiError };
let wp_network_request_type = quote! { #crate_ident::request::WpNetworkRequest };
Self {
Expand All @@ -243,6 +305,8 @@ impl Config {
// implementation
request_builder_ident: format_ident!("{}Builder2", parsed_enum.enum_ident),
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,
Expand Down
Loading