Skip to content

Commit b803fb4

Browse files
Introduces ApiUrlResolver (#707)
* Adds `ApiUrlResolver` * Add `ApiUrlResolver` support to Kotlin * Fix a swift compiling issue --------- Co-authored-by: Tony Li <[email protected]>
1 parent e0c6a7f commit b803fb4

36 files changed

+491
-184
lines changed

native/kotlin/api/kotlin/src/integrationTest/kotlin/ManualParserTest.kt

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import org.junit.jupiter.api.Test
55
import uniffi.wp_api.UniffiWpApiRequestBuilder
66
import uniffi.wp_api.UserListParams
77
import uniffi.wp_api.WpAuthenticationProvider
8+
import uniffi.wp_api.WpOrgSiteApiUrlResolver
89
import uniffi.wp_api.parseAsUsersRequestListWithEditContextResponse
910
import kotlin.test.assertEquals
1011

@@ -17,7 +18,10 @@ class ManualParserTest {
1718

1819
@Test
1920
fun testUserListManualRequestAndParsing() = runTest {
20-
val requestBuilder = UniffiWpApiRequestBuilder(testCredentials.apiRootUrl, authProvider)
21+
val requestBuilder = UniffiWpApiRequestBuilder(
22+
apiUrlResolver = WpOrgSiteApiUrlResolver(apiRootUrl = testCredentials.apiRootUrl),
23+
authProvider
24+
)
2125
val userListRequest = requestBuilder.users().listWithEditContext(UserListParams())
2226
val userListResponse = requestExecutor.execute(userListRequest)
2327
val userList = parseAsUsersRequestListWithEditContextResponse(userListResponse).data

native/kotlin/api/kotlin/src/main/kotlin/rs/wordpress/api/kotlin/JetpackApiClient.kt

Lines changed: 18 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ package rs.wordpress.api.kotlin
33
import kotlinx.coroutines.CoroutineDispatcher
44
import kotlinx.coroutines.Dispatchers
55
import kotlinx.coroutines.withContext
6+
import uniffi.wp_api.ApiUrlResolver
67
import uniffi.wp_api.ParsedUrl
78
import uniffi.wp_api.RequestExecutor
89
import uniffi.wp_api.UniffiJetpackApiClient
@@ -11,18 +12,33 @@ import uniffi.wp_api.WpApiException
1112
import uniffi.wp_api.WpApiMiddlewarePipeline
1213
import uniffi.wp_api.WpAppNotifier
1314
import uniffi.wp_api.WpAuthenticationProvider
15+
import uniffi.wp_api.WpOrgSiteApiUrlResolver
1416

1517
class JetpackApiClient(
16-
apiRootUrl: ParsedUrl,
18+
apiUrlResolver: ApiUrlResolver,
1719
authProvider: WpAuthenticationProvider,
1820
private val requestExecutor: RequestExecutor = WpRequestExecutor(),
1921
private val appNotifier: WpAppNotifier = EmptyAppNotifier(),
2022
private val dispatcher: CoroutineDispatcher = Dispatchers.IO
2123
) {
24+
constructor(
25+
wpOrgSiteApiRootUrl: ParsedUrl,
26+
authProvider: WpAuthenticationProvider,
27+
requestExecutor: RequestExecutor = WpRequestExecutor(),
28+
appNotifier: WpAppNotifier = EmptyAppNotifier(),
29+
dispatcher: CoroutineDispatcher = Dispatchers.IO
30+
) : this(
31+
apiUrlResolver = WpOrgSiteApiUrlResolver(apiRootUrl = wpOrgSiteApiRootUrl),
32+
authProvider,
33+
requestExecutor,
34+
appNotifier,
35+
dispatcher
36+
)
37+
2238
// Don't expose `WpRequestBuilder` directly so we can control how it's used
2339
private val requestBuilder by lazy {
2440
UniffiJetpackApiClient(
25-
apiRootUrl,
41+
apiUrlResolver,
2642
WpApiClientDelegate(
2743
authProvider,
2844
requestExecutor = requestExecutor,

native/kotlin/api/kotlin/src/main/kotlin/rs/wordpress/api/kotlin/WpApiClient.kt

Lines changed: 18 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ package rs.wordpress.api.kotlin
33
import kotlinx.coroutines.CoroutineDispatcher
44
import kotlinx.coroutines.Dispatchers
55
import kotlinx.coroutines.withContext
6+
import uniffi.wp_api.ApiUrlResolver
67
import uniffi.wp_api.ParsedUrl
78
import uniffi.wp_api.RequestExecutor
89
import uniffi.wp_api.UniffiWpApiClient
@@ -11,18 +12,33 @@ import uniffi.wp_api.WpApiException
1112
import uniffi.wp_api.WpApiMiddlewarePipeline
1213
import uniffi.wp_api.WpAppNotifier
1314
import uniffi.wp_api.WpAuthenticationProvider
15+
import uniffi.wp_api.WpOrgSiteApiUrlResolver
1416

1517
class WpApiClient(
16-
apiRootUrl: ParsedUrl,
18+
apiUrlResolver: ApiUrlResolver,
1719
authProvider: WpAuthenticationProvider,
1820
private val requestExecutor: RequestExecutor = WpRequestExecutor(),
1921
private val appNotifier: WpAppNotifier = EmptyAppNotifier(),
2022
private val dispatcher: CoroutineDispatcher = Dispatchers.IO
2123
) {
24+
constructor(
25+
wpOrgSiteApiRootUrl: ParsedUrl,
26+
authProvider: WpAuthenticationProvider,
27+
requestExecutor: RequestExecutor = WpRequestExecutor(),
28+
appNotifier: WpAppNotifier = EmptyAppNotifier(),
29+
dispatcher: CoroutineDispatcher = Dispatchers.IO
30+
) : this(
31+
apiUrlResolver = WpOrgSiteApiUrlResolver(apiRootUrl = wpOrgSiteApiRootUrl),
32+
authProvider,
33+
requestExecutor,
34+
appNotifier,
35+
dispatcher
36+
)
37+
2238
// Don't expose `WpRequestBuilder` directly so we can control how it's used
2339
private val requestBuilder by lazy {
2440
UniffiWpApiClient(
25-
apiRootUrl,
41+
apiUrlResolver,
2642
WpApiClientDelegate(
2743
authProvider,
2844
requestExecutor = requestExecutor,

native/swift/Sources/wordpress-api/WordPressAPI.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,7 @@ public actor WordPressAPI {
6969
appNotifier: appNotifier ?? EmptyAppNotifier()
7070
)
7171
self.requestBuilder = UniffiWpApiClient(
72-
apiRootUrl: apiRootUrl,
72+
apiUrlResolver: WpOrgSiteApiUrlResolver(apiRootUrl: apiRootUrl),
7373
delegate: self.apiClientDelegate
7474
)
7575
self.requestExecutor = executor

wp_api/src/api_client.rs

Lines changed: 20 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,12 @@
11
use crate::{
2-
ParsedUrl, WpAppNotifier, api_client_generate_api_client, api_client_generate_endpoint_impl,
2+
WpAppNotifier, api_client_generate_api_client, api_client_generate_endpoint_impl,
33
api_client_generate_request_builder,
44
auth::WpAuthenticationProvider,
55
middleware::WpApiMiddlewarePipeline,
66
request::{
77
RequestExecutor,
88
endpoint::{
9+
ApiUrlResolver,
910
application_passwords_endpoint::{
1011
ApplicationPasswordsRequestBuilder, ApplicationPasswordsRequestExecutor,
1112
},
@@ -38,9 +39,12 @@ struct UniffiWpApiRequestBuilder {
3839
#[uniffi::export]
3940
impl UniffiWpApiRequestBuilder {
4041
#[uniffi::constructor]
41-
pub fn new(api_root_url: Arc<ParsedUrl>, auth_provider: Arc<WpAuthenticationProvider>) -> Self {
42+
pub fn new(
43+
api_url_resolver: Arc<dyn ApiUrlResolver>,
44+
auth_provider: Arc<WpAuthenticationProvider>,
45+
) -> Self {
4246
Self {
43-
inner: WpApiRequestBuilder::new(api_root_url, auth_provider),
47+
inner: WpApiRequestBuilder::new(api_url_resolver, auth_provider),
4448
}
4549
}
4650
}
@@ -64,9 +68,12 @@ pub struct WpApiRequestBuilder {
6468
}
6569

6670
impl WpApiRequestBuilder {
67-
pub fn new(api_root_url: Arc<ParsedUrl>, auth_provider: Arc<WpAuthenticationProvider>) -> Self {
71+
pub fn new(
72+
api_url_resolver: Arc<dyn ApiUrlResolver>,
73+
auth_provider: Arc<WpAuthenticationProvider>,
74+
) -> Self {
6875
api_client_generate_request_builder!(
69-
api_root_url,
76+
api_url_resolver,
7077
auth_provider;
7178
application_passwords,
7279
categories,
@@ -95,9 +102,9 @@ struct UniffiWpApiClient {
95102
#[uniffi::export]
96103
impl UniffiWpApiClient {
97104
#[uniffi::constructor]
98-
fn new(api_root_url: Arc<ParsedUrl>, delegate: WpApiClientDelegate) -> Self {
105+
fn new(api_url_resolver: Arc<dyn ApiUrlResolver>, delegate: WpApiClientDelegate) -> Self {
99106
Self {
100-
inner: WpApiClient::new(api_root_url, delegate),
107+
inner: WpApiClient::new(api_url_resolver, delegate),
101108
}
102109
}
103110
}
@@ -121,9 +128,9 @@ pub struct WpApiClient {
121128
}
122129

123130
impl WpApiClient {
124-
pub fn new(api_root_url: Arc<ParsedUrl>, delegate: WpApiClientDelegate) -> Self {
131+
pub fn new(api_url_resolver: Arc<dyn ApiUrlResolver>, delegate: WpApiClientDelegate) -> Self {
125132
api_client_generate_api_client!(
126-
api_root_url,
133+
api_url_resolver,
127134
delegate;
128135
application_passwords,
129136
categories,
@@ -209,11 +216,11 @@ macro_rules! api_client_generate_endpoint_impl {
209216

210217
#[macro_export]
211218
macro_rules! api_client_generate_request_builder {
212-
($api_root_url:ident, $authentication:ident; $($element:expr),*) => {
219+
($api_url_resolver:ident, $authentication:ident; $($element:expr),*) => {
213220
paste::paste! {
214221
Self {
215222
$($element: [<$element:camel RequestBuilder>]::new(
216-
$api_root_url.clone(),
223+
$api_url_resolver.clone(),
217224
$authentication.clone(),
218225
)
219226
.into(),)*
@@ -224,11 +231,11 @@ macro_rules! api_client_generate_request_builder {
224231

225232
#[macro_export]
226233
macro_rules! api_client_generate_api_client {
227-
($api_root_url:ident, $delegate:ident; $($element:expr),*) => {
234+
($api_url_resolver:ident, $delegate:ident; $($element:expr),*) => {
228235
paste::paste! {
229236
Self {
230237
$($element: [<$element:camel RequestExecutor>]::new(
231-
$api_root_url.clone(),
238+
$api_url_resolver.clone(),
232239
$delegate.clone(),
233240
)
234241
.into(),)*

wp_api/src/jetpack/client.rs

Lines changed: 47 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,9 @@
11
use super::endpoint::connection_endpoint::{ConnectionRequestBuilder, ConnectionRequestExecutor};
22
use crate::{
33
ParsedUrl, WpApiClientDelegate, api_client_generate_api_client,
4-
api_client_generate_endpoint_impl, auth::WpAuthenticationProvider,
4+
api_client_generate_endpoint_impl,
5+
auth::WpAuthenticationProvider,
6+
request::endpoint::{ApiUrlResolver, WpOrgSiteApiUrlResolver},
57
};
68
use std::sync::Arc;
79

@@ -13,23 +15,44 @@ struct UniffiJetpackApiRequestBuilder {
1315
#[uniffi::export]
1416
impl UniffiJetpackApiRequestBuilder {
1517
#[uniffi::constructor]
16-
pub fn new(api_root_url: Arc<ParsedUrl>, auth_provider: Arc<WpAuthenticationProvider>) -> Self {
18+
pub fn new(
19+
api_url_resolver: Arc<dyn ApiUrlResolver>,
20+
auth_provider: Arc<WpAuthenticationProvider>,
21+
) -> Self {
1722
Self {
18-
inner: JetpackApiRequestBuilder::new(api_root_url, auth_provider),
23+
inner: JetpackApiRequestBuilder::new(api_url_resolver, auth_provider),
1924
}
2025
}
26+
27+
#[uniffi::constructor]
28+
pub fn with_api_root_url(
29+
api_root_url: Arc<ParsedUrl>,
30+
auth_provider: Arc<WpAuthenticationProvider>,
31+
) -> Self {
32+
Self::new(jetpack_api_url_resolver(api_root_url), auth_provider)
33+
}
2134
}
2235

2336
pub struct JetpackApiRequestBuilder {
2437
connection: Arc<ConnectionRequestBuilder>,
2538
}
2639

2740
impl JetpackApiRequestBuilder {
28-
pub fn new(api_root_url: Arc<ParsedUrl>, auth_provider: Arc<WpAuthenticationProvider>) -> Self {
41+
pub fn new(
42+
api_url_resolver: Arc<dyn ApiUrlResolver>,
43+
auth_provider: Arc<WpAuthenticationProvider>,
44+
) -> Self {
2945
Self {
30-
connection: ConnectionRequestBuilder::new(api_root_url, auth_provider).into(),
46+
connection: ConnectionRequestBuilder::new(api_url_resolver, auth_provider).into(),
3147
}
3248
}
49+
50+
pub fn with_api_root_url(
51+
api_root_url: Arc<ParsedUrl>,
52+
auth_provider: Arc<WpAuthenticationProvider>,
53+
) -> Self {
54+
Self::new(jetpack_api_url_resolver(api_root_url), auth_provider)
55+
}
3356
}
3457

3558
#[derive(uniffi::Object)]
@@ -40,9 +63,16 @@ struct UniffiJetpackApiClient {
4063
#[uniffi::export]
4164
impl UniffiJetpackApiClient {
4265
#[uniffi::constructor]
43-
fn new(api_root_url: Arc<ParsedUrl>, delegate: WpApiClientDelegate) -> Self {
66+
fn new(api_url_resolver: Arc<dyn ApiUrlResolver>, delegate: WpApiClientDelegate) -> Self {
67+
Self {
68+
inner: JetpackApiClient::new(api_url_resolver, delegate),
69+
}
70+
}
71+
72+
#[uniffi::constructor]
73+
fn with_api_root_url(api_root_url: Arc<ParsedUrl>, delegate: WpApiClientDelegate) -> Self {
4474
Self {
45-
inner: JetpackApiClient::new(api_root_url, delegate),
75+
inner: JetpackApiClient::with_api_root_url(api_root_url, delegate),
4676
}
4777
}
4878
}
@@ -52,12 +82,20 @@ pub struct JetpackApiClient {
5282
}
5383

5484
impl JetpackApiClient {
55-
pub fn new(api_root_url: Arc<ParsedUrl>, delegate: WpApiClientDelegate) -> Self {
85+
pub fn new(api_url_resolver: Arc<dyn ApiUrlResolver>, delegate: WpApiClientDelegate) -> Self {
5686
api_client_generate_api_client!(
57-
api_root_url,
87+
api_url_resolver,
5888
delegate;
5989
connection
6090
)
6191
}
92+
93+
pub fn with_api_root_url(api_root_url: Arc<ParsedUrl>, delegate: WpApiClientDelegate) -> Self {
94+
Self::new(jetpack_api_url_resolver(api_root_url), delegate)
95+
}
6296
}
6397
api_client_generate_endpoint_impl!(JetpackApi, connection);
98+
99+
fn jetpack_api_url_resolver(api_root_url: Arc<ParsedUrl>) -> Arc<dyn ApiUrlResolver> {
100+
Arc::new(WpOrgSiteApiUrlResolver::new(api_root_url))
101+
}

wp_api/src/jetpack/connection.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -97,7 +97,7 @@ impl JetpackConnectionClient {
9797
pub fn new(api_root_url: Arc<ParsedUrl>, delegate: WpApiClientDelegate) -> Self {
9898
Self {
9999
delegate: delegate.clone(),
100-
jetpack_client: JetpackApiClient::new(api_root_url, delegate),
100+
jetpack_client: JetpackApiClient::with_api_root_url(api_root_url, delegate),
101101
}
102102
}
103103

wp_api/src/jetpack/mod.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ pub mod endpoint;
77
pub(crate) struct JetpackNamespace();
88

99
impl AsNamespace for JetpackNamespace {
10-
fn as_str(&self) -> &str {
10+
fn namespace_value(&self) -> &'static str {
1111
"/jetpack/v4"
1212
}
1313
}

wp_api/src/login/login_client.rs

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ use itertools::Itertools;
2121
use std::sync::Arc;
2222
use uuid::Uuid;
2323

24-
#[derive(Debug, uniffi::Object)]
24+
#[derive(uniffi::Object)]
2525
struct UniffiWpLoginClient {
2626
inner: Arc<WpLoginClient>,
2727
}
@@ -51,7 +51,6 @@ impl UniffiWpLoginClient {
5151
}
5252
}
5353

54-
#[derive(Debug)]
5554
pub struct WpLoginClient {
5655
request_executor: Arc<dyn RequestExecutor>,
5756
middleware_pipeline: Arc<WpApiMiddlewarePipeline>,

0 commit comments

Comments
 (0)