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
23 changes: 9 additions & 14 deletions CLAUDE.md
Original file line number Diff line number Diff line change
Expand Up @@ -97,26 +97,21 @@ WordPress REST API returns different fields depending on the `context` parameter

3. **Define parameter types** for list/create/update operations:
```rust
#[derive(Debug, Default, PartialEq, Eq, uniffi::Record)]
#[derive(Debug, Default, PartialEq, Eq, uniffi::Record, WpDeriveParamsField)]
#[supports_pagination(true)] // or false if endpoint doesn't support pagination
pub struct UserListParams {
#[uniffi(default = None)]
pub page: Option<u32>,
#[uniffi(default = [])]
pub exclude: Vec<UserId>,
// ... other fields
}
```

4. **Implement query parameter handling**:
- Create a `{Type}ListParamsField` enum:
```rust
#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, IntoStaticStr)]
enum UserListParamsField {
#[strum(serialize = "page")]
Page,
// ... other fields
}
```
- Implement `AppendUrlQueryPairs` and `FromUrlQueryPairs` traits
- Import helpers: `crate::url_query::{AppendUrlQueryPairs, FromUrlQueryPairs, QueryPairs, QueryPairsExtension, UrlQueryPairsMap}`
- Use `WpDeriveParamsField` macro to automatically generate field enum and query parameter handling
- Add `#[supports_pagination(true/false)]` attribute to indicate pagination support
- Use `#[field_name("custom_name")]` attribute if the API field name differs from the struct field name
- **IMPORTANT**: For array/list parameters, use `Vec<T>` with `#[uniffi(default = [])]`, NOT `Option<Vec<T>>` with `#[uniffi(default = None)]`
- Import: `use wp_derive::WpDeriveParamsField;`

**Special parameter types:**

Expand Down
12 changes: 9 additions & 3 deletions native/swift/Example/Example/ExampleApp.swift
Original file line number Diff line number Diff line change
Expand Up @@ -164,25 +164,31 @@ struct ExampleApp: App {
.map(\.value.asListViewData)
}, category: .posts))

baseData.append(RootListData(name: "Navigations", callback: {
try await WordPressAPI.globalInstance.navigations.listWithEditContext(params: NavigationListParams())
.data
.map(\.asListViewData)
}, category: .navigation))

baseData.append(RootListData(name: "Menus", callback: {
try await WordPressAPI.globalInstance.navMenus.listWithEditContext(params: NavMenuListParams())
.data
.map(\.asListViewData)
}, category: .system))
}, category: .navigation))

baseData.append(RootListData(name: "Menu Items", sequence: {
let sequence = try await WordPressAPI.globalInstance.navMenuItems
.sequenceWithEditContext(params: NavMenuItemListParams())

return ListViewSequence(underlyingSequence: sequence)
}, category: .system))
}, category: .navigation))

baseData.append(RootListData(name: "Menu Locations", callback: {
try await WordPressAPI.globalInstance.menuLocations.listWithEditContext()
.data
.locations
.map(\.value.asListViewData)
}, category: .system))
}, category: .navigation))

return baseData
}
Expand Down
11 changes: 11 additions & 0 deletions native/swift/Example/Example/ListViewData.swift
Original file line number Diff line number Diff line change
Expand Up @@ -183,6 +183,17 @@ extension PostStatusWithEditContext: ListViewDataConvertable {
}
}

extension NavigationWithEditContext: ListViewDataConvertable {
var asListViewData: ListViewData {
let title = switch self.title {
case .object(let title): title.rendered
case .string(let string): string
}

return ListViewData(id: self.id.description, title: title ?? "Unknown", subtitle: self.slug, fields: [:])
}
}

extension NavMenuWithEditContext: ListViewDataConvertable {
var asListViewData: ListViewData {
ListViewData(id: self.id.description, title: self.name, subtitle: self.slug, fields: [:])
Expand Down
2 changes: 2 additions & 0 deletions native/swift/Example/Example/UI/RootListView.swift
Original file line number Diff line number Diff line change
Expand Up @@ -55,6 +55,7 @@ enum RootListData: Identifiable, Sendable {
enum Category: Hashable, Identifiable, CaseIterable {
case posts
case taxonomies
case navigation
case system

var id: String {
Expand All @@ -65,6 +66,7 @@ enum RootListData: Identifiable, Sendable {
return switch self {
case .posts: "Posts"
case .taxonomies: "Taxonomies"
case .navigation: "Navigation"
case .system: "System"
}
}
Expand Down
11 changes: 11 additions & 0 deletions native/swift/Sources/wordpress-api/Exports.swift
Original file line number Diff line number Diff line change
Expand Up @@ -194,6 +194,17 @@ public typealias TermsRequestListWithEmbedContextResponse = WordPressAPIInternal
// MARK: - Taxonomies
public typealias TaxonomyListParams = WordPressAPIInternal.TaxonomyListParams

// MARK: Navigation
public typealias NavigationStatus = WordPressAPIInternal.NavigationStatus
public typealias NavigationListParams = WordPressAPIInternal.NavigationListParams
public typealias NavigationCreateParams = WordPressAPIInternal.NavigationCreateParams
public typealias NavigationUpdateParams = WordPressAPIInternal.NavigationUpdateParams
public typealias NavigationRetrieveParams = WordPressAPIInternal.NavigationRetrieveParams
public typealias NavigationRequestExecutor = WordPressAPIInternal.NavigationsRequestExecutor
public typealias NavigationWithEditContext = WordPressAPIInternal.NavigationWithEditContext
public typealias NavigationWithViewContext = WordPressAPIInternal.NavigationWithViewContext
public typealias NavigationWithEmbedContext = WordPressAPIInternal.NavigationWithEmbedContext

// MARK: - Menus
public typealias SparseNavMenu = WordPressAPIInternal.SparseNavMenu
public typealias NavMenuListParams = WordPressAPIInternal.NavMenuListParams
Expand Down
4 changes: 4 additions & 0 deletions native/swift/Sources/wordpress-api/WordPressAPI.swift
Original file line number Diff line number Diff line change
Expand Up @@ -153,6 +153,10 @@ public actor WordPressAPI {
self.requestBuilder.wpBlockEditor()
}

public var navigations: NavigationRequestExecutor {
self.requestBuilder.navigations()
}

public var navMenus: NavMenusRequestExecutor {
self.requestBuilder.navMenus()
}
Expand Down
5 changes: 5 additions & 0 deletions scripts/setup-test-site.sh
Original file line number Diff line number Diff line change
Expand Up @@ -237,6 +237,10 @@ create_test_credentials () {
NAV_MENU_ITEM_AUTOSAVE_RESPONSE="$(create_nav_menu_item_autosave "1" "$NAV_MENU_ITEM_ID")"
AUTOSAVE_ID_FOR_NAV_MENU_ITEM_ID="$(echo "$NAV_MENU_ITEM_AUTOSAVE_RESPONSE" | jq -r '.id')"

echo "Creating a navigation for integration tests.."
NAVIGATION_RESPONSE="$(curl --silent --user "$ADMIN_USERNAME":"$ADMIN_PASSWORD" -H "Content-Type: application/json" -d '{"title":"Integration Test Navigation","content":"<!-- wp:navigation --><!-- /wp:navigation -->","status":"publish"}' http://localhost/wp-json/wp/v2/navigation)"
NAVIGATION_ID="$(echo "$NAVIGATION_RESPONSE" | jq -r '.id')"

rm -rf /app/test_credentials.json
jo -p \
site_url="$SITE_URL" \
Expand Down Expand Up @@ -274,6 +278,7 @@ create_test_credentials () {
footer_menu_location="$FOOTER_MENU_LOCATION" \
nav_menu_item_id="$NAV_MENU_ITEM_ID" \
autosave_id_for_nav_menu_item_id="$AUTOSAVE_ID_FOR_NAV_MENU_ITEM_ID" \
navigation_id="$NAVIGATION_ID" \
> /app/test_credentials.json
}
create_test_credentials
Expand Down
6 changes: 6 additions & 0 deletions wp_api/src/api_client.rs
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@ use crate::{
},
nav_menu_items_endpoint::{NavMenuItemsRequestBuilder, NavMenuItemsRequestExecutor},
nav_menus_endpoint::{NavMenusRequestBuilder, NavMenusRequestExecutor},
navigations_endpoint::{NavigationsRequestBuilder, NavigationsRequestExecutor},
plugins_endpoint::{PluginsRequestBuilder, PluginsRequestExecutor},
post_autosaves_endpoint::{AutosavesRequestBuilder, AutosavesRequestExecutor},
post_revisions_endpoint::{PostRevisionsRequestBuilder, PostRevisionsRequestExecutor},
Expand Down Expand Up @@ -58,6 +59,7 @@ pub struct WpApiRequestBuilder {
nav_menu_item_autosaves: Arc<NavMenuItemAutosavesRequestBuilder>,
nav_menu_items: Arc<NavMenuItemsRequestBuilder>,
nav_menus: Arc<NavMenusRequestBuilder>,
navigations: Arc<NavigationsRequestBuilder>,
plugins: Arc<PluginsRequestBuilder>,
post_revisions: Arc<PostRevisionsRequestBuilder>,
post_statuses: Arc<PostStatusesRequestBuilder>,
Expand Down Expand Up @@ -93,6 +95,7 @@ impl WpApiRequestBuilder {
nav_menu_item_autosaves,
nav_menu_items,
nav_menus,
navigations,
plugins,
post_revisions,
post_statuses,
Expand Down Expand Up @@ -138,6 +141,7 @@ pub struct WpApiClient {
nav_menu_item_autosaves: Arc<NavMenuItemAutosavesRequestExecutor>,
nav_menu_items: Arc<NavMenuItemsRequestExecutor>,
nav_menus: Arc<NavMenusRequestExecutor>,
navigations: Arc<NavigationsRequestExecutor>,
plugins: Arc<PluginsRequestExecutor>,
post_revisions: Arc<PostRevisionsRequestExecutor>,
post_statuses: Arc<PostStatusesRequestExecutor>,
Expand Down Expand Up @@ -170,6 +174,7 @@ impl WpApiClient {
nav_menu_item_autosaves,
nav_menu_items,
nav_menus,
navigations,
plugins,
post_revisions,
post_statuses,
Expand Down Expand Up @@ -212,6 +217,7 @@ api_client_generate_endpoint_impl!(WpApi, menu_locations);
api_client_generate_endpoint_impl!(WpApi, nav_menu_item_autosaves);
api_client_generate_endpoint_impl!(WpApi, nav_menu_items);
api_client_generate_endpoint_impl!(WpApi, nav_menus);
api_client_generate_endpoint_impl!(WpApi, navigations);
api_client_generate_endpoint_impl!(WpApi, plugins);
api_client_generate_endpoint_impl!(WpApi, post_revisions);
api_client_generate_endpoint_impl!(WpApi, post_statuses);
Expand Down
1 change: 1 addition & 0 deletions wp_api/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@ pub mod middleware;
pub mod nav_menu_item_revisions;
pub mod nav_menu_items;
pub mod nav_menus;
pub mod navigations;
pub mod parsed_url;
pub mod plugins;
pub mod post_revisions;
Expand Down
Loading