From f94fcf4238365696748ef4e4df17350ce56f378a Mon Sep 17 00:00:00 2001 From: Ian Bull Date: Mon, 18 Nov 2024 16:48:22 -0800 Subject: [PATCH 1/8] doc: Add example of how to create a Post on bsky (#255) Adds an example to the README in the `bsky-sdk`. This is often the first thing new users will want to try when interacting with the SDK. --- bsky-sdk/README.md | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/bsky-sdk/README.md b/bsky-sdk/README.md index f8d1946b..6c5a9eea 100644 --- a/bsky-sdk/README.md +++ b/bsky-sdk/README.md @@ -108,6 +108,36 @@ async fn main() -> Result<(), Box> { } ``` +### Posts + +Create a BlueSky post: + +```rust,no_run +use atrium_api::types::string::Datetime; +use bsky_sdk::BskyAgent; + +#[tokio::main] +async fn main() -> Result<(), Box> { + let agent = BskyAgent::builder().build().await?; + agent.login("...", "...").await?; + + agent + .create_record(atrium_api::app::bsky::feed::post::RecordData { + created_at: Datetime::now(), + embed: None, + entities: None, + facets: None, + labels: None, + langs: None, + reply: None, + tags: None, + text: "Hello world, from Rust!".to_string(), + }) + .await?; + Ok(()) +} +``` + ### RichText Creating a RichText object from a string: From 68a1cdf8e942bb1dbc16f31ec019d4b23e425deb Mon Sep 17 00:00:00 2001 From: sugyan Date: Tue, 19 Nov 2024 09:58:23 +0900 Subject: [PATCH 2/8] chore: Update README --- bsky-sdk/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bsky-sdk/README.md b/bsky-sdk/README.md index 6c5a9eea..bcdba605 100644 --- a/bsky-sdk/README.md +++ b/bsky-sdk/README.md @@ -110,7 +110,7 @@ async fn main() -> Result<(), Box> { ### Posts -Create a BlueSky post: +Create a Bluesky post: ```rust,no_run use atrium_api::types::string::Datetime; From 4a5cf4a1e605bea0770266bbf4743ae69d63c9a6 Mon Sep 17 00:00:00 2001 From: Yoshihiro Sugi Date: Tue, 19 Nov 2024 11:12:36 +0900 Subject: [PATCH 3/8] feat: Update API, based on the latest lexicon schemas (#256) * Update API, based on the latest lexicon schemas * Update codegen, replace `Option` to `core::option::Option` --- atrium-api/src/app/bsky/actor/defs.rs | 240 +++++++------- .../src/app/bsky/actor/get_suggestions.rs | 12 +- atrium-api/src/app/bsky/actor/profile.rs | 34 +- .../src/app/bsky/actor/search_actors.rs | 20 +- .../app/bsky/actor/search_actors_typeahead.rs | 12 +- atrium-api/src/app/bsky/embed/external.rs | 8 +- atrium-api/src/app/bsky/embed/images.rs | 8 +- atrium-api/src/app/bsky/embed/record.rs | 24 +- atrium-api/src/app/bsky/embed/video.rs | 24 +- atrium-api/src/app/bsky/feed/defs.rs | 158 ++++----- .../app/bsky/feed/describe_feed_generator.rs | 12 +- atrium-api/src/app/bsky/feed/generator.rs | 22 +- .../src/app/bsky/feed/get_actor_feeds.rs | 12 +- .../src/app/bsky/feed/get_actor_likes.rs | 12 +- .../src/app/bsky/feed/get_author_feed.rs | 20 +- atrium-api/src/app/bsky/feed/get_feed.rs | 12 +- .../src/app/bsky/feed/get_feed_skeleton.rs | 12 +- atrium-api/src/app/bsky/feed/get_likes.rs | 20 +- atrium-api/src/app/bsky/feed/get_list_feed.rs | 12 +- .../src/app/bsky/feed/get_post_thread.rs | 12 +- atrium-api/src/app/bsky/feed/get_quotes.rs | 20 +- .../src/app/bsky/feed/get_reposted_by.rs | 20 +- .../src/app/bsky/feed/get_suggested_feeds.rs | 12 +- atrium-api/src/app/bsky/feed/get_timeline.rs | 16 +- atrium-api/src/app/bsky/feed/post.rs | 28 +- atrium-api/src/app/bsky/feed/postgate.rs | 10 +- atrium-api/src/app/bsky/feed/search_posts.rs | 52 +-- atrium-api/src/app/bsky/feed/threadgate.rs | 8 +- atrium-api/src/app/bsky/graph.rs | 1 + atrium-api/src/app/bsky/graph/defs.rs | 102 +++--- .../app/bsky/graph/get_actor_starter_packs.rs | 12 +- atrium-api/src/app/bsky/graph/get_blocks.rs | 12 +- .../src/app/bsky/graph/get_followers.rs | 12 +- atrium-api/src/app/bsky/graph/get_follows.rs | 12 +- .../src/app/bsky/graph/get_known_followers.rs | 12 +- atrium-api/src/app/bsky/graph/get_list.rs | 12 +- .../src/app/bsky/graph/get_list_blocks.rs | 12 +- .../src/app/bsky/graph/get_list_mutes.rs | 12 +- atrium-api/src/app/bsky/graph/get_lists.rs | 12 +- atrium-api/src/app/bsky/graph/get_mutes.rs | 12 +- .../src/app/bsky/graph/get_relationships.rs | 8 +- .../graph/get_suggested_follows_by_actor.rs | 4 +- atrium-api/src/app/bsky/graph/list.rs | 18 +- .../app/bsky/graph/search_starter_packs.rs | 30 ++ atrium-api/src/app/bsky/graph/starterpack.rs | 14 +- atrium-api/src/app/bsky/labeler/defs.rs | 32 +- .../src/app/bsky/labeler/get_services.rs | 4 +- atrium-api/src/app/bsky/labeler/service.rs | 4 +- .../app/bsky/notification/get_unread_count.rs | 8 +- .../bsky/notification/list_notifications.rs | 36 +- atrium-api/src/app/bsky/unspecced.rs | 2 + atrium-api/src/app/bsky/unspecced/defs.rs | 6 + .../src/app/bsky/unspecced/get_config.rs | 18 + .../unspecced/get_popular_feed_generators.rs | 16 +- .../unspecced/get_suggestions_skeleton.rs | 24 +- .../bsky/unspecced/search_actors_skeleton.rs | 24 +- .../bsky/unspecced/search_posts_skeleton.rs | 56 ++-- .../search_starter_packs_skeleton.rs | 47 +++ atrium-api/src/app/bsky/video/defs.rs | 16 +- .../src/app/bsky/video/get_upload_limits.rs | 16 +- atrium-api/src/chat/bsky/actor/defs.rs | 26 +- atrium-api/src/chat/bsky/convo/defs.rs | 24 +- atrium-api/src/chat/bsky/convo/get_log.rs | 8 +- .../src/chat/bsky/convo/get_messages.rs | 12 +- atrium-api/src/chat/bsky/convo/list_convos.rs | 12 +- atrium-api/src/chat/bsky/convo/update_read.rs | 4 +- .../bsky/moderation/get_message_context.rs | 12 +- .../bsky/moderation/update_actor_access.rs | 4 +- atrium-api/src/client.rs | 204 ++++++++++++ atrium-api/src/com/atproto/admin/defs.rs | 51 +-- .../atproto/admin/disable_account_invites.rs | 4 +- .../com/atproto/admin/disable_invite_codes.rs | 8 +- .../atproto/admin/enable_account_invites.rs | 4 +- .../src/com/atproto/admin/get_invite_codes.rs | 16 +- .../com/atproto/admin/get_subject_status.rs | 20 +- .../src/com/atproto/admin/search_accounts.rs | 16 +- .../src/com/atproto/admin/send_email.rs | 8 +- .../atproto/admin/update_subject_status.rs | 12 +- .../get_recommended_did_credentials.rs | 16 +- .../atproto/identity/sign_plc_operation.rs | 20 +- atrium-api/src/com/atproto/label/defs.rs | 28 +- .../src/com/atproto/label/query_labels.rs | 16 +- .../src/com/atproto/label/subscribe_labels.rs | 8 +- .../com/atproto/moderation/create_report.rs | 8 +- .../src/com/atproto/repo/apply_writes.rs | 28 +- .../src/com/atproto/repo/create_record.rs | 20 +- .../src/com/atproto/repo/delete_record.rs | 12 +- atrium-api/src/com/atproto/repo/get_record.rs | 8 +- .../com/atproto/repo/list_missing_blobs.rs | 12 +- .../src/com/atproto/repo/list_records.rs | 24 +- atrium-api/src/com/atproto/repo/put_record.rs | 20 +- .../src/com/atproto/server/create_account.rs | 36 +- .../com/atproto/server/create_app_password.rs | 8 +- .../com/atproto/server/create_invite_code.rs | 4 +- .../com/atproto/server/create_invite_codes.rs | 4 +- .../src/com/atproto/server/create_session.rs | 28 +- .../com/atproto/server/deactivate_account.rs | 4 +- .../src/com/atproto/server/describe_server.rs | 28 +- .../server/get_account_invite_codes.rs | 8 +- .../com/atproto/server/get_service_auth.rs | 8 +- .../src/com/atproto/server/get_session.rs | 24 +- .../com/atproto/server/list_app_passwords.rs | 4 +- .../src/com/atproto/server/refresh_session.rs | 12 +- .../com/atproto/server/reserve_signing_key.rs | 4 +- .../src/com/atproto/server/update_email.rs | 8 +- atrium-api/src/com/atproto/sync/get_record.rs | 4 +- atrium-api/src/com/atproto/sync/get_repo.rs | 4 +- .../src/com/atproto/sync/get_repo_status.rs | 8 +- atrium-api/src/com/atproto/sync/list_blobs.rs | 16 +- atrium-api/src/com/atproto/sync/list_repos.rs | 20 +- .../src/com/atproto/sync/subscribe_repos.rs | 32 +- .../com/atproto/temp/check_signup_queue.rs | 8 +- .../src/com/atproto/temp/fetch_labels.rs | 8 +- atrium-api/src/tools/ozone.rs | 1 + .../ozone/communication/create_template.rs | 8 +- .../src/tools/ozone/communication/defs.rs | 8 +- .../ozone/communication/update_template.rs | 24 +- atrium-api/src/tools/ozone/moderation/defs.rs | 313 ++++++++++++------ .../src/tools/ozone/moderation/emit_event.rs | 16 +- .../src/tools/ozone/moderation/get_record.rs | 4 +- .../tools/ozone/moderation/query_events.rs | 76 +++-- .../tools/ozone/moderation/query_statuses.rs | 107 +++--- .../tools/ozone/moderation/search_repos.rs | 20 +- .../src/tools/ozone/server/get_config.rs | 28 +- atrium-api/src/tools/ozone/set/defs.rs | 8 +- atrium-api/src/tools/ozone/set/get_values.rs | 12 +- atrium-api/src/tools/ozone/set/query_sets.rs | 24 +- atrium-api/src/tools/ozone/setting.rs | 6 + atrium-api/src/tools/ozone/setting/defs.rs | 21 ++ .../src/tools/ozone/setting/list_options.rs | 36 ++ .../src/tools/ozone/setting/remove_options.rs | 22 ++ .../src/tools/ozone/setting/upsert_option.rs | 29 ++ .../ozone/signature/find_related_accounts.rs | 18 +- .../tools/ozone/signature/search_accounts.rs | 12 +- atrium-api/src/tools/ozone/team/defs.rs | 22 +- .../src/tools/ozone/team/list_members.rs | 12 +- .../src/tools/ozone/team/update_member.rs | 8 +- lexicon/atrium-codegen/src/token_stream.rs | 110 ++---- 138 files changed, 1949 insertions(+), 1399 deletions(-) create mode 100644 atrium-api/src/app/bsky/graph/search_starter_packs.rs create mode 100644 atrium-api/src/app/bsky/unspecced/get_config.rs create mode 100644 atrium-api/src/app/bsky/unspecced/search_starter_packs_skeleton.rs create mode 100644 atrium-api/src/tools/ozone/setting.rs create mode 100644 atrium-api/src/tools/ozone/setting/defs.rs create mode 100644 atrium-api/src/tools/ozone/setting/list_options.rs create mode 100644 atrium-api/src/tools/ozone/setting/remove_options.rs create mode 100644 atrium-api/src/tools/ozone/setting/upsert_option.rs diff --git a/atrium-api/src/app/bsky/actor/defs.rs b/atrium-api/src/app/bsky/actor/defs.rs index 0b7329bc..45a20bae 100644 --- a/atrium-api/src/app/bsky/actor/defs.rs +++ b/atrium-api/src/app/bsky/actor/defs.rs @@ -17,14 +17,14 @@ pub type BskyAppProgressGuide = crate::types::Object; #[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq)] #[serde(rename_all = "camelCase")] pub struct BskyAppStatePrefData { - #[serde(skip_serializing_if = "Option::is_none")] - pub active_progress_guide: Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub active_progress_guide: core::option::Option, ///Storage for NUXs the user has encountered. - #[serde(skip_serializing_if = "Option::is_none")] - pub nuxs: Option>, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub nuxs: core::option::Option>, ///An array of tokens which identify nudges (modals, popups, tours, highlight dots) that should be shown to the user. - #[serde(skip_serializing_if = "Option::is_none")] - pub queued_nudges: Option>, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub queued_nudges: core::option::Option>, } pub type BskyAppStatePref = crate::types::Object; #[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq)] @@ -32,8 +32,8 @@ pub type BskyAppStatePref = crate::types::Object; pub struct ContentLabelPrefData { pub label: String, ///Which labeler does this preference apply to? If undefined, applies globally. - #[serde(skip_serializing_if = "Option::is_none")] - pub labeler_did: Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub labeler_did: core::option::Option, pub visibility: String, } pub type ContentLabelPref = crate::types::Object; @@ -43,20 +43,20 @@ pub struct FeedViewPrefData { ///The URI of the feed, or an identifier which describes the feed. pub feed: String, ///Hide quote posts in the feed. - #[serde(skip_serializing_if = "Option::is_none")] - pub hide_quote_posts: Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub hide_quote_posts: core::option::Option, ///Hide replies in the feed. - #[serde(skip_serializing_if = "Option::is_none")] - pub hide_replies: Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub hide_replies: core::option::Option, ///Hide replies in the feed if they do not have this number of likes. - #[serde(skip_serializing_if = "Option::is_none")] - pub hide_replies_by_like_count: Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub hide_replies_by_like_count: core::option::Option, ///Hide replies in the feed if they are not by followed users. - #[serde(skip_serializing_if = "Option::is_none")] - pub hide_replies_by_unfollowed: Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub hide_replies_by_unfollowed: core::option::Option, ///Hide reposts in the feed. - #[serde(skip_serializing_if = "Option::is_none")] - pub hide_reposts: Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub hide_reposts: core::option::Option, } pub type FeedViewPref = crate::types::Object; #[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq)] @@ -98,13 +98,13 @@ pub type LabelersPref = crate::types::Object; #[serde(rename_all = "camelCase")] pub struct MutedWordData { ///Groups of users to apply the muted word to. If undefined, applies to all users. - #[serde(skip_serializing_if = "Option::is_none")] - pub actor_target: Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub actor_target: core::option::Option, ///The date and time at which the muted word will expire and no longer be applied. - #[serde(skip_serializing_if = "Option::is_none")] - pub expires_at: Option, - #[serde(skip_serializing_if = "Option::is_none")] - pub id: Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub expires_at: core::option::Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub id: core::option::Option, ///The intended targets of the muted word. pub targets: Vec, ///The muted word itself. @@ -125,11 +125,11 @@ pub type MutedWordsPref = crate::types::Object; pub struct NuxData { pub completed: bool, ///Arbitrary data for the NUX. The structure is defined by the NUX itself. Limited to 300 characters. - #[serde(skip_serializing_if = "Option::is_none")] - pub data: Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub data: core::option::Option, ///The date and time at which the NUX will expire and should be considered completed. - #[serde(skip_serializing_if = "Option::is_none")] - pub expires_at: Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub expires_at: core::option::Option, pub id: String, } pub type Nux = crate::types::Object; @@ -137,24 +137,24 @@ pub type Nux = crate::types::Object; #[serde(rename_all = "camelCase")] pub struct PersonalDetailsPrefData { ///The birth date of account owner. - #[serde(skip_serializing_if = "Option::is_none")] - pub birth_date: Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub birth_date: core::option::Option, } pub type PersonalDetailsPref = crate::types::Object; pub type Preferences = Vec>; #[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq)] #[serde(rename_all = "camelCase")] pub struct ProfileAssociatedData { - #[serde(skip_serializing_if = "Option::is_none")] - pub chat: Option, - #[serde(skip_serializing_if = "Option::is_none")] - pub feedgens: Option, - #[serde(skip_serializing_if = "Option::is_none")] - pub labeler: Option, - #[serde(skip_serializing_if = "Option::is_none")] - pub lists: Option, - #[serde(skip_serializing_if = "Option::is_none")] - pub starter_packs: Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub chat: core::option::Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub feedgens: core::option::Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub labeler: core::option::Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub lists: core::option::Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub starter_packs: core::option::Option, } pub type ProfileAssociated = crate::types::Object; #[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq)] @@ -166,80 +166,80 @@ pub type ProfileAssociatedChat = crate::types::Object #[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq)] #[serde(rename_all = "camelCase")] pub struct ProfileViewData { - #[serde(skip_serializing_if = "Option::is_none")] - pub associated: Option, - #[serde(skip_serializing_if = "Option::is_none")] - pub avatar: Option, - #[serde(skip_serializing_if = "Option::is_none")] - pub created_at: Option, - #[serde(skip_serializing_if = "Option::is_none")] - pub description: Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub associated: core::option::Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub avatar: core::option::Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub created_at: core::option::Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub description: core::option::Option, pub did: crate::types::string::Did, - #[serde(skip_serializing_if = "Option::is_none")] - pub display_name: Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub display_name: core::option::Option, pub handle: crate::types::string::Handle, - #[serde(skip_serializing_if = "Option::is_none")] - pub indexed_at: Option, - #[serde(skip_serializing_if = "Option::is_none")] - pub labels: Option>, - #[serde(skip_serializing_if = "Option::is_none")] - pub viewer: Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub indexed_at: core::option::Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub labels: core::option::Option>, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub viewer: core::option::Option, } pub type ProfileView = crate::types::Object; #[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq)] #[serde(rename_all = "camelCase")] pub struct ProfileViewBasicData { - #[serde(skip_serializing_if = "Option::is_none")] - pub associated: Option, - #[serde(skip_serializing_if = "Option::is_none")] - pub avatar: Option, - #[serde(skip_serializing_if = "Option::is_none")] - pub created_at: Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub associated: core::option::Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub avatar: core::option::Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub created_at: core::option::Option, pub did: crate::types::string::Did, - #[serde(skip_serializing_if = "Option::is_none")] - pub display_name: Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub display_name: core::option::Option, pub handle: crate::types::string::Handle, - #[serde(skip_serializing_if = "Option::is_none")] - pub labels: Option>, - #[serde(skip_serializing_if = "Option::is_none")] - pub viewer: Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub labels: core::option::Option>, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub viewer: core::option::Option, } pub type ProfileViewBasic = crate::types::Object; #[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq)] #[serde(rename_all = "camelCase")] pub struct ProfileViewDetailedData { - #[serde(skip_serializing_if = "Option::is_none")] - pub associated: Option, - #[serde(skip_serializing_if = "Option::is_none")] - pub avatar: Option, - #[serde(skip_serializing_if = "Option::is_none")] - pub banner: Option, - #[serde(skip_serializing_if = "Option::is_none")] - pub created_at: Option, - #[serde(skip_serializing_if = "Option::is_none")] - pub description: Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub associated: core::option::Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub avatar: core::option::Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub banner: core::option::Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub created_at: core::option::Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub description: core::option::Option, pub did: crate::types::string::Did, - #[serde(skip_serializing_if = "Option::is_none")] - pub display_name: Option, - #[serde(skip_serializing_if = "Option::is_none")] - pub followers_count: Option, - #[serde(skip_serializing_if = "Option::is_none")] - pub follows_count: Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub display_name: core::option::Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub followers_count: core::option::Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub follows_count: core::option::Option, pub handle: crate::types::string::Handle, - #[serde(skip_serializing_if = "Option::is_none")] - pub indexed_at: Option, - #[serde(skip_serializing_if = "Option::is_none")] - pub joined_via_starter_pack: Option< + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub indexed_at: core::option::Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub joined_via_starter_pack: core::option::Option< crate::app::bsky::graph::defs::StarterPackViewBasic, >, - #[serde(skip_serializing_if = "Option::is_none")] - pub labels: Option>, - #[serde(skip_serializing_if = "Option::is_none")] - pub pinned_post: Option, - #[serde(skip_serializing_if = "Option::is_none")] - pub posts_count: Option, - #[serde(skip_serializing_if = "Option::is_none")] - pub viewer: Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub labels: core::option::Option>, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub pinned_post: core::option::Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub posts_count: core::option::Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub viewer: core::option::Option, } pub type ProfileViewDetailed = crate::types::Object; #[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq)] @@ -256,8 +256,8 @@ pub type SavedFeed = crate::types::Object; pub struct SavedFeedsPrefData { pub pinned: Vec, pub saved: Vec, - #[serde(skip_serializing_if = "Option::is_none")] - pub timeline_index: Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub timeline_index: core::option::Option, } pub type SavedFeedsPref = crate::types::Object; #[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq)] @@ -270,33 +270,37 @@ pub type SavedFeedsPrefV2 = crate::types::Object; #[serde(rename_all = "camelCase")] pub struct ThreadViewPrefData { ///Show followed users at the top of all replies. - #[serde(skip_serializing_if = "Option::is_none")] - pub prioritize_followed_users: Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub prioritize_followed_users: core::option::Option, ///Sorting mode for threads. - #[serde(skip_serializing_if = "Option::is_none")] - pub sort: Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub sort: core::option::Option, } pub type ThreadViewPref = crate::types::Object; ///Metadata about the requesting account's relationship with the subject account. Only has meaningful content for authed requests. #[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq)] #[serde(rename_all = "camelCase")] pub struct ViewerStateData { - #[serde(skip_serializing_if = "Option::is_none")] - pub blocked_by: Option, - #[serde(skip_serializing_if = "Option::is_none")] - pub blocking: Option, - #[serde(skip_serializing_if = "Option::is_none")] - pub blocking_by_list: Option, - #[serde(skip_serializing_if = "Option::is_none")] - pub followed_by: Option, - #[serde(skip_serializing_if = "Option::is_none")] - pub following: Option, - #[serde(skip_serializing_if = "Option::is_none")] - pub known_followers: Option, - #[serde(skip_serializing_if = "Option::is_none")] - pub muted: Option, - #[serde(skip_serializing_if = "Option::is_none")] - pub muted_by_list: Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub blocked_by: core::option::Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub blocking: core::option::Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub blocking_by_list: core::option::Option< + crate::app::bsky::graph::defs::ListViewBasic, + >, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub followed_by: core::option::Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub following: core::option::Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub known_followers: core::option::Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub muted: core::option::Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub muted_by_list: core::option::Option< + crate::app::bsky::graph::defs::ListViewBasic, + >, } pub type ViewerState = crate::types::Object; #[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq)] diff --git a/atrium-api/src/app/bsky/actor/get_suggestions.rs b/atrium-api/src/app/bsky/actor/get_suggestions.rs index 6e743f35..529b4417 100644 --- a/atrium-api/src/app/bsky/actor/get_suggestions.rs +++ b/atrium-api/src/app/bsky/actor/get_suggestions.rs @@ -4,18 +4,18 @@ pub const NSID: &str = "app.bsky.actor.getSuggestions"; #[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq)] #[serde(rename_all = "camelCase")] pub struct ParametersData { - #[serde(skip_serializing_if = "Option::is_none")] - pub cursor: Option, - #[serde(skip_serializing_if = "Option::is_none")] - pub limit: Option>, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub cursor: core::option::Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub limit: core::option::Option>, } pub type Parameters = crate::types::Object; #[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq)] #[serde(rename_all = "camelCase")] pub struct OutputData { pub actors: Vec, - #[serde(skip_serializing_if = "Option::is_none")] - pub cursor: Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub cursor: core::option::Option, } pub type Output = crate::types::Object; #[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq)] diff --git a/atrium-api/src/app/bsky/actor/profile.rs b/atrium-api/src/app/bsky/actor/profile.rs index 4f6c170d..80619d3c 100644 --- a/atrium-api/src/app/bsky/actor/profile.rs +++ b/atrium-api/src/app/bsky/actor/profile.rs @@ -4,25 +4,27 @@ #[serde(rename_all = "camelCase")] pub struct RecordData { ///Small image to be displayed next to posts from account. AKA, 'profile picture' - #[serde(skip_serializing_if = "Option::is_none")] - pub avatar: Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub avatar: core::option::Option, ///Larger horizontal image to display behind profile view. - #[serde(skip_serializing_if = "Option::is_none")] - pub banner: Option, - #[serde(skip_serializing_if = "Option::is_none")] - pub created_at: Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub banner: core::option::Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub created_at: core::option::Option, ///Free-form profile description text. - #[serde(skip_serializing_if = "Option::is_none")] - pub description: Option, - #[serde(skip_serializing_if = "Option::is_none")] - pub display_name: Option, - #[serde(skip_serializing_if = "Option::is_none")] - pub joined_via_starter_pack: Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub description: core::option::Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub display_name: core::option::Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub joined_via_starter_pack: core::option::Option< + crate::com::atproto::repo::strong_ref::Main, + >, ///Self-label values, specific to the Bluesky application, on the overall account. - #[serde(skip_serializing_if = "Option::is_none")] - pub labels: Option>, - #[serde(skip_serializing_if = "Option::is_none")] - pub pinned_post: Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub labels: core::option::Option>, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub pinned_post: core::option::Option, } pub type Record = crate::types::Object; #[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq)] diff --git a/atrium-api/src/app/bsky/actor/search_actors.rs b/atrium-api/src/app/bsky/actor/search_actors.rs index d4c94880..6c15b9bb 100644 --- a/atrium-api/src/app/bsky/actor/search_actors.rs +++ b/atrium-api/src/app/bsky/actor/search_actors.rs @@ -4,24 +4,24 @@ pub const NSID: &str = "app.bsky.actor.searchActors"; #[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq)] #[serde(rename_all = "camelCase")] pub struct ParametersData { - #[serde(skip_serializing_if = "Option::is_none")] - pub cursor: Option, - #[serde(skip_serializing_if = "Option::is_none")] - pub limit: Option>, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub cursor: core::option::Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub limit: core::option::Option>, ///Search query string. Syntax, phrase, boolean, and faceting is unspecified, but Lucene query syntax is recommended. - #[serde(skip_serializing_if = "Option::is_none")] - pub q: Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub q: core::option::Option, ///DEPRECATED: use 'q' instead. - #[serde(skip_serializing_if = "Option::is_none")] - pub term: Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub term: core::option::Option, } pub type Parameters = crate::types::Object; #[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq)] #[serde(rename_all = "camelCase")] pub struct OutputData { pub actors: Vec, - #[serde(skip_serializing_if = "Option::is_none")] - pub cursor: Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub cursor: core::option::Option, } pub type Output = crate::types::Object; #[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq)] diff --git a/atrium-api/src/app/bsky/actor/search_actors_typeahead.rs b/atrium-api/src/app/bsky/actor/search_actors_typeahead.rs index f670197b..d88bfe86 100644 --- a/atrium-api/src/app/bsky/actor/search_actors_typeahead.rs +++ b/atrium-api/src/app/bsky/actor/search_actors_typeahead.rs @@ -4,14 +4,14 @@ pub const NSID: &str = "app.bsky.actor.searchActorsTypeahead"; #[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq)] #[serde(rename_all = "camelCase")] pub struct ParametersData { - #[serde(skip_serializing_if = "Option::is_none")] - pub limit: Option>, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub limit: core::option::Option>, ///Search query prefix; not a full query string. - #[serde(skip_serializing_if = "Option::is_none")] - pub q: Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub q: core::option::Option, ///DEPRECATED: use 'q' instead. - #[serde(skip_serializing_if = "Option::is_none")] - pub term: Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub term: core::option::Option, } pub type Parameters = crate::types::Object; #[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq)] diff --git a/atrium-api/src/app/bsky/embed/external.rs b/atrium-api/src/app/bsky/embed/external.rs index 0b761c6c..1028a512 100644 --- a/atrium-api/src/app/bsky/embed/external.rs +++ b/atrium-api/src/app/bsky/embed/external.rs @@ -11,8 +11,8 @@ pub type Main = crate::types::Object; #[serde(rename_all = "camelCase")] pub struct ExternalData { pub description: String, - #[serde(skip_serializing_if = "Option::is_none")] - pub thumb: Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub thumb: core::option::Option, pub title: String, pub uri: String, } @@ -27,8 +27,8 @@ pub type View = crate::types::Object; #[serde(rename_all = "camelCase")] pub struct ViewExternalData { pub description: String, - #[serde(skip_serializing_if = "Option::is_none")] - pub thumb: Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub thumb: core::option::Option, pub title: String, pub uri: String, } diff --git a/atrium-api/src/app/bsky/embed/images.rs b/atrium-api/src/app/bsky/embed/images.rs index 92a45a9b..1606906a 100644 --- a/atrium-api/src/app/bsky/embed/images.rs +++ b/atrium-api/src/app/bsky/embed/images.rs @@ -12,8 +12,8 @@ pub type Main = crate::types::Object; pub struct ImageData { ///Alt text description of the image, for accessibility. pub alt: String, - #[serde(skip_serializing_if = "Option::is_none")] - pub aspect_ratio: Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub aspect_ratio: core::option::Option, pub image: crate::types::BlobRef, } pub type Image = crate::types::Object; @@ -28,8 +28,8 @@ pub type View = crate::types::Object; pub struct ViewImageData { ///Alt text description of the image, for accessibility. pub alt: String, - #[serde(skip_serializing_if = "Option::is_none")] - pub aspect_ratio: Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub aspect_ratio: core::option::Option, ///Fully-qualified URL where a large version of the image can be fetched. May or may not be the exact original blob. For example, CDN location provided by the App View. pub fullsize: String, ///Fully-qualified URL where a thumbnail of the image can be fetched. For example, CDN location provided by the App View. diff --git a/atrium-api/src/app/bsky/embed/record.rs b/atrium-api/src/app/bsky/embed/record.rs index 2a44b3d8..0531a7ff 100644 --- a/atrium-api/src/app/bsky/embed/record.rs +++ b/atrium-api/src/app/bsky/embed/record.rs @@ -40,19 +40,19 @@ pub type ViewNotFound = crate::types::Object; pub struct ViewRecordData { pub author: crate::app::bsky::actor::defs::ProfileViewBasic, pub cid: crate::types::string::Cid, - #[serde(skip_serializing_if = "Option::is_none")] - pub embeds: Option>>, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub embeds: core::option::Option>>, pub indexed_at: crate::types::string::Datetime, - #[serde(skip_serializing_if = "Option::is_none")] - pub labels: Option>, - #[serde(skip_serializing_if = "Option::is_none")] - pub like_count: Option, - #[serde(skip_serializing_if = "Option::is_none")] - pub quote_count: Option, - #[serde(skip_serializing_if = "Option::is_none")] - pub reply_count: Option, - #[serde(skip_serializing_if = "Option::is_none")] - pub repost_count: Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub labels: core::option::Option>, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub like_count: core::option::Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub quote_count: core::option::Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub reply_count: core::option::Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub repost_count: core::option::Option, pub uri: String, ///The record data itself. pub value: crate::types::Unknown, diff --git a/atrium-api/src/app/bsky/embed/video.rs b/atrium-api/src/app/bsky/embed/video.rs index 83ee63b9..21da5fb3 100644 --- a/atrium-api/src/app/bsky/embed/video.rs +++ b/atrium-api/src/app/bsky/embed/video.rs @@ -5,12 +5,12 @@ #[serde(rename_all = "camelCase")] pub struct MainData { ///Alt text description of the video, for accessibility. - #[serde(skip_serializing_if = "Option::is_none")] - pub alt: Option, - #[serde(skip_serializing_if = "Option::is_none")] - pub aspect_ratio: Option, - #[serde(skip_serializing_if = "Option::is_none")] - pub captions: Option>, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub alt: core::option::Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub aspect_ratio: core::option::Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub captions: core::option::Option>, pub video: crate::types::BlobRef, } pub type Main = crate::types::Object; @@ -24,13 +24,13 @@ pub type Caption = crate::types::Object; #[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq)] #[serde(rename_all = "camelCase")] pub struct ViewData { - #[serde(skip_serializing_if = "Option::is_none")] - pub alt: Option, - #[serde(skip_serializing_if = "Option::is_none")] - pub aspect_ratio: Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub alt: core::option::Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub aspect_ratio: core::option::Option, pub cid: crate::types::string::Cid, pub playlist: String, - #[serde(skip_serializing_if = "Option::is_none")] - pub thumbnail: Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub thumbnail: core::option::Option, } pub type View = crate::types::Object; diff --git a/atrium-api/src/app/bsky/feed/defs.rs b/atrium-api/src/app/bsky/feed/defs.rs index 260df312..976f53fd 100644 --- a/atrium-api/src/app/bsky/feed/defs.rs +++ b/atrium-api/src/app/bsky/feed/defs.rs @@ -4,8 +4,8 @@ #[serde(rename_all = "camelCase")] pub struct BlockedAuthorData { pub did: crate::types::string::Did, - #[serde(skip_serializing_if = "Option::is_none")] - pub viewer: Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub viewer: core::option::Option, } pub type BlockedAuthor = crate::types::Object; #[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq)] @@ -28,57 +28,59 @@ pub const CLICKTHROUGH_REPOSTER: &str = "app.bsky.feed.defs#clickthroughReposter #[serde(rename_all = "camelCase")] pub struct FeedViewPostData { ///Context provided by feed generator that may be passed back alongside interactions. - #[serde(skip_serializing_if = "Option::is_none")] - pub feed_context: Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub feed_context: core::option::Option, pub post: PostView, - #[serde(skip_serializing_if = "Option::is_none")] - pub reason: Option>, - #[serde(skip_serializing_if = "Option::is_none")] - pub reply: Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub reason: core::option::Option>, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub reply: core::option::Option, } pub type FeedViewPost = crate::types::Object; #[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq)] #[serde(rename_all = "camelCase")] pub struct GeneratorViewData { - #[serde(skip_serializing_if = "Option::is_none")] - pub accepts_interactions: Option, - #[serde(skip_serializing_if = "Option::is_none")] - pub avatar: Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub accepts_interactions: core::option::Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub avatar: core::option::Option, pub cid: crate::types::string::Cid, pub creator: crate::app::bsky::actor::defs::ProfileView, - #[serde(skip_serializing_if = "Option::is_none")] - pub description: Option, - #[serde(skip_serializing_if = "Option::is_none")] - pub description_facets: Option>, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub description: core::option::Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub description_facets: core::option::Option< + Vec, + >, pub did: crate::types::string::Did, pub display_name: String, pub indexed_at: crate::types::string::Datetime, - #[serde(skip_serializing_if = "Option::is_none")] - pub labels: Option>, - #[serde(skip_serializing_if = "Option::is_none")] - pub like_count: Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub labels: core::option::Option>, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub like_count: core::option::Option, pub uri: String, - #[serde(skip_serializing_if = "Option::is_none")] - pub viewer: Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub viewer: core::option::Option, } pub type GeneratorView = crate::types::Object; #[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq)] #[serde(rename_all = "camelCase")] pub struct GeneratorViewerStateData { - #[serde(skip_serializing_if = "Option::is_none")] - pub like: Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub like: core::option::Option, } pub type GeneratorViewerState = crate::types::Object; #[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq)] #[serde(rename_all = "camelCase")] pub struct InteractionData { - #[serde(skip_serializing_if = "Option::is_none")] - pub event: Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub event: core::option::Option, ///Context on a feed item that was originally supplied by the feed generator on getFeedSkeleton. - #[serde(skip_serializing_if = "Option::is_none")] - pub feed_context: Option, - #[serde(skip_serializing_if = "Option::is_none")] - pub item: Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub feed_context: core::option::Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub item: core::option::Option, } pub type Interaction = crate::types::Object; ///User liked the feed item @@ -105,25 +107,25 @@ pub type NotFoundPost = crate::types::Object; pub struct PostViewData { pub author: crate::app::bsky::actor::defs::ProfileViewBasic, pub cid: crate::types::string::Cid, - #[serde(skip_serializing_if = "Option::is_none")] - pub embed: Option>, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub embed: core::option::Option>, pub indexed_at: crate::types::string::Datetime, - #[serde(skip_serializing_if = "Option::is_none")] - pub labels: Option>, - #[serde(skip_serializing_if = "Option::is_none")] - pub like_count: Option, - #[serde(skip_serializing_if = "Option::is_none")] - pub quote_count: Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub labels: core::option::Option>, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub like_count: core::option::Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub quote_count: core::option::Option, pub record: crate::types::Unknown, - #[serde(skip_serializing_if = "Option::is_none")] - pub reply_count: Option, - #[serde(skip_serializing_if = "Option::is_none")] - pub repost_count: Option, - #[serde(skip_serializing_if = "Option::is_none")] - pub threadgate: Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub reply_count: core::option::Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub repost_count: core::option::Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub threadgate: core::option::Option, pub uri: String, - #[serde(skip_serializing_if = "Option::is_none")] - pub viewer: Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub viewer: core::option::Option, } pub type PostView = crate::types::Object; #[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq)] @@ -141,8 +143,10 @@ pub type ReasonRepost = crate::types::Object; #[serde(rename_all = "camelCase")] pub struct ReplyRefData { ///When parent is a reply to another post, this is the author of that post. - #[serde(skip_serializing_if = "Option::is_none")] - pub grandparent_author: Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub grandparent_author: core::option::Option< + crate::app::bsky::actor::defs::ProfileViewBasic, + >, pub parent: crate::types::Union, pub root: crate::types::Union, } @@ -155,11 +159,11 @@ pub const REQUEST_MORE: &str = "app.bsky.feed.defs#requestMore"; #[serde(rename_all = "camelCase")] pub struct SkeletonFeedPostData { ///Context that will be passed through to client and may be passed to feed generator back alongside interactions. - #[serde(skip_serializing_if = "Option::is_none")] - pub feed_context: Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub feed_context: core::option::Option, pub post: String, - #[serde(skip_serializing_if = "Option::is_none")] - pub reason: Option>, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub reason: core::option::Option>, } pub type SkeletonFeedPost = crate::types::Object; #[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq)] @@ -175,42 +179,44 @@ pub type SkeletonReasonRepost = crate::types::Object; #[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq)] #[serde(rename_all = "camelCase")] pub struct ThreadViewPostData { - #[serde(skip_serializing_if = "Option::is_none")] - pub parent: Option>, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub parent: core::option::Option>, pub post: PostView, - #[serde(skip_serializing_if = "Option::is_none")] - pub replies: Option>>, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub replies: core::option::Option< + Vec>, + >, } pub type ThreadViewPost = crate::types::Object; #[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq)] #[serde(rename_all = "camelCase")] pub struct ThreadgateViewData { - #[serde(skip_serializing_if = "Option::is_none")] - pub cid: Option, - #[serde(skip_serializing_if = "Option::is_none")] - pub lists: Option>, - #[serde(skip_serializing_if = "Option::is_none")] - pub record: Option, - #[serde(skip_serializing_if = "Option::is_none")] - pub uri: Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub cid: core::option::Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub lists: core::option::Option>, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub record: core::option::Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub uri: core::option::Option, } pub type ThreadgateView = crate::types::Object; ///Metadata about the requesting account's relationship with the subject content. Only has meaningful content for authed requests. #[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq)] #[serde(rename_all = "camelCase")] pub struct ViewerStateData { - #[serde(skip_serializing_if = "Option::is_none")] - pub embedding_disabled: Option, - #[serde(skip_serializing_if = "Option::is_none")] - pub like: Option, - #[serde(skip_serializing_if = "Option::is_none")] - pub pinned: Option, - #[serde(skip_serializing_if = "Option::is_none")] - pub reply_disabled: Option, - #[serde(skip_serializing_if = "Option::is_none")] - pub repost: Option, - #[serde(skip_serializing_if = "Option::is_none")] - pub thread_muted: Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub embedding_disabled: core::option::Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub like: core::option::Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub pinned: core::option::Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub reply_disabled: core::option::Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub repost: core::option::Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub thread_muted: core::option::Option, } pub type ViewerState = crate::types::Object; #[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq)] diff --git a/atrium-api/src/app/bsky/feed/describe_feed_generator.rs b/atrium-api/src/app/bsky/feed/describe_feed_generator.rs index 05ace856..54c314ed 100644 --- a/atrium-api/src/app/bsky/feed/describe_feed_generator.rs +++ b/atrium-api/src/app/bsky/feed/describe_feed_generator.rs @@ -6,8 +6,8 @@ pub const NSID: &str = "app.bsky.feed.describeFeedGenerator"; pub struct OutputData { pub did: crate::types::string::Did, pub feeds: Vec, - #[serde(skip_serializing_if = "Option::is_none")] - pub links: Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub links: core::option::Option, } pub type Output = crate::types::Object; #[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq)] @@ -27,9 +27,9 @@ pub type Feed = crate::types::Object; #[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq)] #[serde(rename_all = "camelCase")] pub struct LinksData { - #[serde(skip_serializing_if = "Option::is_none")] - pub privacy_policy: Option, - #[serde(skip_serializing_if = "Option::is_none")] - pub terms_of_service: Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub privacy_policy: core::option::Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub terms_of_service: core::option::Option, } pub type Links = crate::types::Object; diff --git a/atrium-api/src/app/bsky/feed/generator.rs b/atrium-api/src/app/bsky/feed/generator.rs index cf10bd8b..5f47d96b 100644 --- a/atrium-api/src/app/bsky/feed/generator.rs +++ b/atrium-api/src/app/bsky/feed/generator.rs @@ -4,20 +4,22 @@ #[serde(rename_all = "camelCase")] pub struct RecordData { ///Declaration that a feed accepts feedback interactions from a client through app.bsky.feed.sendInteractions - #[serde(skip_serializing_if = "Option::is_none")] - pub accepts_interactions: Option, - #[serde(skip_serializing_if = "Option::is_none")] - pub avatar: Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub accepts_interactions: core::option::Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub avatar: core::option::Option, pub created_at: crate::types::string::Datetime, - #[serde(skip_serializing_if = "Option::is_none")] - pub description: Option, - #[serde(skip_serializing_if = "Option::is_none")] - pub description_facets: Option>, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub description: core::option::Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub description_facets: core::option::Option< + Vec, + >, pub did: crate::types::string::Did, pub display_name: String, ///Self-label values - #[serde(skip_serializing_if = "Option::is_none")] - pub labels: Option>, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub labels: core::option::Option>, } pub type Record = crate::types::Object; #[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq)] diff --git a/atrium-api/src/app/bsky/feed/get_actor_feeds.rs b/atrium-api/src/app/bsky/feed/get_actor_feeds.rs index 0a2cb5b8..ab376333 100644 --- a/atrium-api/src/app/bsky/feed/get_actor_feeds.rs +++ b/atrium-api/src/app/bsky/feed/get_actor_feeds.rs @@ -5,17 +5,17 @@ pub const NSID: &str = "app.bsky.feed.getActorFeeds"; #[serde(rename_all = "camelCase")] pub struct ParametersData { pub actor: crate::types::string::AtIdentifier, - #[serde(skip_serializing_if = "Option::is_none")] - pub cursor: Option, - #[serde(skip_serializing_if = "Option::is_none")] - pub limit: Option>, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub cursor: core::option::Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub limit: core::option::Option>, } pub type Parameters = crate::types::Object; #[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq)] #[serde(rename_all = "camelCase")] pub struct OutputData { - #[serde(skip_serializing_if = "Option::is_none")] - pub cursor: Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub cursor: core::option::Option, pub feeds: Vec, } pub type Output = crate::types::Object; diff --git a/atrium-api/src/app/bsky/feed/get_actor_likes.rs b/atrium-api/src/app/bsky/feed/get_actor_likes.rs index 5abd9344..91eb1d88 100644 --- a/atrium-api/src/app/bsky/feed/get_actor_likes.rs +++ b/atrium-api/src/app/bsky/feed/get_actor_likes.rs @@ -5,17 +5,17 @@ pub const NSID: &str = "app.bsky.feed.getActorLikes"; #[serde(rename_all = "camelCase")] pub struct ParametersData { pub actor: crate::types::string::AtIdentifier, - #[serde(skip_serializing_if = "Option::is_none")] - pub cursor: Option, - #[serde(skip_serializing_if = "Option::is_none")] - pub limit: Option>, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub cursor: core::option::Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub limit: core::option::Option>, } pub type Parameters = crate::types::Object; #[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq)] #[serde(rename_all = "camelCase")] pub struct OutputData { - #[serde(skip_serializing_if = "Option::is_none")] - pub cursor: Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub cursor: core::option::Option, pub feed: Vec, } pub type Output = crate::types::Object; diff --git a/atrium-api/src/app/bsky/feed/get_author_feed.rs b/atrium-api/src/app/bsky/feed/get_author_feed.rs index 4a0753bd..16ae21e1 100644 --- a/atrium-api/src/app/bsky/feed/get_author_feed.rs +++ b/atrium-api/src/app/bsky/feed/get_author_feed.rs @@ -5,22 +5,22 @@ pub const NSID: &str = "app.bsky.feed.getAuthorFeed"; #[serde(rename_all = "camelCase")] pub struct ParametersData { pub actor: crate::types::string::AtIdentifier, - #[serde(skip_serializing_if = "Option::is_none")] - pub cursor: Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub cursor: core::option::Option, ///Combinations of post/repost types to include in response. - #[serde(skip_serializing_if = "Option::is_none")] - pub filter: Option, - #[serde(skip_serializing_if = "Option::is_none")] - pub include_pins: Option, - #[serde(skip_serializing_if = "Option::is_none")] - pub limit: Option>, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub filter: core::option::Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub include_pins: core::option::Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub limit: core::option::Option>, } pub type Parameters = crate::types::Object; #[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq)] #[serde(rename_all = "camelCase")] pub struct OutputData { - #[serde(skip_serializing_if = "Option::is_none")] - pub cursor: Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub cursor: core::option::Option, pub feed: Vec, } pub type Output = crate::types::Object; diff --git a/atrium-api/src/app/bsky/feed/get_feed.rs b/atrium-api/src/app/bsky/feed/get_feed.rs index 33fbbf75..62f2d936 100644 --- a/atrium-api/src/app/bsky/feed/get_feed.rs +++ b/atrium-api/src/app/bsky/feed/get_feed.rs @@ -4,18 +4,18 @@ pub const NSID: &str = "app.bsky.feed.getFeed"; #[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq)] #[serde(rename_all = "camelCase")] pub struct ParametersData { - #[serde(skip_serializing_if = "Option::is_none")] - pub cursor: Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub cursor: core::option::Option, pub feed: String, - #[serde(skip_serializing_if = "Option::is_none")] - pub limit: Option>, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub limit: core::option::Option>, } pub type Parameters = crate::types::Object; #[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq)] #[serde(rename_all = "camelCase")] pub struct OutputData { - #[serde(skip_serializing_if = "Option::is_none")] - pub cursor: Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub cursor: core::option::Option, pub feed: Vec, } pub type Output = crate::types::Object; diff --git a/atrium-api/src/app/bsky/feed/get_feed_skeleton.rs b/atrium-api/src/app/bsky/feed/get_feed_skeleton.rs index 8d38c11b..9057288c 100644 --- a/atrium-api/src/app/bsky/feed/get_feed_skeleton.rs +++ b/atrium-api/src/app/bsky/feed/get_feed_skeleton.rs @@ -4,19 +4,19 @@ pub const NSID: &str = "app.bsky.feed.getFeedSkeleton"; #[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq)] #[serde(rename_all = "camelCase")] pub struct ParametersData { - #[serde(skip_serializing_if = "Option::is_none")] - pub cursor: Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub cursor: core::option::Option, ///Reference to feed generator record describing the specific feed being requested. pub feed: String, - #[serde(skip_serializing_if = "Option::is_none")] - pub limit: Option>, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub limit: core::option::Option>, } pub type Parameters = crate::types::Object; #[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq)] #[serde(rename_all = "camelCase")] pub struct OutputData { - #[serde(skip_serializing_if = "Option::is_none")] - pub cursor: Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub cursor: core::option::Option, pub feed: Vec, } pub type Output = crate::types::Object; diff --git a/atrium-api/src/app/bsky/feed/get_likes.rs b/atrium-api/src/app/bsky/feed/get_likes.rs index 22a1e384..e6f05b0a 100644 --- a/atrium-api/src/app/bsky/feed/get_likes.rs +++ b/atrium-api/src/app/bsky/feed/get_likes.rs @@ -5,12 +5,12 @@ pub const NSID: &str = "app.bsky.feed.getLikes"; #[serde(rename_all = "camelCase")] pub struct ParametersData { ///CID of the subject record (aka, specific version of record), to filter likes. - #[serde(skip_serializing_if = "Option::is_none")] - pub cid: Option, - #[serde(skip_serializing_if = "Option::is_none")] - pub cursor: Option, - #[serde(skip_serializing_if = "Option::is_none")] - pub limit: Option>, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub cid: core::option::Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub cursor: core::option::Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub limit: core::option::Option>, ///AT-URI of the subject (eg, a post record). pub uri: String, } @@ -18,10 +18,10 @@ pub type Parameters = crate::types::Object; #[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq)] #[serde(rename_all = "camelCase")] pub struct OutputData { - #[serde(skip_serializing_if = "Option::is_none")] - pub cid: Option, - #[serde(skip_serializing_if = "Option::is_none")] - pub cursor: Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub cid: core::option::Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub cursor: core::option::Option, pub likes: Vec, pub uri: String, } diff --git a/atrium-api/src/app/bsky/feed/get_list_feed.rs b/atrium-api/src/app/bsky/feed/get_list_feed.rs index ccc01f1c..4c8ce550 100644 --- a/atrium-api/src/app/bsky/feed/get_list_feed.rs +++ b/atrium-api/src/app/bsky/feed/get_list_feed.rs @@ -4,10 +4,10 @@ pub const NSID: &str = "app.bsky.feed.getListFeed"; #[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq)] #[serde(rename_all = "camelCase")] pub struct ParametersData { - #[serde(skip_serializing_if = "Option::is_none")] - pub cursor: Option, - #[serde(skip_serializing_if = "Option::is_none")] - pub limit: Option>, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub cursor: core::option::Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub limit: core::option::Option>, ///Reference (AT-URI) to the list record. pub list: String, } @@ -15,8 +15,8 @@ pub type Parameters = crate::types::Object; #[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq)] #[serde(rename_all = "camelCase")] pub struct OutputData { - #[serde(skip_serializing_if = "Option::is_none")] - pub cursor: Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub cursor: core::option::Option, pub feed: Vec, } pub type Output = crate::types::Object; diff --git a/atrium-api/src/app/bsky/feed/get_post_thread.rs b/atrium-api/src/app/bsky/feed/get_post_thread.rs index a3ff1fd5..0a3ec8a4 100644 --- a/atrium-api/src/app/bsky/feed/get_post_thread.rs +++ b/atrium-api/src/app/bsky/feed/get_post_thread.rs @@ -5,11 +5,11 @@ pub const NSID: &str = "app.bsky.feed.getPostThread"; #[serde(rename_all = "camelCase")] pub struct ParametersData { ///How many levels of reply depth should be included in response. - #[serde(skip_serializing_if = "Option::is_none")] - pub depth: Option>, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub depth: core::option::Option>, ///How many levels of parent (and grandparent, etc) post to include. - #[serde(skip_serializing_if = "Option::is_none")] - pub parent_height: Option>, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub parent_height: core::option::Option>, ///Reference (AT-URI) to post record. pub uri: String, } @@ -18,8 +18,8 @@ pub type Parameters = crate::types::Object; #[serde(rename_all = "camelCase")] pub struct OutputData { pub thread: crate::types::Union, - #[serde(skip_serializing_if = "Option::is_none")] - pub threadgate: Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub threadgate: core::option::Option, } pub type Output = crate::types::Object; #[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq)] diff --git a/atrium-api/src/app/bsky/feed/get_quotes.rs b/atrium-api/src/app/bsky/feed/get_quotes.rs index f2a9c31e..06669d01 100644 --- a/atrium-api/src/app/bsky/feed/get_quotes.rs +++ b/atrium-api/src/app/bsky/feed/get_quotes.rs @@ -5,12 +5,12 @@ pub const NSID: &str = "app.bsky.feed.getQuotes"; #[serde(rename_all = "camelCase")] pub struct ParametersData { ///If supplied, filters to quotes of specific version (by CID) of the post record. - #[serde(skip_serializing_if = "Option::is_none")] - pub cid: Option, - #[serde(skip_serializing_if = "Option::is_none")] - pub cursor: Option, - #[serde(skip_serializing_if = "Option::is_none")] - pub limit: Option>, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub cid: core::option::Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub cursor: core::option::Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub limit: core::option::Option>, ///Reference (AT-URI) of post record pub uri: String, } @@ -18,10 +18,10 @@ pub type Parameters = crate::types::Object; #[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq)] #[serde(rename_all = "camelCase")] pub struct OutputData { - #[serde(skip_serializing_if = "Option::is_none")] - pub cid: Option, - #[serde(skip_serializing_if = "Option::is_none")] - pub cursor: Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub cid: core::option::Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub cursor: core::option::Option, pub posts: Vec, pub uri: String, } diff --git a/atrium-api/src/app/bsky/feed/get_reposted_by.rs b/atrium-api/src/app/bsky/feed/get_reposted_by.rs index 841b7f94..585f8a31 100644 --- a/atrium-api/src/app/bsky/feed/get_reposted_by.rs +++ b/atrium-api/src/app/bsky/feed/get_reposted_by.rs @@ -5,12 +5,12 @@ pub const NSID: &str = "app.bsky.feed.getRepostedBy"; #[serde(rename_all = "camelCase")] pub struct ParametersData { ///If supplied, filters to reposts of specific version (by CID) of the post record. - #[serde(skip_serializing_if = "Option::is_none")] - pub cid: Option, - #[serde(skip_serializing_if = "Option::is_none")] - pub cursor: Option, - #[serde(skip_serializing_if = "Option::is_none")] - pub limit: Option>, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub cid: core::option::Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub cursor: core::option::Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub limit: core::option::Option>, ///Reference (AT-URI) of post record pub uri: String, } @@ -18,10 +18,10 @@ pub type Parameters = crate::types::Object; #[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq)] #[serde(rename_all = "camelCase")] pub struct OutputData { - #[serde(skip_serializing_if = "Option::is_none")] - pub cid: Option, - #[serde(skip_serializing_if = "Option::is_none")] - pub cursor: Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub cid: core::option::Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub cursor: core::option::Option, pub reposted_by: Vec, pub uri: String, } diff --git a/atrium-api/src/app/bsky/feed/get_suggested_feeds.rs b/atrium-api/src/app/bsky/feed/get_suggested_feeds.rs index 9a4ee1b3..d2d510fe 100644 --- a/atrium-api/src/app/bsky/feed/get_suggested_feeds.rs +++ b/atrium-api/src/app/bsky/feed/get_suggested_feeds.rs @@ -4,17 +4,17 @@ pub const NSID: &str = "app.bsky.feed.getSuggestedFeeds"; #[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq)] #[serde(rename_all = "camelCase")] pub struct ParametersData { - #[serde(skip_serializing_if = "Option::is_none")] - pub cursor: Option, - #[serde(skip_serializing_if = "Option::is_none")] - pub limit: Option>, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub cursor: core::option::Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub limit: core::option::Option>, } pub type Parameters = crate::types::Object; #[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq)] #[serde(rename_all = "camelCase")] pub struct OutputData { - #[serde(skip_serializing_if = "Option::is_none")] - pub cursor: Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub cursor: core::option::Option, pub feeds: Vec, } pub type Output = crate::types::Object; diff --git a/atrium-api/src/app/bsky/feed/get_timeline.rs b/atrium-api/src/app/bsky/feed/get_timeline.rs index 69770c92..2623cd17 100644 --- a/atrium-api/src/app/bsky/feed/get_timeline.rs +++ b/atrium-api/src/app/bsky/feed/get_timeline.rs @@ -5,19 +5,19 @@ pub const NSID: &str = "app.bsky.feed.getTimeline"; #[serde(rename_all = "camelCase")] pub struct ParametersData { ///Variant 'algorithm' for timeline. Implementation-specific. NOTE: most feed flexibility has been moved to feed generator mechanism. - #[serde(skip_serializing_if = "Option::is_none")] - pub algorithm: Option, - #[serde(skip_serializing_if = "Option::is_none")] - pub cursor: Option, - #[serde(skip_serializing_if = "Option::is_none")] - pub limit: Option>, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub algorithm: core::option::Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub cursor: core::option::Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub limit: core::option::Option>, } pub type Parameters = crate::types::Object; #[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq)] #[serde(rename_all = "camelCase")] pub struct OutputData { - #[serde(skip_serializing_if = "Option::is_none")] - pub cursor: Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub cursor: core::option::Option, pub feed: Vec, } pub type Output = crate::types::Object; diff --git a/atrium-api/src/app/bsky/feed/post.rs b/atrium-api/src/app/bsky/feed/post.rs index 078839a2..638cd2b1 100644 --- a/atrium-api/src/app/bsky/feed/post.rs +++ b/atrium-api/src/app/bsky/feed/post.rs @@ -5,25 +5,25 @@ pub struct RecordData { ///Client-declared timestamp when this post was originally created. pub created_at: crate::types::string::Datetime, - #[serde(skip_serializing_if = "Option::is_none")] - pub embed: Option>, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub embed: core::option::Option>, ///DEPRECATED: replaced by app.bsky.richtext.facet. - #[serde(skip_serializing_if = "Option::is_none")] - pub entities: Option>, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub entities: core::option::Option>, ///Annotations of text (mentions, URLs, hashtags, etc) - #[serde(skip_serializing_if = "Option::is_none")] - pub facets: Option>, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub facets: core::option::Option>, ///Self-label values for this post. Effectively content warnings. - #[serde(skip_serializing_if = "Option::is_none")] - pub labels: Option>, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub labels: core::option::Option>, ///Indicates human language of post primary text content. - #[serde(skip_serializing_if = "Option::is_none")] - pub langs: Option>, - #[serde(skip_serializing_if = "Option::is_none")] - pub reply: Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub langs: core::option::Option>, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub reply: core::option::Option, ///Additional hashtags, in addition to any included in post text and facets. - #[serde(skip_serializing_if = "Option::is_none")] - pub tags: Option>, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub tags: core::option::Option>, ///The primary post content. May be an empty string, if there are embeds. pub text: String, } diff --git a/atrium-api/src/app/bsky/feed/postgate.rs b/atrium-api/src/app/bsky/feed/postgate.rs index 119490bb..9948ea39 100644 --- a/atrium-api/src/app/bsky/feed/postgate.rs +++ b/atrium-api/src/app/bsky/feed/postgate.rs @@ -5,10 +5,12 @@ pub struct RecordData { pub created_at: crate::types::string::Datetime, ///List of AT-URIs embedding this post that the author has detached from. - #[serde(skip_serializing_if = "Option::is_none")] - pub detached_embedding_uris: Option>, - #[serde(skip_serializing_if = "Option::is_none")] - pub embedding_rules: Option>>, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub detached_embedding_uris: core::option::Option>, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub embedding_rules: core::option::Option< + Vec>, + >, ///Reference (AT-URI) to the post record. pub post: String, } diff --git a/atrium-api/src/app/bsky/feed/search_posts.rs b/atrium-api/src/app/bsky/feed/search_posts.rs index 980fec7e..649e68de 100644 --- a/atrium-api/src/app/bsky/feed/search_posts.rs +++ b/atrium-api/src/app/bsky/feed/search_posts.rs @@ -5,49 +5,49 @@ pub const NSID: &str = "app.bsky.feed.searchPosts"; #[serde(rename_all = "camelCase")] pub struct ParametersData { ///Filter to posts by the given account. Handles are resolved to DID before query-time. - #[serde(skip_serializing_if = "Option::is_none")] - pub author: Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub author: core::option::Option, ///Optional pagination mechanism; may not necessarily allow scrolling through entire result set. - #[serde(skip_serializing_if = "Option::is_none")] - pub cursor: Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub cursor: core::option::Option, ///Filter to posts with URLs (facet links or embeds) linking to the given domain (hostname). Server may apply hostname normalization. - #[serde(skip_serializing_if = "Option::is_none")] - pub domain: Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub domain: core::option::Option, ///Filter to posts in the given language. Expected to be based on post language field, though server may override language detection. - #[serde(skip_serializing_if = "Option::is_none")] - pub lang: Option, - #[serde(skip_serializing_if = "Option::is_none")] - pub limit: Option>, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub lang: core::option::Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub limit: core::option::Option>, ///Filter to posts which mention the given account. Handles are resolved to DID before query-time. Only matches rich-text facet mentions. - #[serde(skip_serializing_if = "Option::is_none")] - pub mentions: Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub mentions: core::option::Option, ///Search query string; syntax, phrase, boolean, and faceting is unspecified, but Lucene query syntax is recommended. pub q: String, ///Filter results for posts after the indicated datetime (inclusive). Expected to use 'sortAt' timestamp, which may not match 'createdAt'. Can be a datetime, or just an ISO date (YYYY-MM-DD). - #[serde(skip_serializing_if = "Option::is_none")] - pub since: Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub since: core::option::Option, ///Specifies the ranking order of results. - #[serde(skip_serializing_if = "Option::is_none")] - pub sort: Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub sort: core::option::Option, ///Filter to posts with the given tag (hashtag), based on rich-text facet or tag field. Do not include the hash (#) prefix. Multiple tags can be specified, with 'AND' matching. - #[serde(skip_serializing_if = "Option::is_none")] - pub tag: Option>, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub tag: core::option::Option>, ///Filter results for posts before the indicated datetime (not inclusive). Expected to use 'sortAt' timestamp, which may not match 'createdAt'. Can be a datetime, or just an ISO date (YYY-MM-DD). - #[serde(skip_serializing_if = "Option::is_none")] - pub until: Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub until: core::option::Option, ///Filter to posts with links (facet links or embeds) pointing to this URL. Server may apply URL normalization or fuzzy matching. - #[serde(skip_serializing_if = "Option::is_none")] - pub url: Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub url: core::option::Option, } pub type Parameters = crate::types::Object; #[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq)] #[serde(rename_all = "camelCase")] pub struct OutputData { - #[serde(skip_serializing_if = "Option::is_none")] - pub cursor: Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub cursor: core::option::Option, ///Count of search hits. Optional, may be rounded/truncated, and may not be possible to paginate through all hits. - #[serde(skip_serializing_if = "Option::is_none")] - pub hits_total: Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub hits_total: core::option::Option, pub posts: Vec, } pub type Output = crate::types::Object; diff --git a/atrium-api/src/app/bsky/feed/threadgate.rs b/atrium-api/src/app/bsky/feed/threadgate.rs index 6d9d21af..fb5b93cc 100644 --- a/atrium-api/src/app/bsky/feed/threadgate.rs +++ b/atrium-api/src/app/bsky/feed/threadgate.rs @@ -3,12 +3,12 @@ #[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq)] #[serde(rename_all = "camelCase")] pub struct RecordData { - #[serde(skip_serializing_if = "Option::is_none")] - pub allow: Option>>, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub allow: core::option::Option>>, pub created_at: crate::types::string::Datetime, ///List of hidden reply URIs. - #[serde(skip_serializing_if = "Option::is_none")] - pub hidden_replies: Option>, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub hidden_replies: core::option::Option>, ///Reference (AT-URI) to the post record. pub post: String, } diff --git a/atrium-api/src/app/bsky/graph.rs b/atrium-api/src/app/bsky/graph.rs index a4e7ee2b..e859bab5 100644 --- a/atrium-api/src/app/bsky/graph.rs +++ b/atrium-api/src/app/bsky/graph.rs @@ -23,6 +23,7 @@ pub mod listitem; pub mod mute_actor; pub mod mute_actor_list; pub mod mute_thread; +pub mod search_starter_packs; pub mod starterpack; pub mod unmute_actor; pub mod unmute_actor_list; diff --git a/atrium-api/src/app/bsky/graph/defs.rs b/atrium-api/src/app/bsky/graph/defs.rs index 0bd0a50b..8efb62e4 100644 --- a/atrium-api/src/app/bsky/graph/defs.rs +++ b/atrium-api/src/app/bsky/graph/defs.rs @@ -13,52 +13,54 @@ pub type ListPurpose = String; #[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq)] #[serde(rename_all = "camelCase")] pub struct ListViewData { - #[serde(skip_serializing_if = "Option::is_none")] - pub avatar: Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub avatar: core::option::Option, pub cid: crate::types::string::Cid, pub creator: crate::app::bsky::actor::defs::ProfileView, - #[serde(skip_serializing_if = "Option::is_none")] - pub description: Option, - #[serde(skip_serializing_if = "Option::is_none")] - pub description_facets: Option>, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub description: core::option::Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub description_facets: core::option::Option< + Vec, + >, pub indexed_at: crate::types::string::Datetime, - #[serde(skip_serializing_if = "Option::is_none")] - pub labels: Option>, - #[serde(skip_serializing_if = "Option::is_none")] - pub list_item_count: Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub labels: core::option::Option>, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub list_item_count: core::option::Option, pub name: String, pub purpose: ListPurpose, pub uri: String, - #[serde(skip_serializing_if = "Option::is_none")] - pub viewer: Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub viewer: core::option::Option, } pub type ListView = crate::types::Object; #[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq)] #[serde(rename_all = "camelCase")] pub struct ListViewBasicData { - #[serde(skip_serializing_if = "Option::is_none")] - pub avatar: Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub avatar: core::option::Option, pub cid: crate::types::string::Cid, - #[serde(skip_serializing_if = "Option::is_none")] - pub indexed_at: Option, - #[serde(skip_serializing_if = "Option::is_none")] - pub labels: Option>, - #[serde(skip_serializing_if = "Option::is_none")] - pub list_item_count: Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub indexed_at: core::option::Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub labels: core::option::Option>, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub list_item_count: core::option::Option, pub name: String, pub purpose: ListPurpose, pub uri: String, - #[serde(skip_serializing_if = "Option::is_none")] - pub viewer: Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub viewer: core::option::Option, } pub type ListViewBasic = crate::types::Object; #[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq)] #[serde(rename_all = "camelCase")] pub struct ListViewerStateData { - #[serde(skip_serializing_if = "Option::is_none")] - pub blocked: Option, - #[serde(skip_serializing_if = "Option::is_none")] - pub muted: Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub blocked: core::option::Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub muted: core::option::Option, } pub type ListViewerState = crate::types::Object; ///A list of actors to apply an aggregate moderation action (mute/block) on. @@ -79,11 +81,11 @@ pub const REFERENCELIST: &str = "app.bsky.graph.defs#referencelist"; pub struct RelationshipData { pub did: crate::types::string::Did, ///if the actor is followed by this DID, contains the AT-URI of the follow record - #[serde(skip_serializing_if = "Option::is_none")] - pub followed_by: Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub followed_by: core::option::Option, ///if the actor follows this DID, this is the AT-URI of the follow record - #[serde(skip_serializing_if = "Option::is_none")] - pub following: Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub following: core::option::Option, } pub type Relationship = crate::types::Object; #[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq)] @@ -91,19 +93,19 @@ pub type Relationship = crate::types::Object; pub struct StarterPackViewData { pub cid: crate::types::string::Cid, pub creator: crate::app::bsky::actor::defs::ProfileViewBasic, - #[serde(skip_serializing_if = "Option::is_none")] - pub feeds: Option>, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub feeds: core::option::Option>, pub indexed_at: crate::types::string::Datetime, - #[serde(skip_serializing_if = "Option::is_none")] - pub joined_all_time_count: Option, - #[serde(skip_serializing_if = "Option::is_none")] - pub joined_week_count: Option, - #[serde(skip_serializing_if = "Option::is_none")] - pub labels: Option>, - #[serde(skip_serializing_if = "Option::is_none")] - pub list: Option, - #[serde(skip_serializing_if = "Option::is_none")] - pub list_items_sample: Option>, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub joined_all_time_count: core::option::Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub joined_week_count: core::option::Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub labels: core::option::Option>, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub list: core::option::Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub list_items_sample: core::option::Option>, pub record: crate::types::Unknown, pub uri: String, } @@ -114,14 +116,14 @@ pub struct StarterPackViewBasicData { pub cid: crate::types::string::Cid, pub creator: crate::app::bsky::actor::defs::ProfileViewBasic, pub indexed_at: crate::types::string::Datetime, - #[serde(skip_serializing_if = "Option::is_none")] - pub joined_all_time_count: Option, - #[serde(skip_serializing_if = "Option::is_none")] - pub joined_week_count: Option, - #[serde(skip_serializing_if = "Option::is_none")] - pub labels: Option>, - #[serde(skip_serializing_if = "Option::is_none")] - pub list_item_count: Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub joined_all_time_count: core::option::Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub joined_week_count: core::option::Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub labels: core::option::Option>, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub list_item_count: core::option::Option, pub record: crate::types::Unknown, pub uri: String, } diff --git a/atrium-api/src/app/bsky/graph/get_actor_starter_packs.rs b/atrium-api/src/app/bsky/graph/get_actor_starter_packs.rs index 7733e6dc..5b00ae09 100644 --- a/atrium-api/src/app/bsky/graph/get_actor_starter_packs.rs +++ b/atrium-api/src/app/bsky/graph/get_actor_starter_packs.rs @@ -5,17 +5,17 @@ pub const NSID: &str = "app.bsky.graph.getActorStarterPacks"; #[serde(rename_all = "camelCase")] pub struct ParametersData { pub actor: crate::types::string::AtIdentifier, - #[serde(skip_serializing_if = "Option::is_none")] - pub cursor: Option, - #[serde(skip_serializing_if = "Option::is_none")] - pub limit: Option>, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub cursor: core::option::Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub limit: core::option::Option>, } pub type Parameters = crate::types::Object; #[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq)] #[serde(rename_all = "camelCase")] pub struct OutputData { - #[serde(skip_serializing_if = "Option::is_none")] - pub cursor: Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub cursor: core::option::Option, pub starter_packs: Vec, } pub type Output = crate::types::Object; diff --git a/atrium-api/src/app/bsky/graph/get_blocks.rs b/atrium-api/src/app/bsky/graph/get_blocks.rs index 2fea12a4..ee4d151c 100644 --- a/atrium-api/src/app/bsky/graph/get_blocks.rs +++ b/atrium-api/src/app/bsky/graph/get_blocks.rs @@ -4,18 +4,18 @@ pub const NSID: &str = "app.bsky.graph.getBlocks"; #[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq)] #[serde(rename_all = "camelCase")] pub struct ParametersData { - #[serde(skip_serializing_if = "Option::is_none")] - pub cursor: Option, - #[serde(skip_serializing_if = "Option::is_none")] - pub limit: Option>, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub cursor: core::option::Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub limit: core::option::Option>, } pub type Parameters = crate::types::Object; #[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq)] #[serde(rename_all = "camelCase")] pub struct OutputData { pub blocks: Vec, - #[serde(skip_serializing_if = "Option::is_none")] - pub cursor: Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub cursor: core::option::Option, } pub type Output = crate::types::Object; #[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq)] diff --git a/atrium-api/src/app/bsky/graph/get_followers.rs b/atrium-api/src/app/bsky/graph/get_followers.rs index b459e95d..dfbd7546 100644 --- a/atrium-api/src/app/bsky/graph/get_followers.rs +++ b/atrium-api/src/app/bsky/graph/get_followers.rs @@ -5,17 +5,17 @@ pub const NSID: &str = "app.bsky.graph.getFollowers"; #[serde(rename_all = "camelCase")] pub struct ParametersData { pub actor: crate::types::string::AtIdentifier, - #[serde(skip_serializing_if = "Option::is_none")] - pub cursor: Option, - #[serde(skip_serializing_if = "Option::is_none")] - pub limit: Option>, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub cursor: core::option::Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub limit: core::option::Option>, } pub type Parameters = crate::types::Object; #[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq)] #[serde(rename_all = "camelCase")] pub struct OutputData { - #[serde(skip_serializing_if = "Option::is_none")] - pub cursor: Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub cursor: core::option::Option, pub followers: Vec, pub subject: crate::app::bsky::actor::defs::ProfileView, } diff --git a/atrium-api/src/app/bsky/graph/get_follows.rs b/atrium-api/src/app/bsky/graph/get_follows.rs index 18933900..9f9a0067 100644 --- a/atrium-api/src/app/bsky/graph/get_follows.rs +++ b/atrium-api/src/app/bsky/graph/get_follows.rs @@ -5,17 +5,17 @@ pub const NSID: &str = "app.bsky.graph.getFollows"; #[serde(rename_all = "camelCase")] pub struct ParametersData { pub actor: crate::types::string::AtIdentifier, - #[serde(skip_serializing_if = "Option::is_none")] - pub cursor: Option, - #[serde(skip_serializing_if = "Option::is_none")] - pub limit: Option>, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub cursor: core::option::Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub limit: core::option::Option>, } pub type Parameters = crate::types::Object; #[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq)] #[serde(rename_all = "camelCase")] pub struct OutputData { - #[serde(skip_serializing_if = "Option::is_none")] - pub cursor: Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub cursor: core::option::Option, pub follows: Vec, pub subject: crate::app::bsky::actor::defs::ProfileView, } diff --git a/atrium-api/src/app/bsky/graph/get_known_followers.rs b/atrium-api/src/app/bsky/graph/get_known_followers.rs index 64770c0c..92eacc45 100644 --- a/atrium-api/src/app/bsky/graph/get_known_followers.rs +++ b/atrium-api/src/app/bsky/graph/get_known_followers.rs @@ -5,17 +5,17 @@ pub const NSID: &str = "app.bsky.graph.getKnownFollowers"; #[serde(rename_all = "camelCase")] pub struct ParametersData { pub actor: crate::types::string::AtIdentifier, - #[serde(skip_serializing_if = "Option::is_none")] - pub cursor: Option, - #[serde(skip_serializing_if = "Option::is_none")] - pub limit: Option>, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub cursor: core::option::Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub limit: core::option::Option>, } pub type Parameters = crate::types::Object; #[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq)] #[serde(rename_all = "camelCase")] pub struct OutputData { - #[serde(skip_serializing_if = "Option::is_none")] - pub cursor: Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub cursor: core::option::Option, pub followers: Vec, pub subject: crate::app::bsky::actor::defs::ProfileView, } diff --git a/atrium-api/src/app/bsky/graph/get_list.rs b/atrium-api/src/app/bsky/graph/get_list.rs index 8693e3af..f4319f58 100644 --- a/atrium-api/src/app/bsky/graph/get_list.rs +++ b/atrium-api/src/app/bsky/graph/get_list.rs @@ -4,10 +4,10 @@ pub const NSID: &str = "app.bsky.graph.getList"; #[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq)] #[serde(rename_all = "camelCase")] pub struct ParametersData { - #[serde(skip_serializing_if = "Option::is_none")] - pub cursor: Option, - #[serde(skip_serializing_if = "Option::is_none")] - pub limit: Option>, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub cursor: core::option::Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub limit: core::option::Option>, ///Reference (AT-URI) of the list record to hydrate. pub list: String, } @@ -15,8 +15,8 @@ pub type Parameters = crate::types::Object; #[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq)] #[serde(rename_all = "camelCase")] pub struct OutputData { - #[serde(skip_serializing_if = "Option::is_none")] - pub cursor: Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub cursor: core::option::Option, pub items: Vec, pub list: crate::app::bsky::graph::defs::ListView, } diff --git a/atrium-api/src/app/bsky/graph/get_list_blocks.rs b/atrium-api/src/app/bsky/graph/get_list_blocks.rs index b22edf05..1eeedcbb 100644 --- a/atrium-api/src/app/bsky/graph/get_list_blocks.rs +++ b/atrium-api/src/app/bsky/graph/get_list_blocks.rs @@ -4,17 +4,17 @@ pub const NSID: &str = "app.bsky.graph.getListBlocks"; #[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq)] #[serde(rename_all = "camelCase")] pub struct ParametersData { - #[serde(skip_serializing_if = "Option::is_none")] - pub cursor: Option, - #[serde(skip_serializing_if = "Option::is_none")] - pub limit: Option>, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub cursor: core::option::Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub limit: core::option::Option>, } pub type Parameters = crate::types::Object; #[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq)] #[serde(rename_all = "camelCase")] pub struct OutputData { - #[serde(skip_serializing_if = "Option::is_none")] - pub cursor: Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub cursor: core::option::Option, pub lists: Vec, } pub type Output = crate::types::Object; diff --git a/atrium-api/src/app/bsky/graph/get_list_mutes.rs b/atrium-api/src/app/bsky/graph/get_list_mutes.rs index c9a8680a..c74f3945 100644 --- a/atrium-api/src/app/bsky/graph/get_list_mutes.rs +++ b/atrium-api/src/app/bsky/graph/get_list_mutes.rs @@ -4,17 +4,17 @@ pub const NSID: &str = "app.bsky.graph.getListMutes"; #[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq)] #[serde(rename_all = "camelCase")] pub struct ParametersData { - #[serde(skip_serializing_if = "Option::is_none")] - pub cursor: Option, - #[serde(skip_serializing_if = "Option::is_none")] - pub limit: Option>, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub cursor: core::option::Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub limit: core::option::Option>, } pub type Parameters = crate::types::Object; #[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq)] #[serde(rename_all = "camelCase")] pub struct OutputData { - #[serde(skip_serializing_if = "Option::is_none")] - pub cursor: Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub cursor: core::option::Option, pub lists: Vec, } pub type Output = crate::types::Object; diff --git a/atrium-api/src/app/bsky/graph/get_lists.rs b/atrium-api/src/app/bsky/graph/get_lists.rs index d97b4175..f1639777 100644 --- a/atrium-api/src/app/bsky/graph/get_lists.rs +++ b/atrium-api/src/app/bsky/graph/get_lists.rs @@ -6,17 +6,17 @@ pub const NSID: &str = "app.bsky.graph.getLists"; pub struct ParametersData { ///The account (actor) to enumerate lists from. pub actor: crate::types::string::AtIdentifier, - #[serde(skip_serializing_if = "Option::is_none")] - pub cursor: Option, - #[serde(skip_serializing_if = "Option::is_none")] - pub limit: Option>, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub cursor: core::option::Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub limit: core::option::Option>, } pub type Parameters = crate::types::Object; #[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq)] #[serde(rename_all = "camelCase")] pub struct OutputData { - #[serde(skip_serializing_if = "Option::is_none")] - pub cursor: Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub cursor: core::option::Option, pub lists: Vec, } pub type Output = crate::types::Object; diff --git a/atrium-api/src/app/bsky/graph/get_mutes.rs b/atrium-api/src/app/bsky/graph/get_mutes.rs index ac829277..7a93cb10 100644 --- a/atrium-api/src/app/bsky/graph/get_mutes.rs +++ b/atrium-api/src/app/bsky/graph/get_mutes.rs @@ -4,17 +4,17 @@ pub const NSID: &str = "app.bsky.graph.getMutes"; #[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq)] #[serde(rename_all = "camelCase")] pub struct ParametersData { - #[serde(skip_serializing_if = "Option::is_none")] - pub cursor: Option, - #[serde(skip_serializing_if = "Option::is_none")] - pub limit: Option>, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub cursor: core::option::Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub limit: core::option::Option>, } pub type Parameters = crate::types::Object; #[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq)] #[serde(rename_all = "camelCase")] pub struct OutputData { - #[serde(skip_serializing_if = "Option::is_none")] - pub cursor: Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub cursor: core::option::Option, pub mutes: Vec, } pub type Output = crate::types::Object; diff --git a/atrium-api/src/app/bsky/graph/get_relationships.rs b/atrium-api/src/app/bsky/graph/get_relationships.rs index 5d9a78f1..0a33ec18 100644 --- a/atrium-api/src/app/bsky/graph/get_relationships.rs +++ b/atrium-api/src/app/bsky/graph/get_relationships.rs @@ -7,15 +7,15 @@ pub struct ParametersData { ///Primary account requesting relationships for. pub actor: crate::types::string::AtIdentifier, ///List of 'other' accounts to be related back to the primary. - #[serde(skip_serializing_if = "Option::is_none")] - pub others: Option>, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub others: core::option::Option>, } pub type Parameters = crate::types::Object; #[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq)] #[serde(rename_all = "camelCase")] pub struct OutputData { - #[serde(skip_serializing_if = "Option::is_none")] - pub actor: Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub actor: core::option::Option, pub relationships: Vec>, } pub type Output = crate::types::Object; diff --git a/atrium-api/src/app/bsky/graph/get_suggested_follows_by_actor.rs b/atrium-api/src/app/bsky/graph/get_suggested_follows_by_actor.rs index d667315d..b01b44d8 100644 --- a/atrium-api/src/app/bsky/graph/get_suggested_follows_by_actor.rs +++ b/atrium-api/src/app/bsky/graph/get_suggested_follows_by_actor.rs @@ -11,8 +11,8 @@ pub type Parameters = crate::types::Object; #[serde(rename_all = "camelCase")] pub struct OutputData { ///If true, response has fallen-back to generic results, and is not scoped using relativeToDid - #[serde(skip_serializing_if = "Option::is_none")] - pub is_fallback: Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub is_fallback: core::option::Option, pub suggestions: Vec, } pub type Output = crate::types::Object; diff --git a/atrium-api/src/app/bsky/graph/list.rs b/atrium-api/src/app/bsky/graph/list.rs index 928ee190..66515876 100644 --- a/atrium-api/src/app/bsky/graph/list.rs +++ b/atrium-api/src/app/bsky/graph/list.rs @@ -3,15 +3,17 @@ #[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq)] #[serde(rename_all = "camelCase")] pub struct RecordData { - #[serde(skip_serializing_if = "Option::is_none")] - pub avatar: Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub avatar: core::option::Option, pub created_at: crate::types::string::Datetime, - #[serde(skip_serializing_if = "Option::is_none")] - pub description: Option, - #[serde(skip_serializing_if = "Option::is_none")] - pub description_facets: Option>, - #[serde(skip_serializing_if = "Option::is_none")] - pub labels: Option>, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub description: core::option::Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub description_facets: core::option::Option< + Vec, + >, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub labels: core::option::Option>, ///Display name for list; can not be empty. pub name: String, ///Defines the purpose of the list (aka, moderation-oriented or curration-oriented) diff --git a/atrium-api/src/app/bsky/graph/search_starter_packs.rs b/atrium-api/src/app/bsky/graph/search_starter_packs.rs new file mode 100644 index 00000000..b6c8b856 --- /dev/null +++ b/atrium-api/src/app/bsky/graph/search_starter_packs.rs @@ -0,0 +1,30 @@ +// @generated - This file is generated by atrium-codegen. DO NOT EDIT. +//!Definitions for the `app.bsky.graph.searchStarterPacks` namespace. +pub const NSID: &str = "app.bsky.graph.searchStarterPacks"; +#[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq)] +#[serde(rename_all = "camelCase")] +pub struct ParametersData { + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub cursor: core::option::Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub limit: core::option::Option>, + ///Search query string. Syntax, phrase, boolean, and faceting is unspecified, but Lucene query syntax is recommended. + pub q: String, +} +pub type Parameters = crate::types::Object; +#[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq)] +#[serde(rename_all = "camelCase")] +pub struct OutputData { + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub cursor: core::option::Option, + pub starter_packs: Vec, +} +pub type Output = crate::types::Object; +#[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq)] +#[serde(tag = "error", content = "message")] +pub enum Error {} +impl std::fmt::Display for Error { + fn fmt(&self, _f: &mut std::fmt::Formatter) -> std::fmt::Result { + Ok(()) + } +} diff --git a/atrium-api/src/app/bsky/graph/starterpack.rs b/atrium-api/src/app/bsky/graph/starterpack.rs index d9a8cc1d..8e763336 100644 --- a/atrium-api/src/app/bsky/graph/starterpack.rs +++ b/atrium-api/src/app/bsky/graph/starterpack.rs @@ -4,12 +4,14 @@ #[serde(rename_all = "camelCase")] pub struct RecordData { pub created_at: crate::types::string::Datetime, - #[serde(skip_serializing_if = "Option::is_none")] - pub description: Option, - #[serde(skip_serializing_if = "Option::is_none")] - pub description_facets: Option>, - #[serde(skip_serializing_if = "Option::is_none")] - pub feeds: Option>, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub description: core::option::Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub description_facets: core::option::Option< + Vec, + >, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub feeds: core::option::Option>, ///Reference (AT-URI) to the list record. pub list: String, ///Display name for starter pack; can not be empty. diff --git a/atrium-api/src/app/bsky/labeler/defs.rs b/atrium-api/src/app/bsky/labeler/defs.rs index 7859bcd7..348c600b 100644 --- a/atrium-api/src/app/bsky/labeler/defs.rs +++ b/atrium-api/src/app/bsky/labeler/defs.rs @@ -4,8 +4,8 @@ #[serde(rename_all = "camelCase")] pub struct LabelerPoliciesData { ///Label values created by this labeler and scoped exclusively to it. Labels defined here will override global label definitions for this labeler. - #[serde(skip_serializing_if = "Option::is_none")] - pub label_value_definitions: Option< + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub label_value_definitions: core::option::Option< Vec, >, ///The label values which this labeler publishes. May include global or custom labels. @@ -18,13 +18,13 @@ pub struct LabelerViewData { pub cid: crate::types::string::Cid, pub creator: crate::app::bsky::actor::defs::ProfileView, pub indexed_at: crate::types::string::Datetime, - #[serde(skip_serializing_if = "Option::is_none")] - pub labels: Option>, - #[serde(skip_serializing_if = "Option::is_none")] - pub like_count: Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub labels: core::option::Option>, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub like_count: core::option::Option, pub uri: String, - #[serde(skip_serializing_if = "Option::is_none")] - pub viewer: Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub viewer: core::option::Option, } pub type LabelerView = crate::types::Object; #[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq)] @@ -33,20 +33,20 @@ pub struct LabelerViewDetailedData { pub cid: crate::types::string::Cid, pub creator: crate::app::bsky::actor::defs::ProfileView, pub indexed_at: crate::types::string::Datetime, - #[serde(skip_serializing_if = "Option::is_none")] - pub labels: Option>, - #[serde(skip_serializing_if = "Option::is_none")] - pub like_count: Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub labels: core::option::Option>, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub like_count: core::option::Option, pub policies: crate::app::bsky::labeler::defs::LabelerPolicies, pub uri: String, - #[serde(skip_serializing_if = "Option::is_none")] - pub viewer: Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub viewer: core::option::Option, } pub type LabelerViewDetailed = crate::types::Object; #[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq)] #[serde(rename_all = "camelCase")] pub struct LabelerViewerStateData { - #[serde(skip_serializing_if = "Option::is_none")] - pub like: Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub like: core::option::Option, } pub type LabelerViewerState = crate::types::Object; diff --git a/atrium-api/src/app/bsky/labeler/get_services.rs b/atrium-api/src/app/bsky/labeler/get_services.rs index 2348bc40..754d12bd 100644 --- a/atrium-api/src/app/bsky/labeler/get_services.rs +++ b/atrium-api/src/app/bsky/labeler/get_services.rs @@ -4,8 +4,8 @@ pub const NSID: &str = "app.bsky.labeler.getServices"; #[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq)] #[serde(rename_all = "camelCase")] pub struct ParametersData { - #[serde(skip_serializing_if = "Option::is_none")] - pub detailed: Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub detailed: core::option::Option, pub dids: Vec, } pub type Parameters = crate::types::Object; diff --git a/atrium-api/src/app/bsky/labeler/service.rs b/atrium-api/src/app/bsky/labeler/service.rs index 2bd8bc76..d2faa844 100644 --- a/atrium-api/src/app/bsky/labeler/service.rs +++ b/atrium-api/src/app/bsky/labeler/service.rs @@ -4,8 +4,8 @@ #[serde(rename_all = "camelCase")] pub struct RecordData { pub created_at: crate::types::string::Datetime, - #[serde(skip_serializing_if = "Option::is_none")] - pub labels: Option>, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub labels: core::option::Option>, pub policies: crate::app::bsky::labeler::defs::LabelerPolicies, } pub type Record = crate::types::Object; diff --git a/atrium-api/src/app/bsky/notification/get_unread_count.rs b/atrium-api/src/app/bsky/notification/get_unread_count.rs index 83f83482..76cfc59e 100644 --- a/atrium-api/src/app/bsky/notification/get_unread_count.rs +++ b/atrium-api/src/app/bsky/notification/get_unread_count.rs @@ -4,10 +4,10 @@ pub const NSID: &str = "app.bsky.notification.getUnreadCount"; #[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq)] #[serde(rename_all = "camelCase")] pub struct ParametersData { - #[serde(skip_serializing_if = "Option::is_none")] - pub priority: Option, - #[serde(skip_serializing_if = "Option::is_none")] - pub seen_at: Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub priority: core::option::Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub seen_at: core::option::Option, } pub type Parameters = crate::types::Object; #[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq)] diff --git a/atrium-api/src/app/bsky/notification/list_notifications.rs b/atrium-api/src/app/bsky/notification/list_notifications.rs index fd81c547..5a59d48d 100644 --- a/atrium-api/src/app/bsky/notification/list_notifications.rs +++ b/atrium-api/src/app/bsky/notification/list_notifications.rs @@ -4,26 +4,26 @@ pub const NSID: &str = "app.bsky.notification.listNotifications"; #[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq)] #[serde(rename_all = "camelCase")] pub struct ParametersData { - #[serde(skip_serializing_if = "Option::is_none")] - pub cursor: Option, - #[serde(skip_serializing_if = "Option::is_none")] - pub limit: Option>, - #[serde(skip_serializing_if = "Option::is_none")] - pub priority: Option, - #[serde(skip_serializing_if = "Option::is_none")] - pub seen_at: Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub cursor: core::option::Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub limit: core::option::Option>, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub priority: core::option::Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub seen_at: core::option::Option, } pub type Parameters = crate::types::Object; #[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq)] #[serde(rename_all = "camelCase")] pub struct OutputData { - #[serde(skip_serializing_if = "Option::is_none")] - pub cursor: Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub cursor: core::option::Option, pub notifications: Vec, - #[serde(skip_serializing_if = "Option::is_none")] - pub priority: Option, - #[serde(skip_serializing_if = "Option::is_none")] - pub seen_at: Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub priority: core::option::Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub seen_at: core::option::Option, } pub type Output = crate::types::Object; #[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq)] @@ -41,12 +41,12 @@ pub struct NotificationData { pub cid: crate::types::string::Cid, pub indexed_at: crate::types::string::Datetime, pub is_read: bool, - #[serde(skip_serializing_if = "Option::is_none")] - pub labels: Option>, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub labels: core::option::Option>, ///Expected values are 'like', 'repost', 'follow', 'mention', 'reply', 'quote', and 'starterpack-joined'. pub reason: String, - #[serde(skip_serializing_if = "Option::is_none")] - pub reason_subject: Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub reason_subject: core::option::Option, pub record: crate::types::Unknown, pub uri: String, } diff --git a/atrium-api/src/app/bsky/unspecced.rs b/atrium-api/src/app/bsky/unspecced.rs index a3da9d71..ea7d9dbc 100644 --- a/atrium-api/src/app/bsky/unspecced.rs +++ b/atrium-api/src/app/bsky/unspecced.rs @@ -1,8 +1,10 @@ // @generated - This file is generated by atrium-codegen. DO NOT EDIT. //!Definitions for the `app.bsky.unspecced` namespace. pub mod defs; +pub mod get_config; pub mod get_popular_feed_generators; pub mod get_suggestions_skeleton; pub mod get_tagged_suggestions; pub mod search_actors_skeleton; pub mod search_posts_skeleton; +pub mod search_starter_packs_skeleton; diff --git a/atrium-api/src/app/bsky/unspecced/defs.rs b/atrium-api/src/app/bsky/unspecced/defs.rs index ae48eefc..5b8a47c3 100644 --- a/atrium-api/src/app/bsky/unspecced/defs.rs +++ b/atrium-api/src/app/bsky/unspecced/defs.rs @@ -12,3 +12,9 @@ pub struct SkeletonSearchPostData { pub uri: String, } pub type SkeletonSearchPost = crate::types::Object; +#[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq)] +#[serde(rename_all = "camelCase")] +pub struct SkeletonSearchStarterPackData { + pub uri: String, +} +pub type SkeletonSearchStarterPack = crate::types::Object; diff --git a/atrium-api/src/app/bsky/unspecced/get_config.rs b/atrium-api/src/app/bsky/unspecced/get_config.rs new file mode 100644 index 00000000..383bd983 --- /dev/null +++ b/atrium-api/src/app/bsky/unspecced/get_config.rs @@ -0,0 +1,18 @@ +// @generated - This file is generated by atrium-codegen. DO NOT EDIT. +//!Definitions for the `app.bsky.unspecced.getConfig` namespace. +pub const NSID: &str = "app.bsky.unspecced.getConfig"; +#[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq)] +#[serde(rename_all = "camelCase")] +pub struct OutputData { + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub check_email_confirmed: core::option::Option, +} +pub type Output = crate::types::Object; +#[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq)] +#[serde(tag = "error", content = "message")] +pub enum Error {} +impl std::fmt::Display for Error { + fn fmt(&self, _f: &mut std::fmt::Formatter) -> std::fmt::Result { + Ok(()) + } +} diff --git a/atrium-api/src/app/bsky/unspecced/get_popular_feed_generators.rs b/atrium-api/src/app/bsky/unspecced/get_popular_feed_generators.rs index 985d6aad..c420bf90 100644 --- a/atrium-api/src/app/bsky/unspecced/get_popular_feed_generators.rs +++ b/atrium-api/src/app/bsky/unspecced/get_popular_feed_generators.rs @@ -4,19 +4,19 @@ pub const NSID: &str = "app.bsky.unspecced.getPopularFeedGenerators"; #[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq)] #[serde(rename_all = "camelCase")] pub struct ParametersData { - #[serde(skip_serializing_if = "Option::is_none")] - pub cursor: Option, - #[serde(skip_serializing_if = "Option::is_none")] - pub limit: Option>, - #[serde(skip_serializing_if = "Option::is_none")] - pub query: Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub cursor: core::option::Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub limit: core::option::Option>, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub query: core::option::Option, } pub type Parameters = crate::types::Object; #[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq)] #[serde(rename_all = "camelCase")] pub struct OutputData { - #[serde(skip_serializing_if = "Option::is_none")] - pub cursor: Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub cursor: core::option::Option, pub feeds: Vec, } pub type Output = crate::types::Object; diff --git a/atrium-api/src/app/bsky/unspecced/get_suggestions_skeleton.rs b/atrium-api/src/app/bsky/unspecced/get_suggestions_skeleton.rs index b338355b..e8ca2d9e 100644 --- a/atrium-api/src/app/bsky/unspecced/get_suggestions_skeleton.rs +++ b/atrium-api/src/app/bsky/unspecced/get_suggestions_skeleton.rs @@ -4,27 +4,27 @@ pub const NSID: &str = "app.bsky.unspecced.getSuggestionsSkeleton"; #[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq)] #[serde(rename_all = "camelCase")] pub struct ParametersData { - #[serde(skip_serializing_if = "Option::is_none")] - pub cursor: Option, - #[serde(skip_serializing_if = "Option::is_none")] - pub limit: Option>, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub cursor: core::option::Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub limit: core::option::Option>, ///DID of the account to get suggestions relative to. If not provided, suggestions will be based on the viewer. - #[serde(skip_serializing_if = "Option::is_none")] - pub relative_to_did: Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub relative_to_did: core::option::Option, ///DID of the account making the request (not included for public/unauthenticated queries). Used to boost followed accounts in ranking. - #[serde(skip_serializing_if = "Option::is_none")] - pub viewer: Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub viewer: core::option::Option, } pub type Parameters = crate::types::Object; #[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq)] #[serde(rename_all = "camelCase")] pub struct OutputData { pub actors: Vec, - #[serde(skip_serializing_if = "Option::is_none")] - pub cursor: Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub cursor: core::option::Option, ///DID of the account these suggestions are relative to. If this is returned undefined, suggestions are based on the viewer. - #[serde(skip_serializing_if = "Option::is_none")] - pub relative_to_did: Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub relative_to_did: core::option::Option, } pub type Output = crate::types::Object; #[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq)] diff --git a/atrium-api/src/app/bsky/unspecced/search_actors_skeleton.rs b/atrium-api/src/app/bsky/unspecced/search_actors_skeleton.rs index 270b0bb9..4d9e1d3d 100644 --- a/atrium-api/src/app/bsky/unspecced/search_actors_skeleton.rs +++ b/atrium-api/src/app/bsky/unspecced/search_actors_skeleton.rs @@ -5,29 +5,29 @@ pub const NSID: &str = "app.bsky.unspecced.searchActorsSkeleton"; #[serde(rename_all = "camelCase")] pub struct ParametersData { ///Optional pagination mechanism; may not necessarily allow scrolling through entire result set. - #[serde(skip_serializing_if = "Option::is_none")] - pub cursor: Option, - #[serde(skip_serializing_if = "Option::is_none")] - pub limit: Option>, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub cursor: core::option::Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub limit: core::option::Option>, ///Search query string; syntax, phrase, boolean, and faceting is unspecified, but Lucene query syntax is recommended. For typeahead search, only simple term match is supported, not full syntax. pub q: String, ///If true, acts as fast/simple 'typeahead' query. - #[serde(skip_serializing_if = "Option::is_none")] - pub typeahead: Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub typeahead: core::option::Option, ///DID of the account making the request (not included for public/unauthenticated queries). Used to boost followed accounts in ranking. - #[serde(skip_serializing_if = "Option::is_none")] - pub viewer: Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub viewer: core::option::Option, } pub type Parameters = crate::types::Object; #[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq)] #[serde(rename_all = "camelCase")] pub struct OutputData { pub actors: Vec, - #[serde(skip_serializing_if = "Option::is_none")] - pub cursor: Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub cursor: core::option::Option, ///Count of search hits. Optional, may be rounded/truncated, and may not be possible to paginate through all hits. - #[serde(skip_serializing_if = "Option::is_none")] - pub hits_total: Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub hits_total: core::option::Option, } pub type Output = crate::types::Object; #[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq)] diff --git a/atrium-api/src/app/bsky/unspecced/search_posts_skeleton.rs b/atrium-api/src/app/bsky/unspecced/search_posts_skeleton.rs index 961c7416..6b243eb7 100644 --- a/atrium-api/src/app/bsky/unspecced/search_posts_skeleton.rs +++ b/atrium-api/src/app/bsky/unspecced/search_posts_skeleton.rs @@ -5,52 +5,52 @@ pub const NSID: &str = "app.bsky.unspecced.searchPostsSkeleton"; #[serde(rename_all = "camelCase")] pub struct ParametersData { ///Filter to posts by the given account. Handles are resolved to DID before query-time. - #[serde(skip_serializing_if = "Option::is_none")] - pub author: Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub author: core::option::Option, ///Optional pagination mechanism; may not necessarily allow scrolling through entire result set. - #[serde(skip_serializing_if = "Option::is_none")] - pub cursor: Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub cursor: core::option::Option, ///Filter to posts with URLs (facet links or embeds) linking to the given domain (hostname). Server may apply hostname normalization. - #[serde(skip_serializing_if = "Option::is_none")] - pub domain: Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub domain: core::option::Option, ///Filter to posts in the given language. Expected to be based on post language field, though server may override language detection. - #[serde(skip_serializing_if = "Option::is_none")] - pub lang: Option, - #[serde(skip_serializing_if = "Option::is_none")] - pub limit: Option>, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub lang: core::option::Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub limit: core::option::Option>, ///Filter to posts which mention the given account. Handles are resolved to DID before query-time. Only matches rich-text facet mentions. - #[serde(skip_serializing_if = "Option::is_none")] - pub mentions: Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub mentions: core::option::Option, ///Search query string; syntax, phrase, boolean, and faceting is unspecified, but Lucene query syntax is recommended. pub q: String, ///Filter results for posts after the indicated datetime (inclusive). Expected to use 'sortAt' timestamp, which may not match 'createdAt'. Can be a datetime, or just an ISO date (YYYY-MM-DD). - #[serde(skip_serializing_if = "Option::is_none")] - pub since: Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub since: core::option::Option, ///Specifies the ranking order of results. - #[serde(skip_serializing_if = "Option::is_none")] - pub sort: Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub sort: core::option::Option, ///Filter to posts with the given tag (hashtag), based on rich-text facet or tag field. Do not include the hash (#) prefix. Multiple tags can be specified, with 'AND' matching. - #[serde(skip_serializing_if = "Option::is_none")] - pub tag: Option>, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub tag: core::option::Option>, ///Filter results for posts before the indicated datetime (not inclusive). Expected to use 'sortAt' timestamp, which may not match 'createdAt'. Can be a datetime, or just an ISO date (YYY-MM-DD). - #[serde(skip_serializing_if = "Option::is_none")] - pub until: Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub until: core::option::Option, ///Filter to posts with links (facet links or embeds) pointing to this URL. Server may apply URL normalization or fuzzy matching. - #[serde(skip_serializing_if = "Option::is_none")] - pub url: Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub url: core::option::Option, ///DID of the account making the request (not included for public/unauthenticated queries). Used for 'from:me' queries. - #[serde(skip_serializing_if = "Option::is_none")] - pub viewer: Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub viewer: core::option::Option, } pub type Parameters = crate::types::Object; #[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq)] #[serde(rename_all = "camelCase")] pub struct OutputData { - #[serde(skip_serializing_if = "Option::is_none")] - pub cursor: Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub cursor: core::option::Option, ///Count of search hits. Optional, may be rounded/truncated, and may not be possible to paginate through all hits. - #[serde(skip_serializing_if = "Option::is_none")] - pub hits_total: Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub hits_total: core::option::Option, pub posts: Vec, } pub type Output = crate::types::Object; diff --git a/atrium-api/src/app/bsky/unspecced/search_starter_packs_skeleton.rs b/atrium-api/src/app/bsky/unspecced/search_starter_packs_skeleton.rs new file mode 100644 index 00000000..dcec9943 --- /dev/null +++ b/atrium-api/src/app/bsky/unspecced/search_starter_packs_skeleton.rs @@ -0,0 +1,47 @@ +// @generated - This file is generated by atrium-codegen. DO NOT EDIT. +//!Definitions for the `app.bsky.unspecced.searchStarterPacksSkeleton` namespace. +pub const NSID: &str = "app.bsky.unspecced.searchStarterPacksSkeleton"; +#[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq)] +#[serde(rename_all = "camelCase")] +pub struct ParametersData { + ///Optional pagination mechanism; may not necessarily allow scrolling through entire result set. + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub cursor: core::option::Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub limit: core::option::Option>, + ///Search query string; syntax, phrase, boolean, and faceting is unspecified, but Lucene query syntax is recommended. + pub q: String, + ///DID of the account making the request (not included for public/unauthenticated queries). + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub viewer: core::option::Option, +} +pub type Parameters = crate::types::Object; +#[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq)] +#[serde(rename_all = "camelCase")] +pub struct OutputData { + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub cursor: core::option::Option, + ///Count of search hits. Optional, may be rounded/truncated, and may not be possible to paginate through all hits. + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub hits_total: core::option::Option, + pub starter_packs: Vec, +} +pub type Output = crate::types::Object; +#[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq)] +#[serde(tag = "error", content = "message")] +pub enum Error { + BadQueryString(Option), +} +impl std::fmt::Display for Error { + fn fmt(&self, _f: &mut std::fmt::Formatter) -> std::fmt::Result { + match self { + Error::BadQueryString(msg) => { + write!(_f, "BadQueryString")?; + if let Some(msg) = msg { + write!(_f, ": {msg}")?; + } + } + } + Ok(()) + } +} diff --git a/atrium-api/src/app/bsky/video/defs.rs b/atrium-api/src/app/bsky/video/defs.rs index 15bde4c5..aa5f170b 100644 --- a/atrium-api/src/app/bsky/video/defs.rs +++ b/atrium-api/src/app/bsky/video/defs.rs @@ -3,17 +3,17 @@ #[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq)] #[serde(rename_all = "camelCase")] pub struct JobStatusData { - #[serde(skip_serializing_if = "Option::is_none")] - pub blob: Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub blob: core::option::Option, pub did: crate::types::string::Did, - #[serde(skip_serializing_if = "Option::is_none")] - pub error: Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub error: core::option::Option, pub job_id: String, - #[serde(skip_serializing_if = "Option::is_none")] - pub message: Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub message: core::option::Option, ///Progress within the current processing state. - #[serde(skip_serializing_if = "Option::is_none")] - pub progress: Option>, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub progress: core::option::Option>, ///The state of the video processing job. All values not listed as a known value indicate that the job is in process. pub state: String, } diff --git a/atrium-api/src/app/bsky/video/get_upload_limits.rs b/atrium-api/src/app/bsky/video/get_upload_limits.rs index 0a52a29b..92b32b86 100644 --- a/atrium-api/src/app/bsky/video/get_upload_limits.rs +++ b/atrium-api/src/app/bsky/video/get_upload_limits.rs @@ -5,14 +5,14 @@ pub const NSID: &str = "app.bsky.video.getUploadLimits"; #[serde(rename_all = "camelCase")] pub struct OutputData { pub can_upload: bool, - #[serde(skip_serializing_if = "Option::is_none")] - pub error: Option, - #[serde(skip_serializing_if = "Option::is_none")] - pub message: Option, - #[serde(skip_serializing_if = "Option::is_none")] - pub remaining_daily_bytes: Option, - #[serde(skip_serializing_if = "Option::is_none")] - pub remaining_daily_videos: Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub error: core::option::Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub message: core::option::Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub remaining_daily_bytes: core::option::Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub remaining_daily_videos: core::option::Option, } pub type Output = crate::types::Object; #[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq)] diff --git a/atrium-api/src/chat/bsky/actor/defs.rs b/atrium-api/src/chat/bsky/actor/defs.rs index f48fb4d8..587f77b4 100644 --- a/atrium-api/src/chat/bsky/actor/defs.rs +++ b/atrium-api/src/chat/bsky/actor/defs.rs @@ -3,20 +3,22 @@ #[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq)] #[serde(rename_all = "camelCase")] pub struct ProfileViewBasicData { - #[serde(skip_serializing_if = "Option::is_none")] - pub associated: Option, - #[serde(skip_serializing_if = "Option::is_none")] - pub avatar: Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub associated: core::option::Option< + crate::app::bsky::actor::defs::ProfileAssociated, + >, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub avatar: core::option::Option, ///Set to true when the actor cannot actively participate in converations - #[serde(skip_serializing_if = "Option::is_none")] - pub chat_disabled: Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub chat_disabled: core::option::Option, pub did: crate::types::string::Did, - #[serde(skip_serializing_if = "Option::is_none")] - pub display_name: Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub display_name: core::option::Option, pub handle: crate::types::string::Handle, - #[serde(skip_serializing_if = "Option::is_none")] - pub labels: Option>, - #[serde(skip_serializing_if = "Option::is_none")] - pub viewer: Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub labels: core::option::Option>, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub viewer: core::option::Option, } pub type ProfileViewBasic = crate::types::Object; diff --git a/atrium-api/src/chat/bsky/convo/defs.rs b/atrium-api/src/chat/bsky/convo/defs.rs index f46416b4..a221ab1f 100644 --- a/atrium-api/src/chat/bsky/convo/defs.rs +++ b/atrium-api/src/chat/bsky/convo/defs.rs @@ -4,10 +4,14 @@ #[serde(rename_all = "camelCase")] pub struct ConvoViewData { pub id: String, - #[serde(skip_serializing_if = "Option::is_none")] - pub last_message: Option>, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub last_message: core::option::Option< + crate::types::Union, + >, pub members: Vec, pub muted: bool, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub opened: core::option::Option, pub rev: String, pub unread_count: i64, } @@ -54,11 +58,11 @@ pub type LogLeaveConvo = crate::types::Object; #[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq)] #[serde(rename_all = "camelCase")] pub struct MessageInputData { - #[serde(skip_serializing_if = "Option::is_none")] - pub embed: Option>, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub embed: core::option::Option>, ///Annotations of text (mentions, URLs, hashtags, etc) - #[serde(skip_serializing_if = "Option::is_none")] - pub facets: Option>, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub facets: core::option::Option>, pub text: String, } pub type MessageInput = crate::types::Object; @@ -73,11 +77,11 @@ pub type MessageRef = crate::types::Object; #[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq)] #[serde(rename_all = "camelCase")] pub struct MessageViewData { - #[serde(skip_serializing_if = "Option::is_none")] - pub embed: Option>, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub embed: core::option::Option>, ///Annotations of text (mentions, URLs, hashtags, etc) - #[serde(skip_serializing_if = "Option::is_none")] - pub facets: Option>, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub facets: core::option::Option>, pub id: String, pub rev: String, pub sender: MessageViewSender, diff --git a/atrium-api/src/chat/bsky/convo/get_log.rs b/atrium-api/src/chat/bsky/convo/get_log.rs index 9af3098a..c04812ba 100644 --- a/atrium-api/src/chat/bsky/convo/get_log.rs +++ b/atrium-api/src/chat/bsky/convo/get_log.rs @@ -4,15 +4,15 @@ pub const NSID: &str = "chat.bsky.convo.getLog"; #[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq)] #[serde(rename_all = "camelCase")] pub struct ParametersData { - #[serde(skip_serializing_if = "Option::is_none")] - pub cursor: Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub cursor: core::option::Option, } pub type Parameters = crate::types::Object; #[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq)] #[serde(rename_all = "camelCase")] pub struct OutputData { - #[serde(skip_serializing_if = "Option::is_none")] - pub cursor: Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub cursor: core::option::Option, pub logs: Vec>, } pub type Output = crate::types::Object; diff --git a/atrium-api/src/chat/bsky/convo/get_messages.rs b/atrium-api/src/chat/bsky/convo/get_messages.rs index dfd6c86d..b882a4f7 100644 --- a/atrium-api/src/chat/bsky/convo/get_messages.rs +++ b/atrium-api/src/chat/bsky/convo/get_messages.rs @@ -5,17 +5,17 @@ pub const NSID: &str = "chat.bsky.convo.getMessages"; #[serde(rename_all = "camelCase")] pub struct ParametersData { pub convo_id: String, - #[serde(skip_serializing_if = "Option::is_none")] - pub cursor: Option, - #[serde(skip_serializing_if = "Option::is_none")] - pub limit: Option>, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub cursor: core::option::Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub limit: core::option::Option>, } pub type Parameters = crate::types::Object; #[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq)] #[serde(rename_all = "camelCase")] pub struct OutputData { - #[serde(skip_serializing_if = "Option::is_none")] - pub cursor: Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub cursor: core::option::Option, pub messages: Vec>, } pub type Output = crate::types::Object; diff --git a/atrium-api/src/chat/bsky/convo/list_convos.rs b/atrium-api/src/chat/bsky/convo/list_convos.rs index 591148d5..1aa70ba5 100644 --- a/atrium-api/src/chat/bsky/convo/list_convos.rs +++ b/atrium-api/src/chat/bsky/convo/list_convos.rs @@ -4,18 +4,18 @@ pub const NSID: &str = "chat.bsky.convo.listConvos"; #[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq)] #[serde(rename_all = "camelCase")] pub struct ParametersData { - #[serde(skip_serializing_if = "Option::is_none")] - pub cursor: Option, - #[serde(skip_serializing_if = "Option::is_none")] - pub limit: Option>, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub cursor: core::option::Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub limit: core::option::Option>, } pub type Parameters = crate::types::Object; #[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq)] #[serde(rename_all = "camelCase")] pub struct OutputData { pub convos: Vec, - #[serde(skip_serializing_if = "Option::is_none")] - pub cursor: Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub cursor: core::option::Option, } pub type Output = crate::types::Object; #[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq)] diff --git a/atrium-api/src/chat/bsky/convo/update_read.rs b/atrium-api/src/chat/bsky/convo/update_read.rs index 68293412..8515173e 100644 --- a/atrium-api/src/chat/bsky/convo/update_read.rs +++ b/atrium-api/src/chat/bsky/convo/update_read.rs @@ -5,8 +5,8 @@ pub const NSID: &str = "chat.bsky.convo.updateRead"; #[serde(rename_all = "camelCase")] pub struct InputData { pub convo_id: String, - #[serde(skip_serializing_if = "Option::is_none")] - pub message_id: Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub message_id: core::option::Option, } pub type Input = crate::types::Object; #[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq)] diff --git a/atrium-api/src/chat/bsky/moderation/get_message_context.rs b/atrium-api/src/chat/bsky/moderation/get_message_context.rs index f78d85ca..50483276 100644 --- a/atrium-api/src/chat/bsky/moderation/get_message_context.rs +++ b/atrium-api/src/chat/bsky/moderation/get_message_context.rs @@ -4,13 +4,13 @@ pub const NSID: &str = "chat.bsky.moderation.getMessageContext"; #[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq)] #[serde(rename_all = "camelCase")] pub struct ParametersData { - #[serde(skip_serializing_if = "Option::is_none")] - pub after: Option, - #[serde(skip_serializing_if = "Option::is_none")] - pub before: Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub after: core::option::Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub before: core::option::Option, ///Conversation that the message is from. NOTE: this field will eventually be required. - #[serde(skip_serializing_if = "Option::is_none")] - pub convo_id: Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub convo_id: core::option::Option, pub message_id: String, } pub type Parameters = crate::types::Object; diff --git a/atrium-api/src/chat/bsky/moderation/update_actor_access.rs b/atrium-api/src/chat/bsky/moderation/update_actor_access.rs index 79b5a0af..941483d0 100644 --- a/atrium-api/src/chat/bsky/moderation/update_actor_access.rs +++ b/atrium-api/src/chat/bsky/moderation/update_actor_access.rs @@ -6,8 +6,8 @@ pub const NSID: &str = "chat.bsky.moderation.updateActorAccess"; pub struct InputData { pub actor: crate::types::string::Did, pub allow_access: bool, - #[serde(skip_serializing_if = "Option::is_none")] - pub r#ref: Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub r#ref: core::option::Option, } pub type Input = crate::types::Object; #[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq)] diff --git a/atrium-api/src/client.rs b/atrium-api/src/client.rs index 633077b2..a865bef2 100644 --- a/atrium-api/src/client.rs +++ b/atrium-api/src/client.rs @@ -287,6 +287,7 @@ pub mod tools { pub moderation: moderation::Service, pub server: server::Service, pub set: set::Service, + pub setting: setting::Service, pub signature: signature::Service, pub team: team::Service, pub(crate) _phantom: core::marker::PhantomData, @@ -327,6 +328,15 @@ pub mod tools { pub(crate) _phantom: core::marker::PhantomData, } } + pub mod setting { + pub struct Service + where + T: atrium_xrpc::XrpcClient + Send + Sync, + { + pub(crate) xrpc: std::sync::Arc, + pub(crate) _phantom: core::marker::PhantomData, + } + } pub mod signature { pub struct Service where @@ -1682,6 +1692,36 @@ where _ => Err(atrium_xrpc::Error::UnexpectedResponseType), } } + ///Find starter packs matching search criteria. Does not require auth. + pub async fn search_starter_packs( + &self, + params: crate::app::bsky::graph::search_starter_packs::Parameters, + ) -> atrium_xrpc::Result< + crate::app::bsky::graph::search_starter_packs::Output, + crate::app::bsky::graph::search_starter_packs::Error, + > { + let response = self + .xrpc + .send_xrpc::< + _, + (), + _, + _, + >( + &atrium_xrpc::XrpcRequest { + method: http::Method::GET, + nsid: crate::app::bsky::graph::search_starter_packs::NSID.into(), + parameters: Some(params), + input: None, + encoding: None, + }, + ) + .await?; + match response { + atrium_xrpc::OutputDataOrBytes::Data(data) => Ok(data), + _ => Err(atrium_xrpc::Error::UnexpectedResponseType), + } + } ///Unmutes the specified account. Requires auth. pub async fn unmute_actor( &self, @@ -1977,6 +2017,35 @@ where _phantom: core::marker::PhantomData, } } + ///Get miscellaneous runtime configuration. + pub async fn get_config( + &self, + ) -> atrium_xrpc::Result< + crate::app::bsky::unspecced::get_config::Output, + crate::app::bsky::unspecced::get_config::Error, + > { + let response = self + .xrpc + .send_xrpc::< + (), + (), + _, + _, + >( + &atrium_xrpc::XrpcRequest { + method: http::Method::GET, + nsid: crate::app::bsky::unspecced::get_config::NSID.into(), + parameters: None, + input: None, + encoding: None, + }, + ) + .await?; + match response { + atrium_xrpc::OutputDataOrBytes::Data(data) => Ok(data), + _ => Err(atrium_xrpc::Error::UnexpectedResponseType), + } + } ///An unspecced view of globally popular feed generators. pub async fn get_popular_feed_generators( &self, @@ -2132,6 +2201,37 @@ where _ => Err(atrium_xrpc::Error::UnexpectedResponseType), } } + ///Backend Starter Pack search, returns only skeleton. + pub async fn search_starter_packs_skeleton( + &self, + params: crate::app::bsky::unspecced::search_starter_packs_skeleton::Parameters, + ) -> atrium_xrpc::Result< + crate::app::bsky::unspecced::search_starter_packs_skeleton::Output, + crate::app::bsky::unspecced::search_starter_packs_skeleton::Error, + > { + let response = self + .xrpc + .send_xrpc::< + _, + (), + _, + _, + >( + &atrium_xrpc::XrpcRequest { + method: http::Method::GET, + nsid: crate::app::bsky::unspecced::search_starter_packs_skeleton::NSID + .into(), + parameters: Some(params), + input: None, + encoding: None, + }, + ) + .await?; + match response { + atrium_xrpc::OutputDataOrBytes::Data(data) => Ok(data), + _ => Err(atrium_xrpc::Error::UnexpectedResponseType), + } + } } #[cfg(feature = "namespace-appbsky")] impl app::bsky::video::Service @@ -5065,6 +5165,7 @@ where ), server: tools::ozone::server::Service::new(std::sync::Arc::clone(&xrpc)), set: tools::ozone::set::Service::new(std::sync::Arc::clone(&xrpc)), + setting: tools::ozone::setting::Service::new(std::sync::Arc::clone(&xrpc)), signature: tools::ozone::signature::Service::new( std::sync::Arc::clone(&xrpc), ), @@ -5722,6 +5823,109 @@ where } } #[cfg(feature = "namespace-toolsozone")] +impl tools::ozone::setting::Service +where + T: atrium_xrpc::XrpcClient + Send + Sync, +{ + #[allow(unused_variables)] + pub(crate) fn new(xrpc: std::sync::Arc) -> Self { + Self { + xrpc, + _phantom: core::marker::PhantomData, + } + } + ///List settings with optional filtering + pub async fn list_options( + &self, + params: crate::tools::ozone::setting::list_options::Parameters, + ) -> atrium_xrpc::Result< + crate::tools::ozone::setting::list_options::Output, + crate::tools::ozone::setting::list_options::Error, + > { + let response = self + .xrpc + .send_xrpc::< + _, + (), + _, + _, + >( + &atrium_xrpc::XrpcRequest { + method: http::Method::GET, + nsid: crate::tools::ozone::setting::list_options::NSID.into(), + parameters: Some(params), + input: None, + encoding: None, + }, + ) + .await?; + match response { + atrium_xrpc::OutputDataOrBytes::Data(data) => Ok(data), + _ => Err(atrium_xrpc::Error::UnexpectedResponseType), + } + } + ///Delete settings by key + pub async fn remove_options( + &self, + input: crate::tools::ozone::setting::remove_options::Input, + ) -> atrium_xrpc::Result< + crate::tools::ozone::setting::remove_options::Output, + crate::tools::ozone::setting::remove_options::Error, + > { + let response = self + .xrpc + .send_xrpc::< + (), + _, + _, + _, + >( + &atrium_xrpc::XrpcRequest { + method: http::Method::POST, + nsid: crate::tools::ozone::setting::remove_options::NSID.into(), + parameters: None, + input: Some(atrium_xrpc::InputDataOrBytes::Data(input)), + encoding: Some(String::from("application/json")), + }, + ) + .await?; + match response { + atrium_xrpc::OutputDataOrBytes::Data(data) => Ok(data), + _ => Err(atrium_xrpc::Error::UnexpectedResponseType), + } + } + ///Create or update setting option + pub async fn upsert_option( + &self, + input: crate::tools::ozone::setting::upsert_option::Input, + ) -> atrium_xrpc::Result< + crate::tools::ozone::setting::upsert_option::Output, + crate::tools::ozone::setting::upsert_option::Error, + > { + let response = self + .xrpc + .send_xrpc::< + (), + _, + _, + _, + >( + &atrium_xrpc::XrpcRequest { + method: http::Method::POST, + nsid: crate::tools::ozone::setting::upsert_option::NSID.into(), + parameters: None, + input: Some(atrium_xrpc::InputDataOrBytes::Data(input)), + encoding: Some(String::from("application/json")), + }, + ) + .await?; + match response { + atrium_xrpc::OutputDataOrBytes::Data(data) => Ok(data), + _ => Err(atrium_xrpc::Error::UnexpectedResponseType), + } + } +} +#[cfg(feature = "namespace-toolsozone")] impl tools::ozone::signature::Service where T: atrium_xrpc::XrpcClient + Send + Sync, diff --git a/atrium-api/src/com/atproto/admin/defs.rs b/atrium-api/src/com/atproto/admin/defs.rs index e93270e2..9d543581 100644 --- a/atrium-api/src/com/atproto/admin/defs.rs +++ b/atrium-api/src/com/atproto/admin/defs.rs @@ -3,25 +3,29 @@ #[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq)] #[serde(rename_all = "camelCase")] pub struct AccountViewData { - #[serde(skip_serializing_if = "Option::is_none")] - pub deactivated_at: Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub deactivated_at: core::option::Option, pub did: crate::types::string::Did, - #[serde(skip_serializing_if = "Option::is_none")] - pub email: Option, - #[serde(skip_serializing_if = "Option::is_none")] - pub email_confirmed_at: Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub email: core::option::Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub email_confirmed_at: core::option::Option, pub handle: crate::types::string::Handle, pub indexed_at: crate::types::string::Datetime, - #[serde(skip_serializing_if = "Option::is_none")] - pub invite_note: Option, - #[serde(skip_serializing_if = "Option::is_none")] - pub invited_by: Option, - #[serde(skip_serializing_if = "Option::is_none")] - pub invites: Option>, - #[serde(skip_serializing_if = "Option::is_none")] - pub invites_disabled: Option, - #[serde(skip_serializing_if = "Option::is_none")] - pub related_records: Option>, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub invite_note: core::option::Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub invited_by: core::option::Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub invites: core::option::Option< + Vec, + >, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub invites_disabled: core::option::Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub related_records: core::option::Option>, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub threat_signatures: core::option::Option>, } pub type AccountView = crate::types::Object; #[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq)] @@ -29,8 +33,8 @@ pub type AccountView = crate::types::Object; pub struct RepoBlobRefData { pub cid: crate::types::string::Cid, pub did: crate::types::string::Did, - #[serde(skip_serializing_if = "Option::is_none")] - pub record_uri: Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub record_uri: core::option::Option, } pub type RepoBlobRef = crate::types::Object; #[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq)] @@ -43,7 +47,14 @@ pub type RepoRef = crate::types::Object; #[serde(rename_all = "camelCase")] pub struct StatusAttrData { pub applied: bool, - #[serde(skip_serializing_if = "Option::is_none")] - pub r#ref: Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub r#ref: core::option::Option, } pub type StatusAttr = crate::types::Object; +#[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq)] +#[serde(rename_all = "camelCase")] +pub struct ThreatSignatureData { + pub property: String, + pub value: String, +} +pub type ThreatSignature = crate::types::Object; diff --git a/atrium-api/src/com/atproto/admin/disable_account_invites.rs b/atrium-api/src/com/atproto/admin/disable_account_invites.rs index f79458be..ec0a8e8f 100644 --- a/atrium-api/src/com/atproto/admin/disable_account_invites.rs +++ b/atrium-api/src/com/atproto/admin/disable_account_invites.rs @@ -6,8 +6,8 @@ pub const NSID: &str = "com.atproto.admin.disableAccountInvites"; pub struct InputData { pub account: crate::types::string::Did, ///Optional reason for disabled invites. - #[serde(skip_serializing_if = "Option::is_none")] - pub note: Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub note: core::option::Option, } pub type Input = crate::types::Object; #[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq)] diff --git a/atrium-api/src/com/atproto/admin/disable_invite_codes.rs b/atrium-api/src/com/atproto/admin/disable_invite_codes.rs index 6b66a2c2..37f2e51d 100644 --- a/atrium-api/src/com/atproto/admin/disable_invite_codes.rs +++ b/atrium-api/src/com/atproto/admin/disable_invite_codes.rs @@ -4,10 +4,10 @@ pub const NSID: &str = "com.atproto.admin.disableInviteCodes"; #[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq)] #[serde(rename_all = "camelCase")] pub struct InputData { - #[serde(skip_serializing_if = "Option::is_none")] - pub accounts: Option>, - #[serde(skip_serializing_if = "Option::is_none")] - pub codes: Option>, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub accounts: core::option::Option>, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub codes: core::option::Option>, } pub type Input = crate::types::Object; #[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq)] diff --git a/atrium-api/src/com/atproto/admin/enable_account_invites.rs b/atrium-api/src/com/atproto/admin/enable_account_invites.rs index 82572a48..fb74dd59 100644 --- a/atrium-api/src/com/atproto/admin/enable_account_invites.rs +++ b/atrium-api/src/com/atproto/admin/enable_account_invites.rs @@ -6,8 +6,8 @@ pub const NSID: &str = "com.atproto.admin.enableAccountInvites"; pub struct InputData { pub account: crate::types::string::Did, ///Optional reason for enabled invites. - #[serde(skip_serializing_if = "Option::is_none")] - pub note: Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub note: core::option::Option, } pub type Input = crate::types::Object; #[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq)] diff --git a/atrium-api/src/com/atproto/admin/get_invite_codes.rs b/atrium-api/src/com/atproto/admin/get_invite_codes.rs index 750a15d1..bfbd6885 100644 --- a/atrium-api/src/com/atproto/admin/get_invite_codes.rs +++ b/atrium-api/src/com/atproto/admin/get_invite_codes.rs @@ -4,20 +4,20 @@ pub const NSID: &str = "com.atproto.admin.getInviteCodes"; #[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq)] #[serde(rename_all = "camelCase")] pub struct ParametersData { - #[serde(skip_serializing_if = "Option::is_none")] - pub cursor: Option, - #[serde(skip_serializing_if = "Option::is_none")] - pub limit: Option>, - #[serde(skip_serializing_if = "Option::is_none")] - pub sort: Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub cursor: core::option::Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub limit: core::option::Option>, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub sort: core::option::Option, } pub type Parameters = crate::types::Object; #[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq)] #[serde(rename_all = "camelCase")] pub struct OutputData { pub codes: Vec, - #[serde(skip_serializing_if = "Option::is_none")] - pub cursor: Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub cursor: core::option::Option, } pub type Output = crate::types::Object; #[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq)] diff --git a/atrium-api/src/com/atproto/admin/get_subject_status.rs b/atrium-api/src/com/atproto/admin/get_subject_status.rs index 98fdeaf8..53e5ba41 100644 --- a/atrium-api/src/com/atproto/admin/get_subject_status.rs +++ b/atrium-api/src/com/atproto/admin/get_subject_status.rs @@ -4,22 +4,22 @@ pub const NSID: &str = "com.atproto.admin.getSubjectStatus"; #[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq)] #[serde(rename_all = "camelCase")] pub struct ParametersData { - #[serde(skip_serializing_if = "Option::is_none")] - pub blob: Option, - #[serde(skip_serializing_if = "Option::is_none")] - pub did: Option, - #[serde(skip_serializing_if = "Option::is_none")] - pub uri: Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub blob: core::option::Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub did: core::option::Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub uri: core::option::Option, } pub type Parameters = crate::types::Object; #[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq)] #[serde(rename_all = "camelCase")] pub struct OutputData { - #[serde(skip_serializing_if = "Option::is_none")] - pub deactivated: Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub deactivated: core::option::Option, pub subject: crate::types::Union, - #[serde(skip_serializing_if = "Option::is_none")] - pub takedown: Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub takedown: core::option::Option, } pub type Output = crate::types::Object; #[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq)] diff --git a/atrium-api/src/com/atproto/admin/search_accounts.rs b/atrium-api/src/com/atproto/admin/search_accounts.rs index 46357fde..1fde4243 100644 --- a/atrium-api/src/com/atproto/admin/search_accounts.rs +++ b/atrium-api/src/com/atproto/admin/search_accounts.rs @@ -4,20 +4,20 @@ pub const NSID: &str = "com.atproto.admin.searchAccounts"; #[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq)] #[serde(rename_all = "camelCase")] pub struct ParametersData { - #[serde(skip_serializing_if = "Option::is_none")] - pub cursor: Option, - #[serde(skip_serializing_if = "Option::is_none")] - pub email: Option, - #[serde(skip_serializing_if = "Option::is_none")] - pub limit: Option>, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub cursor: core::option::Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub email: core::option::Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub limit: core::option::Option>, } pub type Parameters = crate::types::Object; #[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq)] #[serde(rename_all = "camelCase")] pub struct OutputData { pub accounts: Vec, - #[serde(skip_serializing_if = "Option::is_none")] - pub cursor: Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub cursor: core::option::Option, } pub type Output = crate::types::Object; #[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq)] diff --git a/atrium-api/src/com/atproto/admin/send_email.rs b/atrium-api/src/com/atproto/admin/send_email.rs index 0153e919..5540958d 100644 --- a/atrium-api/src/com/atproto/admin/send_email.rs +++ b/atrium-api/src/com/atproto/admin/send_email.rs @@ -5,13 +5,13 @@ pub const NSID: &str = "com.atproto.admin.sendEmail"; #[serde(rename_all = "camelCase")] pub struct InputData { ///Additional comment by the sender that won't be used in the email itself but helpful to provide more context for moderators/reviewers - #[serde(skip_serializing_if = "Option::is_none")] - pub comment: Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub comment: core::option::Option, pub content: String, pub recipient_did: crate::types::string::Did, pub sender_did: crate::types::string::Did, - #[serde(skip_serializing_if = "Option::is_none")] - pub subject: Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub subject: core::option::Option, } pub type Input = crate::types::Object; #[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq)] diff --git a/atrium-api/src/com/atproto/admin/update_subject_status.rs b/atrium-api/src/com/atproto/admin/update_subject_status.rs index f1fb33d4..c80ae81c 100644 --- a/atrium-api/src/com/atproto/admin/update_subject_status.rs +++ b/atrium-api/src/com/atproto/admin/update_subject_status.rs @@ -4,19 +4,19 @@ pub const NSID: &str = "com.atproto.admin.updateSubjectStatus"; #[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq)] #[serde(rename_all = "camelCase")] pub struct InputData { - #[serde(skip_serializing_if = "Option::is_none")] - pub deactivated: Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub deactivated: core::option::Option, pub subject: crate::types::Union, - #[serde(skip_serializing_if = "Option::is_none")] - pub takedown: Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub takedown: core::option::Option, } pub type Input = crate::types::Object; #[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq)] #[serde(rename_all = "camelCase")] pub struct OutputData { pub subject: crate::types::Union, - #[serde(skip_serializing_if = "Option::is_none")] - pub takedown: Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub takedown: core::option::Option, } pub type Output = crate::types::Object; #[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq)] diff --git a/atrium-api/src/com/atproto/identity/get_recommended_did_credentials.rs b/atrium-api/src/com/atproto/identity/get_recommended_did_credentials.rs index 3058b505..6853a0d4 100644 --- a/atrium-api/src/com/atproto/identity/get_recommended_did_credentials.rs +++ b/atrium-api/src/com/atproto/identity/get_recommended_did_credentials.rs @@ -4,15 +4,15 @@ pub const NSID: &str = "com.atproto.identity.getRecommendedDidCredentials"; #[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq)] #[serde(rename_all = "camelCase")] pub struct OutputData { - #[serde(skip_serializing_if = "Option::is_none")] - pub also_known_as: Option>, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub also_known_as: core::option::Option>, ///Recommended rotation keys for PLC dids. Should be undefined (or ignored) for did:webs. - #[serde(skip_serializing_if = "Option::is_none")] - pub rotation_keys: Option>, - #[serde(skip_serializing_if = "Option::is_none")] - pub services: Option, - #[serde(skip_serializing_if = "Option::is_none")] - pub verification_methods: Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub rotation_keys: core::option::Option>, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub services: core::option::Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub verification_methods: core::option::Option, } pub type Output = crate::types::Object; #[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq)] diff --git a/atrium-api/src/com/atproto/identity/sign_plc_operation.rs b/atrium-api/src/com/atproto/identity/sign_plc_operation.rs index ffe383e0..21de3857 100644 --- a/atrium-api/src/com/atproto/identity/sign_plc_operation.rs +++ b/atrium-api/src/com/atproto/identity/sign_plc_operation.rs @@ -4,17 +4,17 @@ pub const NSID: &str = "com.atproto.identity.signPlcOperation"; #[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq)] #[serde(rename_all = "camelCase")] pub struct InputData { - #[serde(skip_serializing_if = "Option::is_none")] - pub also_known_as: Option>, - #[serde(skip_serializing_if = "Option::is_none")] - pub rotation_keys: Option>, - #[serde(skip_serializing_if = "Option::is_none")] - pub services: Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub also_known_as: core::option::Option>, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub rotation_keys: core::option::Option>, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub services: core::option::Option, ///A token received through com.atproto.identity.requestPlcOperationSignature - #[serde(skip_serializing_if = "Option::is_none")] - pub token: Option, - #[serde(skip_serializing_if = "Option::is_none")] - pub verification_methods: Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub token: core::option::Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub verification_methods: core::option::Option, } pub type Input = crate::types::Object; #[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq)] diff --git a/atrium-api/src/com/atproto/label/defs.rs b/atrium-api/src/com/atproto/label/defs.rs index 8ecc14bd..1ffea68b 100644 --- a/atrium-api/src/com/atproto/label/defs.rs +++ b/atrium-api/src/com/atproto/label/defs.rs @@ -5,21 +5,21 @@ #[serde(rename_all = "camelCase")] pub struct LabelData { ///Optionally, CID specifying the specific version of 'uri' resource this label applies to. - #[serde(skip_serializing_if = "Option::is_none")] - pub cid: Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub cid: core::option::Option, ///Timestamp when this label was created. pub cts: crate::types::string::Datetime, ///Timestamp at which this label expires (no longer applies). - #[serde(skip_serializing_if = "Option::is_none")] - pub exp: Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub exp: core::option::Option, ///If true, this is a negation label, overwriting a previous label. - #[serde(skip_serializing_if = "Option::is_none")] - pub neg: Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub neg: core::option::Option, ///Signature of dag-cbor encoded label. #[serde(default)] #[serde(with = "serde_bytes")] - #[serde(skip_serializing_if = "Option::is_none")] - pub sig: Option>, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub sig: core::option::Option>, ///DID of the actor who created this label. pub src: crate::types::string::Did, ///AT URI of the record, repository (account), or other resource that this label applies to. @@ -27,8 +27,8 @@ pub struct LabelData { ///The short string name of the value or type of this label. pub val: String, ///The AT Protocol version of the label object. - #[serde(skip_serializing_if = "Option::is_none")] - pub ver: Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub ver: core::option::Option, } pub type Label = crate::types::Object; pub type LabelValue = String; @@ -37,13 +37,13 @@ pub type LabelValue = String; #[serde(rename_all = "camelCase")] pub struct LabelValueDefinitionData { ///Does the user need to have adult content enabled in order to configure this label? - #[serde(skip_serializing_if = "Option::is_none")] - pub adult_only: Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub adult_only: core::option::Option, ///What should this label hide in the UI, if applied? 'content' hides all of the target; 'media' hides the images/video/audio; 'none' hides nothing. pub blurs: String, ///The default setting for this label. - #[serde(skip_serializing_if = "Option::is_none")] - pub default_setting: Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub default_setting: core::option::Option, ///The value of the label being defined. Must only include lowercase ascii and the '-' character ([a-z-]+). pub identifier: String, pub locales: Vec, diff --git a/atrium-api/src/com/atproto/label/query_labels.rs b/atrium-api/src/com/atproto/label/query_labels.rs index 42950d1f..c85c6eb4 100644 --- a/atrium-api/src/com/atproto/label/query_labels.rs +++ b/atrium-api/src/com/atproto/label/query_labels.rs @@ -4,13 +4,13 @@ pub const NSID: &str = "com.atproto.label.queryLabels"; #[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq)] #[serde(rename_all = "camelCase")] pub struct ParametersData { - #[serde(skip_serializing_if = "Option::is_none")] - pub cursor: Option, - #[serde(skip_serializing_if = "Option::is_none")] - pub limit: Option>, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub cursor: core::option::Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub limit: core::option::Option>, ///Optional list of label sources (DIDs) to filter on. - #[serde(skip_serializing_if = "Option::is_none")] - pub sources: Option>, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub sources: core::option::Option>, ///List of AT URI patterns to match (boolean 'OR'). Each may be a prefix (ending with '*'; will match inclusive of the string leading to '*'), or a full URI. pub uri_patterns: Vec, } @@ -18,8 +18,8 @@ pub type Parameters = crate::types::Object; #[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq)] #[serde(rename_all = "camelCase")] pub struct OutputData { - #[serde(skip_serializing_if = "Option::is_none")] - pub cursor: Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub cursor: core::option::Option, pub labels: Vec, } pub type Output = crate::types::Object; diff --git a/atrium-api/src/com/atproto/label/subscribe_labels.rs b/atrium-api/src/com/atproto/label/subscribe_labels.rs index a6268389..fc55e081 100644 --- a/atrium-api/src/com/atproto/label/subscribe_labels.rs +++ b/atrium-api/src/com/atproto/label/subscribe_labels.rs @@ -5,8 +5,8 @@ pub const NSID: &str = "com.atproto.label.subscribeLabels"; #[serde(rename_all = "camelCase")] pub struct ParametersData { ///The last known event seq number to backfill from. - #[serde(skip_serializing_if = "Option::is_none")] - pub cursor: Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub cursor: core::option::Option, } pub type Parameters = crate::types::Object; #[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq)] @@ -30,8 +30,8 @@ impl std::fmt::Display for Error { #[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq)] #[serde(rename_all = "camelCase")] pub struct InfoData { - #[serde(skip_serializing_if = "Option::is_none")] - pub message: Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub message: core::option::Option, pub name: String, } pub type Info = crate::types::Object; diff --git a/atrium-api/src/com/atproto/moderation/create_report.rs b/atrium-api/src/com/atproto/moderation/create_report.rs index cb5d876f..d753fc2b 100644 --- a/atrium-api/src/com/atproto/moderation/create_report.rs +++ b/atrium-api/src/com/atproto/moderation/create_report.rs @@ -5,8 +5,8 @@ pub const NSID: &str = "com.atproto.moderation.createReport"; #[serde(rename_all = "camelCase")] pub struct InputData { ///Additional context about the content and violation. - #[serde(skip_serializing_if = "Option::is_none")] - pub reason: Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub reason: core::option::Option, ///Indicates the broad category of violation the report is for. pub reason_type: crate::com::atproto::moderation::defs::ReasonType, pub subject: crate::types::Union, @@ -17,8 +17,8 @@ pub type Input = crate::types::Object; pub struct OutputData { pub created_at: crate::types::string::Datetime, pub id: i64, - #[serde(skip_serializing_if = "Option::is_none")] - pub reason: Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub reason: core::option::Option, pub reason_type: crate::com::atproto::moderation::defs::ReasonType, pub reported_by: crate::types::string::Did, pub subject: crate::types::Union, diff --git a/atrium-api/src/com/atproto/repo/apply_writes.rs b/atrium-api/src/com/atproto/repo/apply_writes.rs index b71151a7..43e3455a 100644 --- a/atrium-api/src/com/atproto/repo/apply_writes.rs +++ b/atrium-api/src/com/atproto/repo/apply_writes.rs @@ -7,21 +7,21 @@ pub struct InputData { ///The handle or DID of the repo (aka, current account). pub repo: crate::types::string::AtIdentifier, ///If provided, the entire operation will fail if the current repo commit CID does not match this value. Used to prevent conflicting repo mutations. - #[serde(skip_serializing_if = "Option::is_none")] - pub swap_commit: Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub swap_commit: core::option::Option, ///Can be set to 'false' to skip Lexicon schema validation of record data across all operations, 'true' to require it, or leave unset to validate only for known Lexicons. - #[serde(skip_serializing_if = "Option::is_none")] - pub validate: Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub validate: core::option::Option, pub writes: Vec, } pub type Input = crate::types::Object; #[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq)] #[serde(rename_all = "camelCase")] pub struct OutputData { - #[serde(skip_serializing_if = "Option::is_none")] - pub commit: Option, - #[serde(skip_serializing_if = "Option::is_none")] - pub results: Option>, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub commit: core::option::Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub results: core::option::Option>, } pub type Output = crate::types::Object; #[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq)] @@ -48,8 +48,8 @@ impl std::fmt::Display for Error { #[serde(rename_all = "camelCase")] pub struct CreateData { pub collection: crate::types::string::Nsid, - #[serde(skip_serializing_if = "Option::is_none")] - pub rkey: Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub rkey: core::option::Option, pub value: crate::types::Unknown, } pub type Create = crate::types::Object; @@ -58,8 +58,8 @@ pub type Create = crate::types::Object; pub struct CreateResultData { pub cid: crate::types::string::Cid, pub uri: String, - #[serde(skip_serializing_if = "Option::is_none")] - pub validation_status: Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub validation_status: core::option::Option, } pub type CreateResult = crate::types::Object; ///Operation which deletes an existing record. @@ -88,8 +88,8 @@ pub type Update = crate::types::Object; pub struct UpdateResultData { pub cid: crate::types::string::Cid, pub uri: String, - #[serde(skip_serializing_if = "Option::is_none")] - pub validation_status: Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub validation_status: core::option::Option, } pub type UpdateResult = crate::types::Object; #[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq)] diff --git a/atrium-api/src/com/atproto/repo/create_record.rs b/atrium-api/src/com/atproto/repo/create_record.rs index 1cb8c08a..fc22ffe1 100644 --- a/atrium-api/src/com/atproto/repo/create_record.rs +++ b/atrium-api/src/com/atproto/repo/create_record.rs @@ -11,25 +11,25 @@ pub struct InputData { ///The handle or DID of the repo (aka, current account). pub repo: crate::types::string::AtIdentifier, ///The Record Key. - #[serde(skip_serializing_if = "Option::is_none")] - pub rkey: Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub rkey: core::option::Option, ///Compare and swap with the previous commit by CID. - #[serde(skip_serializing_if = "Option::is_none")] - pub swap_commit: Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub swap_commit: core::option::Option, ///Can be set to 'false' to skip Lexicon schema validation of record data, 'true' to require it, or leave unset to validate only for known Lexicons. - #[serde(skip_serializing_if = "Option::is_none")] - pub validate: Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub validate: core::option::Option, } pub type Input = crate::types::Object; #[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq)] #[serde(rename_all = "camelCase")] pub struct OutputData { pub cid: crate::types::string::Cid, - #[serde(skip_serializing_if = "Option::is_none")] - pub commit: Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub commit: core::option::Option, pub uri: String, - #[serde(skip_serializing_if = "Option::is_none")] - pub validation_status: Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub validation_status: core::option::Option, } pub type Output = crate::types::Object; #[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq)] diff --git a/atrium-api/src/com/atproto/repo/delete_record.rs b/atrium-api/src/com/atproto/repo/delete_record.rs index 5eaee1d7..44748b76 100644 --- a/atrium-api/src/com/atproto/repo/delete_record.rs +++ b/atrium-api/src/com/atproto/repo/delete_record.rs @@ -11,18 +11,18 @@ pub struct InputData { ///The Record Key. pub rkey: String, ///Compare and swap with the previous commit by CID. - #[serde(skip_serializing_if = "Option::is_none")] - pub swap_commit: Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub swap_commit: core::option::Option, ///Compare and swap with the previous record by CID. - #[serde(skip_serializing_if = "Option::is_none")] - pub swap_record: Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub swap_record: core::option::Option, } pub type Input = crate::types::Object; #[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq)] #[serde(rename_all = "camelCase")] pub struct OutputData { - #[serde(skip_serializing_if = "Option::is_none")] - pub commit: Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub commit: core::option::Option, } pub type Output = crate::types::Object; #[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq)] diff --git a/atrium-api/src/com/atproto/repo/get_record.rs b/atrium-api/src/com/atproto/repo/get_record.rs index a4995e08..fdd9faf0 100644 --- a/atrium-api/src/com/atproto/repo/get_record.rs +++ b/atrium-api/src/com/atproto/repo/get_record.rs @@ -5,8 +5,8 @@ pub const NSID: &str = "com.atproto.repo.getRecord"; #[serde(rename_all = "camelCase")] pub struct ParametersData { ///The CID of the version of the record. If not specified, then return the most recent version. - #[serde(skip_serializing_if = "Option::is_none")] - pub cid: Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub cid: core::option::Option, ///The NSID of the record collection. pub collection: crate::types::string::Nsid, ///The handle or DID of the repo. @@ -18,8 +18,8 @@ pub type Parameters = crate::types::Object; #[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq)] #[serde(rename_all = "camelCase")] pub struct OutputData { - #[serde(skip_serializing_if = "Option::is_none")] - pub cid: Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub cid: core::option::Option, pub uri: String, pub value: crate::types::Unknown, } diff --git a/atrium-api/src/com/atproto/repo/list_missing_blobs.rs b/atrium-api/src/com/atproto/repo/list_missing_blobs.rs index bfd8920a..6041e94e 100644 --- a/atrium-api/src/com/atproto/repo/list_missing_blobs.rs +++ b/atrium-api/src/com/atproto/repo/list_missing_blobs.rs @@ -4,18 +4,18 @@ pub const NSID: &str = "com.atproto.repo.listMissingBlobs"; #[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq)] #[serde(rename_all = "camelCase")] pub struct ParametersData { - #[serde(skip_serializing_if = "Option::is_none")] - pub cursor: Option, - #[serde(skip_serializing_if = "Option::is_none")] - pub limit: Option>, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub cursor: core::option::Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub limit: core::option::Option>, } pub type Parameters = crate::types::Object; #[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq)] #[serde(rename_all = "camelCase")] pub struct OutputData { pub blobs: Vec, - #[serde(skip_serializing_if = "Option::is_none")] - pub cursor: Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub cursor: core::option::Option, } pub type Output = crate::types::Object; #[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq)] diff --git a/atrium-api/src/com/atproto/repo/list_records.rs b/atrium-api/src/com/atproto/repo/list_records.rs index d15ca61a..6273c8b5 100644 --- a/atrium-api/src/com/atproto/repo/list_records.rs +++ b/atrium-api/src/com/atproto/repo/list_records.rs @@ -6,29 +6,29 @@ pub const NSID: &str = "com.atproto.repo.listRecords"; pub struct ParametersData { ///The NSID of the record type. pub collection: crate::types::string::Nsid, - #[serde(skip_serializing_if = "Option::is_none")] - pub cursor: Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub cursor: core::option::Option, ///The number of records to return. - #[serde(skip_serializing_if = "Option::is_none")] - pub limit: Option>, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub limit: core::option::Option>, ///The handle or DID of the repo. pub repo: crate::types::string::AtIdentifier, ///Flag to reverse the order of the returned records. - #[serde(skip_serializing_if = "Option::is_none")] - pub reverse: Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub reverse: core::option::Option, ///DEPRECATED: The highest sort-ordered rkey to stop at (exclusive) - #[serde(skip_serializing_if = "Option::is_none")] - pub rkey_end: Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub rkey_end: core::option::Option, ///DEPRECATED: The lowest sort-ordered rkey to start from (exclusive) - #[serde(skip_serializing_if = "Option::is_none")] - pub rkey_start: Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub rkey_start: core::option::Option, } pub type Parameters = crate::types::Object; #[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq)] #[serde(rename_all = "camelCase")] pub struct OutputData { - #[serde(skip_serializing_if = "Option::is_none")] - pub cursor: Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub cursor: core::option::Option, pub records: Vec, } pub type Output = crate::types::Object; diff --git a/atrium-api/src/com/atproto/repo/put_record.rs b/atrium-api/src/com/atproto/repo/put_record.rs index 9844c1ea..ba31f977 100644 --- a/atrium-api/src/com/atproto/repo/put_record.rs +++ b/atrium-api/src/com/atproto/repo/put_record.rs @@ -13,25 +13,25 @@ pub struct InputData { ///The Record Key. pub rkey: String, ///Compare and swap with the previous commit by CID. - #[serde(skip_serializing_if = "Option::is_none")] - pub swap_commit: Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub swap_commit: core::option::Option, ///Compare and swap with the previous record by CID. WARNING: nullable and optional field; may cause problems with golang implementation - #[serde(skip_serializing_if = "Option::is_none")] - pub swap_record: Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub swap_record: core::option::Option, ///Can be set to 'false' to skip Lexicon schema validation of record data, 'true' to require it, or leave unset to validate only for known Lexicons. - #[serde(skip_serializing_if = "Option::is_none")] - pub validate: Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub validate: core::option::Option, } pub type Input = crate::types::Object; #[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq)] #[serde(rename_all = "camelCase")] pub struct OutputData { pub cid: crate::types::string::Cid, - #[serde(skip_serializing_if = "Option::is_none")] - pub commit: Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub commit: core::option::Option, pub uri: String, - #[serde(skip_serializing_if = "Option::is_none")] - pub validation_status: Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub validation_status: core::option::Option, } pub type Output = crate::types::Object; #[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq)] diff --git a/atrium-api/src/com/atproto/server/create_account.rs b/atrium-api/src/com/atproto/server/create_account.rs index 5905ca3c..839b1d8f 100644 --- a/atrium-api/src/com/atproto/server/create_account.rs +++ b/atrium-api/src/com/atproto/server/create_account.rs @@ -5,27 +5,27 @@ pub const NSID: &str = "com.atproto.server.createAccount"; #[serde(rename_all = "camelCase")] pub struct InputData { ///Pre-existing atproto DID, being imported to a new account. - #[serde(skip_serializing_if = "Option::is_none")] - pub did: Option, - #[serde(skip_serializing_if = "Option::is_none")] - pub email: Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub did: core::option::Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub email: core::option::Option, ///Requested handle for the account. pub handle: crate::types::string::Handle, - #[serde(skip_serializing_if = "Option::is_none")] - pub invite_code: Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub invite_code: core::option::Option, ///Initial account password. May need to meet instance-specific password strength requirements. - #[serde(skip_serializing_if = "Option::is_none")] - pub password: Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub password: core::option::Option, ///A signed DID PLC operation to be submitted as part of importing an existing account to this instance. NOTE: this optional field may be updated when full account migration is implemented. - #[serde(skip_serializing_if = "Option::is_none")] - pub plc_op: Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub plc_op: core::option::Option, ///DID PLC rotation key (aka, recovery key) to be included in PLC creation operation. - #[serde(skip_serializing_if = "Option::is_none")] - pub recovery_key: Option, - #[serde(skip_serializing_if = "Option::is_none")] - pub verification_code: Option, - #[serde(skip_serializing_if = "Option::is_none")] - pub verification_phone: Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub recovery_key: core::option::Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub verification_code: core::option::Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub verification_phone: core::option::Option, } pub type Input = crate::types::Object; ///Account login session returned on successful account creation. @@ -36,8 +36,8 @@ pub struct OutputData { ///The DID of the new account. pub did: crate::types::string::Did, ///Complete DID document. - #[serde(skip_serializing_if = "Option::is_none")] - pub did_doc: Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub did_doc: core::option::Option, pub handle: crate::types::string::Handle, pub refresh_jwt: String, } diff --git a/atrium-api/src/com/atproto/server/create_app_password.rs b/atrium-api/src/com/atproto/server/create_app_password.rs index a2524008..829dc975 100644 --- a/atrium-api/src/com/atproto/server/create_app_password.rs +++ b/atrium-api/src/com/atproto/server/create_app_password.rs @@ -7,8 +7,8 @@ pub struct InputData { ///A short name for the App Password, to help distinguish them. pub name: String, ///If an app password has 'privileged' access to possibly sensitive account state. Meant for use with trusted clients. - #[serde(skip_serializing_if = "Option::is_none")] - pub privileged: Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub privileged: core::option::Option, } pub type Input = crate::types::Object; pub type Output = AppPassword; @@ -36,7 +36,7 @@ pub struct AppPasswordData { pub created_at: crate::types::string::Datetime, pub name: String, pub password: String, - #[serde(skip_serializing_if = "Option::is_none")] - pub privileged: Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub privileged: core::option::Option, } pub type AppPassword = crate::types::Object; diff --git a/atrium-api/src/com/atproto/server/create_invite_code.rs b/atrium-api/src/com/atproto/server/create_invite_code.rs index 2a14f530..87727864 100644 --- a/atrium-api/src/com/atproto/server/create_invite_code.rs +++ b/atrium-api/src/com/atproto/server/create_invite_code.rs @@ -4,8 +4,8 @@ pub const NSID: &str = "com.atproto.server.createInviteCode"; #[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq)] #[serde(rename_all = "camelCase")] pub struct InputData { - #[serde(skip_serializing_if = "Option::is_none")] - pub for_account: Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub for_account: core::option::Option, pub use_count: i64, } pub type Input = crate::types::Object; diff --git a/atrium-api/src/com/atproto/server/create_invite_codes.rs b/atrium-api/src/com/atproto/server/create_invite_codes.rs index 65a62659..986f5e15 100644 --- a/atrium-api/src/com/atproto/server/create_invite_codes.rs +++ b/atrium-api/src/com/atproto/server/create_invite_codes.rs @@ -5,8 +5,8 @@ pub const NSID: &str = "com.atproto.server.createInviteCodes"; #[serde(rename_all = "camelCase")] pub struct InputData { pub code_count: i64, - #[serde(skip_serializing_if = "Option::is_none")] - pub for_accounts: Option>, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub for_accounts: core::option::Option>, pub use_count: i64, } pub type Input = crate::types::Object; diff --git a/atrium-api/src/com/atproto/server/create_session.rs b/atrium-api/src/com/atproto/server/create_session.rs index 9f0888b4..c3848634 100644 --- a/atrium-api/src/com/atproto/server/create_session.rs +++ b/atrium-api/src/com/atproto/server/create_session.rs @@ -4,8 +4,8 @@ pub const NSID: &str = "com.atproto.server.createSession"; #[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq)] #[serde(rename_all = "camelCase")] pub struct InputData { - #[serde(skip_serializing_if = "Option::is_none")] - pub auth_factor_token: Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub auth_factor_token: core::option::Option, ///Handle or other identifier supported by the server for the authenticating user. pub identifier: String, pub password: String, @@ -15,22 +15,22 @@ pub type Input = crate::types::Object; #[serde(rename_all = "camelCase")] pub struct OutputData { pub access_jwt: String, - #[serde(skip_serializing_if = "Option::is_none")] - pub active: Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub active: core::option::Option, pub did: crate::types::string::Did, - #[serde(skip_serializing_if = "Option::is_none")] - pub did_doc: Option, - #[serde(skip_serializing_if = "Option::is_none")] - pub email: Option, - #[serde(skip_serializing_if = "Option::is_none")] - pub email_auth_factor: Option, - #[serde(skip_serializing_if = "Option::is_none")] - pub email_confirmed: Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub did_doc: core::option::Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub email: core::option::Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub email_auth_factor: core::option::Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub email_confirmed: core::option::Option, pub handle: crate::types::string::Handle, pub refresh_jwt: String, ///If active=false, this optional field indicates a possible reason for why the account is not active. If active=false and no status is supplied, then the host makes no claim for why the repository is no longer being hosted. - #[serde(skip_serializing_if = "Option::is_none")] - pub status: Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub status: core::option::Option, } pub type Output = crate::types::Object; #[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq)] diff --git a/atrium-api/src/com/atproto/server/deactivate_account.rs b/atrium-api/src/com/atproto/server/deactivate_account.rs index c62985a6..70460a22 100644 --- a/atrium-api/src/com/atproto/server/deactivate_account.rs +++ b/atrium-api/src/com/atproto/server/deactivate_account.rs @@ -5,8 +5,8 @@ pub const NSID: &str = "com.atproto.server.deactivateAccount"; #[serde(rename_all = "camelCase")] pub struct InputData { ///A recommendation to server as to how long they should hold onto the deactivated account before deleting. - #[serde(skip_serializing_if = "Option::is_none")] - pub delete_after: Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub delete_after: core::option::Option, } pub type Input = crate::types::Object; #[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq)] diff --git a/atrium-api/src/com/atproto/server/describe_server.rs b/atrium-api/src/com/atproto/server/describe_server.rs index 90989dba..f37156aa 100644 --- a/atrium-api/src/com/atproto/server/describe_server.rs +++ b/atrium-api/src/com/atproto/server/describe_server.rs @@ -7,18 +7,18 @@ pub struct OutputData { ///List of domain suffixes that can be used in account handles. pub available_user_domains: Vec, ///Contact information - #[serde(skip_serializing_if = "Option::is_none")] - pub contact: Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub contact: core::option::Option, pub did: crate::types::string::Did, ///If true, an invite code must be supplied to create an account on this instance. - #[serde(skip_serializing_if = "Option::is_none")] - pub invite_code_required: Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub invite_code_required: core::option::Option, ///URLs of service policy documents. - #[serde(skip_serializing_if = "Option::is_none")] - pub links: Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub links: core::option::Option, ///If true, a phone verification token must be supplied to create an account on this instance. - #[serde(skip_serializing_if = "Option::is_none")] - pub phone_verification_required: Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub phone_verification_required: core::option::Option, } pub type Output = crate::types::Object; #[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq)] @@ -32,16 +32,16 @@ impl std::fmt::Display for Error { #[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq)] #[serde(rename_all = "camelCase")] pub struct ContactData { - #[serde(skip_serializing_if = "Option::is_none")] - pub email: Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub email: core::option::Option, } pub type Contact = crate::types::Object; #[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq)] #[serde(rename_all = "camelCase")] pub struct LinksData { - #[serde(skip_serializing_if = "Option::is_none")] - pub privacy_policy: Option, - #[serde(skip_serializing_if = "Option::is_none")] - pub terms_of_service: Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub privacy_policy: core::option::Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub terms_of_service: core::option::Option, } pub type Links = crate::types::Object; diff --git a/atrium-api/src/com/atproto/server/get_account_invite_codes.rs b/atrium-api/src/com/atproto/server/get_account_invite_codes.rs index 6e7c0bf1..bc85290d 100644 --- a/atrium-api/src/com/atproto/server/get_account_invite_codes.rs +++ b/atrium-api/src/com/atproto/server/get_account_invite_codes.rs @@ -5,10 +5,10 @@ pub const NSID: &str = "com.atproto.server.getAccountInviteCodes"; #[serde(rename_all = "camelCase")] pub struct ParametersData { ///Controls whether any new 'earned' but not 'created' invites should be created. - #[serde(skip_serializing_if = "Option::is_none")] - pub create_available: Option, - #[serde(skip_serializing_if = "Option::is_none")] - pub include_used: Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub create_available: core::option::Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub include_used: core::option::Option, } pub type Parameters = crate::types::Object; #[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq)] diff --git a/atrium-api/src/com/atproto/server/get_service_auth.rs b/atrium-api/src/com/atproto/server/get_service_auth.rs index adb76c2a..9eaeb713 100644 --- a/atrium-api/src/com/atproto/server/get_service_auth.rs +++ b/atrium-api/src/com/atproto/server/get_service_auth.rs @@ -7,11 +7,11 @@ pub struct ParametersData { ///The DID of the service that the token will be used to authenticate with pub aud: crate::types::string::Did, ///The time in Unix Epoch seconds that the JWT expires. Defaults to 60 seconds in the future. The service may enforce certain time bounds on tokens depending on the requested scope. - #[serde(skip_serializing_if = "Option::is_none")] - pub exp: Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub exp: core::option::Option, ///Lexicon (XRPC) method to bind the requested token to - #[serde(skip_serializing_if = "Option::is_none")] - pub lxm: Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub lxm: core::option::Option, } pub type Parameters = crate::types::Object; #[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq)] diff --git a/atrium-api/src/com/atproto/server/get_session.rs b/atrium-api/src/com/atproto/server/get_session.rs index ee8017b5..b8fc03f0 100644 --- a/atrium-api/src/com/atproto/server/get_session.rs +++ b/atrium-api/src/com/atproto/server/get_session.rs @@ -4,21 +4,21 @@ pub const NSID: &str = "com.atproto.server.getSession"; #[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq)] #[serde(rename_all = "camelCase")] pub struct OutputData { - #[serde(skip_serializing_if = "Option::is_none")] - pub active: Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub active: core::option::Option, pub did: crate::types::string::Did, - #[serde(skip_serializing_if = "Option::is_none")] - pub did_doc: Option, - #[serde(skip_serializing_if = "Option::is_none")] - pub email: Option, - #[serde(skip_serializing_if = "Option::is_none")] - pub email_auth_factor: Option, - #[serde(skip_serializing_if = "Option::is_none")] - pub email_confirmed: Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub did_doc: core::option::Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub email: core::option::Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub email_auth_factor: core::option::Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub email_confirmed: core::option::Option, pub handle: crate::types::string::Handle, ///If active=false, this optional field indicates a possible reason for why the account is not active. If active=false and no status is supplied, then the host makes no claim for why the repository is no longer being hosted. - #[serde(skip_serializing_if = "Option::is_none")] - pub status: Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub status: core::option::Option, } pub type Output = crate::types::Object; #[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq)] diff --git a/atrium-api/src/com/atproto/server/list_app_passwords.rs b/atrium-api/src/com/atproto/server/list_app_passwords.rs index ba71a634..0e1608db 100644 --- a/atrium-api/src/com/atproto/server/list_app_passwords.rs +++ b/atrium-api/src/com/atproto/server/list_app_passwords.rs @@ -30,7 +30,7 @@ impl std::fmt::Display for Error { pub struct AppPasswordData { pub created_at: crate::types::string::Datetime, pub name: String, - #[serde(skip_serializing_if = "Option::is_none")] - pub privileged: Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub privileged: core::option::Option, } pub type AppPassword = crate::types::Object; diff --git a/atrium-api/src/com/atproto/server/refresh_session.rs b/atrium-api/src/com/atproto/server/refresh_session.rs index ce09ac56..13c12b28 100644 --- a/atrium-api/src/com/atproto/server/refresh_session.rs +++ b/atrium-api/src/com/atproto/server/refresh_session.rs @@ -5,16 +5,16 @@ pub const NSID: &str = "com.atproto.server.refreshSession"; #[serde(rename_all = "camelCase")] pub struct OutputData { pub access_jwt: String, - #[serde(skip_serializing_if = "Option::is_none")] - pub active: Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub active: core::option::Option, pub did: crate::types::string::Did, - #[serde(skip_serializing_if = "Option::is_none")] - pub did_doc: Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub did_doc: core::option::Option, pub handle: crate::types::string::Handle, pub refresh_jwt: String, ///Hosting status of the account. If not specified, then assume 'active'. - #[serde(skip_serializing_if = "Option::is_none")] - pub status: Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub status: core::option::Option, } pub type Output = crate::types::Object; #[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq)] diff --git a/atrium-api/src/com/atproto/server/reserve_signing_key.rs b/atrium-api/src/com/atproto/server/reserve_signing_key.rs index 24222915..5a2017ee 100644 --- a/atrium-api/src/com/atproto/server/reserve_signing_key.rs +++ b/atrium-api/src/com/atproto/server/reserve_signing_key.rs @@ -5,8 +5,8 @@ pub const NSID: &str = "com.atproto.server.reserveSigningKey"; #[serde(rename_all = "camelCase")] pub struct InputData { ///The DID to reserve a key for. - #[serde(skip_serializing_if = "Option::is_none")] - pub did: Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub did: core::option::Option, } pub type Input = crate::types::Object; #[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq)] diff --git a/atrium-api/src/com/atproto/server/update_email.rs b/atrium-api/src/com/atproto/server/update_email.rs index cf65c12c..659ada32 100644 --- a/atrium-api/src/com/atproto/server/update_email.rs +++ b/atrium-api/src/com/atproto/server/update_email.rs @@ -5,11 +5,11 @@ pub const NSID: &str = "com.atproto.server.updateEmail"; #[serde(rename_all = "camelCase")] pub struct InputData { pub email: String, - #[serde(skip_serializing_if = "Option::is_none")] - pub email_auth_factor: Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub email_auth_factor: core::option::Option, ///Requires a token from com.atproto.sever.requestEmailUpdate if the account's email has been confirmed. - #[serde(skip_serializing_if = "Option::is_none")] - pub token: Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub token: core::option::Option, } pub type Input = crate::types::Object; #[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq)] diff --git a/atrium-api/src/com/atproto/sync/get_record.rs b/atrium-api/src/com/atproto/sync/get_record.rs index 0d2cf1ac..e6391d1b 100644 --- a/atrium-api/src/com/atproto/sync/get_record.rs +++ b/atrium-api/src/com/atproto/sync/get_record.rs @@ -6,8 +6,8 @@ pub const NSID: &str = "com.atproto.sync.getRecord"; pub struct ParametersData { pub collection: crate::types::string::Nsid, ///DEPRECATED: referenced a repo commit by CID, and retrieved record as of that commit - #[serde(skip_serializing_if = "Option::is_none")] - pub commit: Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub commit: core::option::Option, ///The DID of the repo. pub did: crate::types::string::Did, ///Record Key diff --git a/atrium-api/src/com/atproto/sync/get_repo.rs b/atrium-api/src/com/atproto/sync/get_repo.rs index bcede4c2..2be271f3 100644 --- a/atrium-api/src/com/atproto/sync/get_repo.rs +++ b/atrium-api/src/com/atproto/sync/get_repo.rs @@ -7,8 +7,8 @@ pub struct ParametersData { ///The DID of the repo. pub did: crate::types::string::Did, ///The revision ('rev') of the repo to create a diff from. - #[serde(skip_serializing_if = "Option::is_none")] - pub since: Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub since: core::option::Option, } pub type Parameters = crate::types::Object; #[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq)] diff --git a/atrium-api/src/com/atproto/sync/get_repo_status.rs b/atrium-api/src/com/atproto/sync/get_repo_status.rs index fb8a9adb..41cb7cfa 100644 --- a/atrium-api/src/com/atproto/sync/get_repo_status.rs +++ b/atrium-api/src/com/atproto/sync/get_repo_status.rs @@ -14,11 +14,11 @@ pub struct OutputData { pub active: bool, pub did: crate::types::string::Did, ///Optional field, the current rev of the repo, if active=true - #[serde(skip_serializing_if = "Option::is_none")] - pub rev: Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub rev: core::option::Option, ///If active=false, this optional field indicates a possible reason for why the account is not active. If active=false and no status is supplied, then the host makes no claim for why the repository is no longer being hosted. - #[serde(skip_serializing_if = "Option::is_none")] - pub status: Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub status: core::option::Option, } pub type Output = crate::types::Object; #[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq)] diff --git a/atrium-api/src/com/atproto/sync/list_blobs.rs b/atrium-api/src/com/atproto/sync/list_blobs.rs index c609bd16..fae636fb 100644 --- a/atrium-api/src/com/atproto/sync/list_blobs.rs +++ b/atrium-api/src/com/atproto/sync/list_blobs.rs @@ -4,23 +4,23 @@ pub const NSID: &str = "com.atproto.sync.listBlobs"; #[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq)] #[serde(rename_all = "camelCase")] pub struct ParametersData { - #[serde(skip_serializing_if = "Option::is_none")] - pub cursor: Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub cursor: core::option::Option, ///The DID of the repo. pub did: crate::types::string::Did, - #[serde(skip_serializing_if = "Option::is_none")] - pub limit: Option>, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub limit: core::option::Option>, ///Optional revision of the repo to list blobs since. - #[serde(skip_serializing_if = "Option::is_none")] - pub since: Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub since: core::option::Option, } pub type Parameters = crate::types::Object; #[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq)] #[serde(rename_all = "camelCase")] pub struct OutputData { pub cids: Vec, - #[serde(skip_serializing_if = "Option::is_none")] - pub cursor: Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub cursor: core::option::Option, } pub type Output = crate::types::Object; #[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq)] diff --git a/atrium-api/src/com/atproto/sync/list_repos.rs b/atrium-api/src/com/atproto/sync/list_repos.rs index a4969c69..26a127dc 100644 --- a/atrium-api/src/com/atproto/sync/list_repos.rs +++ b/atrium-api/src/com/atproto/sync/list_repos.rs @@ -4,17 +4,17 @@ pub const NSID: &str = "com.atproto.sync.listRepos"; #[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq)] #[serde(rename_all = "camelCase")] pub struct ParametersData { - #[serde(skip_serializing_if = "Option::is_none")] - pub cursor: Option, - #[serde(skip_serializing_if = "Option::is_none")] - pub limit: Option>, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub cursor: core::option::Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub limit: core::option::Option>, } pub type Parameters = crate::types::Object; #[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq)] #[serde(rename_all = "camelCase")] pub struct OutputData { - #[serde(skip_serializing_if = "Option::is_none")] - pub cursor: Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub cursor: core::option::Option, pub repos: Vec, } pub type Output = crate::types::Object; @@ -29,14 +29,14 @@ impl std::fmt::Display for Error { #[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq)] #[serde(rename_all = "camelCase")] pub struct RepoData { - #[serde(skip_serializing_if = "Option::is_none")] - pub active: Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub active: core::option::Option, pub did: crate::types::string::Did, ///Current repo commit CID pub head: crate::types::string::Cid, pub rev: String, ///If active=false, this optional field indicates a possible reason for why the account is not active. If active=false and no status is supplied, then the host makes no claim for why the repository is no longer being hosted. - #[serde(skip_serializing_if = "Option::is_none")] - pub status: Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub status: core::option::Option, } pub type Repo = crate::types::Object; diff --git a/atrium-api/src/com/atproto/sync/subscribe_repos.rs b/atrium-api/src/com/atproto/sync/subscribe_repos.rs index d3476440..e037abbb 100644 --- a/atrium-api/src/com/atproto/sync/subscribe_repos.rs +++ b/atrium-api/src/com/atproto/sync/subscribe_repos.rs @@ -5,8 +5,8 @@ pub const NSID: &str = "com.atproto.sync.subscribeRepos"; #[serde(rename_all = "camelCase")] pub struct ParametersData { ///The last known event seq number to backfill from. - #[serde(skip_serializing_if = "Option::is_none")] - pub cursor: Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub cursor: core::option::Option, } pub type Parameters = crate::types::Object; #[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq)] @@ -44,8 +44,8 @@ pub struct AccountData { pub did: crate::types::string::Did, pub seq: i64, ///If active=false, this optional field indicates a reason for why the account is not active. - #[serde(skip_serializing_if = "Option::is_none")] - pub status: Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub status: core::option::Option, pub time: crate::types::string::Datetime, } pub type Account = crate::types::Object; @@ -61,8 +61,8 @@ pub struct CommitData { pub commit: crate::types::CidLink, pub ops: Vec, ///DEPRECATED -- unused. WARNING -- nullable and optional; stick with optional to ensure golang interoperability. - #[serde(skip_serializing_if = "Option::is_none")] - pub prev: Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub prev: core::option::Option, ///DEPRECATED -- unused pub rebase: bool, ///The repo this event comes from. @@ -72,8 +72,8 @@ pub struct CommitData { ///The stream sequence number of this message. pub seq: i64, ///The rev of the last emitted commit from this repo (if any). - #[serde(skip_serializing_if = "Option::is_none")] - pub since: Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub since: core::option::Option, ///Timestamp of when this message was originally broadcast. pub time: crate::types::string::Datetime, ///Indicates that this commit contained too many ops, or data size was too large. Consumers will need to make a separate request to get missing data. @@ -96,8 +96,8 @@ pub type Handle = crate::types::Object; pub struct IdentityData { pub did: crate::types::string::Did, ///The current handle for the account, or 'handle.invalid' if validation fails. This field is optional, might have been validated or passed-through from an upstream source. Semantics and behaviors for PDS vs Relay may evolve in the future; see atproto specs for more details. - #[serde(skip_serializing_if = "Option::is_none")] - pub handle: Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub handle: core::option::Option, pub seq: i64, pub time: crate::types::string::Datetime, } @@ -105,8 +105,8 @@ pub type Identity = crate::types::Object; #[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq)] #[serde(rename_all = "camelCase")] pub struct InfoData { - #[serde(skip_serializing_if = "Option::is_none")] - pub message: Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub message: core::option::Option, pub name: String, } pub type Info = crate::types::Object; @@ -115,8 +115,8 @@ pub type Info = crate::types::Object; #[serde(rename_all = "camelCase")] pub struct MigrateData { pub did: crate::types::string::Did, - #[serde(skip_serializing_if = "Option::is_none")] - pub migrate_to: Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub migrate_to: core::option::Option, pub seq: i64, pub time: crate::types::string::Datetime, } @@ -127,8 +127,8 @@ pub type Migrate = crate::types::Object; pub struct RepoOpData { pub action: String, ///For creates and updates, the new record CID. For deletions, null. - #[serde(skip_serializing_if = "Option::is_none")] - pub cid: Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub cid: core::option::Option, pub path: String, } pub type RepoOp = crate::types::Object; diff --git a/atrium-api/src/com/atproto/temp/check_signup_queue.rs b/atrium-api/src/com/atproto/temp/check_signup_queue.rs index 7e08c7df..a1cf71a3 100644 --- a/atrium-api/src/com/atproto/temp/check_signup_queue.rs +++ b/atrium-api/src/com/atproto/temp/check_signup_queue.rs @@ -5,10 +5,10 @@ pub const NSID: &str = "com.atproto.temp.checkSignupQueue"; #[serde(rename_all = "camelCase")] pub struct OutputData { pub activated: bool, - #[serde(skip_serializing_if = "Option::is_none")] - pub estimated_time_ms: Option, - #[serde(skip_serializing_if = "Option::is_none")] - pub place_in_queue: Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub estimated_time_ms: core::option::Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub place_in_queue: core::option::Option, } pub type Output = crate::types::Object; #[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq)] diff --git a/atrium-api/src/com/atproto/temp/fetch_labels.rs b/atrium-api/src/com/atproto/temp/fetch_labels.rs index fbb43784..c5c6d95c 100644 --- a/atrium-api/src/com/atproto/temp/fetch_labels.rs +++ b/atrium-api/src/com/atproto/temp/fetch_labels.rs @@ -4,10 +4,10 @@ pub const NSID: &str = "com.atproto.temp.fetchLabels"; #[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq)] #[serde(rename_all = "camelCase")] pub struct ParametersData { - #[serde(skip_serializing_if = "Option::is_none")] - pub limit: Option>, - #[serde(skip_serializing_if = "Option::is_none")] - pub since: Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub limit: core::option::Option>, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub since: core::option::Option, } pub type Parameters = crate::types::Object; #[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq)] diff --git a/atrium-api/src/tools/ozone.rs b/atrium-api/src/tools/ozone.rs index 9d865da8..6298390b 100644 --- a/atrium-api/src/tools/ozone.rs +++ b/atrium-api/src/tools/ozone.rs @@ -4,5 +4,6 @@ pub mod communication; pub mod moderation; pub mod server; pub mod set; +pub mod setting; pub mod signature; pub mod team; diff --git a/atrium-api/src/tools/ozone/communication/create_template.rs b/atrium-api/src/tools/ozone/communication/create_template.rs index 9cbe8db3..33c40dc1 100644 --- a/atrium-api/src/tools/ozone/communication/create_template.rs +++ b/atrium-api/src/tools/ozone/communication/create_template.rs @@ -7,11 +7,11 @@ pub struct InputData { ///Content of the template, markdown supported, can contain variable placeholders. pub content_markdown: String, ///DID of the user who is creating the template. - #[serde(skip_serializing_if = "Option::is_none")] - pub created_by: Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub created_by: core::option::Option, ///Message language. - #[serde(skip_serializing_if = "Option::is_none")] - pub lang: Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub lang: core::option::Option, ///Name of the template. pub name: String, ///Subject of the message, used in emails. diff --git a/atrium-api/src/tools/ozone/communication/defs.rs b/atrium-api/src/tools/ozone/communication/defs.rs index 262a12c0..c37b992c 100644 --- a/atrium-api/src/tools/ozone/communication/defs.rs +++ b/atrium-api/src/tools/ozone/communication/defs.rs @@ -9,15 +9,15 @@ pub struct TemplateViewData { pub disabled: bool, pub id: String, ///Message language. - #[serde(skip_serializing_if = "Option::is_none")] - pub lang: Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub lang: core::option::Option, ///DID of the user who last updated the template. pub last_updated_by: crate::types::string::Did, ///Name of the template. pub name: String, ///Content of the template, can contain markdown and variable placeholders. - #[serde(skip_serializing_if = "Option::is_none")] - pub subject: Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub subject: core::option::Option, pub updated_at: crate::types::string::Datetime, } pub type TemplateView = crate::types::Object; diff --git a/atrium-api/src/tools/ozone/communication/update_template.rs b/atrium-api/src/tools/ozone/communication/update_template.rs index db27d8a2..c4192b83 100644 --- a/atrium-api/src/tools/ozone/communication/update_template.rs +++ b/atrium-api/src/tools/ozone/communication/update_template.rs @@ -5,24 +5,24 @@ pub const NSID: &str = "tools.ozone.communication.updateTemplate"; #[serde(rename_all = "camelCase")] pub struct InputData { ///Content of the template, markdown supported, can contain variable placeholders. - #[serde(skip_serializing_if = "Option::is_none")] - pub content_markdown: Option, - #[serde(skip_serializing_if = "Option::is_none")] - pub disabled: Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub content_markdown: core::option::Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub disabled: core::option::Option, ///ID of the template to be updated. pub id: String, ///Message language. - #[serde(skip_serializing_if = "Option::is_none")] - pub lang: Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub lang: core::option::Option, ///Name of the template. - #[serde(skip_serializing_if = "Option::is_none")] - pub name: Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub name: core::option::Option, ///Subject of the message, used in emails. - #[serde(skip_serializing_if = "Option::is_none")] - pub subject: Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub subject: core::option::Option, ///DID of the user who is updating the template. - #[serde(skip_serializing_if = "Option::is_none")] - pub updated_by: Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub updated_by: core::option::Option, } pub type Input = crate::types::Object; pub type Output = crate::tools::ozone::communication::defs::TemplateView; diff --git a/atrium-api/src/tools/ozone/moderation/defs.rs b/atrium-api/src/tools/ozone/moderation/defs.rs index e286c32e..92923fbb 100644 --- a/atrium-api/src/tools/ozone/moderation/defs.rs +++ b/atrium-api/src/tools/ozone/moderation/defs.rs @@ -1,18 +1,62 @@ // @generated - This file is generated by atrium-codegen. DO NOT EDIT. //!Definitions for the `tools.ozone.moderation.defs` namespace. +///Logs account status related events on a repo subject. Normally captured by automod from the firehose and emitted to ozone for historical tracking. +#[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq)] +#[serde(rename_all = "camelCase")] +pub struct AccountEventData { + ///Indicates that the account has a repository which can be fetched from the host that emitted this event. + pub active: bool, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub comment: core::option::Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub status: core::option::Option, + pub timestamp: crate::types::string::Datetime, +} +pub type AccountEvent = crate::types::Object; +#[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq)] +#[serde(rename_all = "camelCase")] +pub struct AccountHostingData { + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub created_at: core::option::Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub deactivated_at: core::option::Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub deleted_at: core::option::Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub reactivated_at: core::option::Option, + pub status: String, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub updated_at: core::option::Option, +} +pub type AccountHosting = crate::types::Object; #[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq)] #[serde(rename_all = "camelCase")] pub struct BlobViewData { pub cid: crate::types::string::Cid, pub created_at: crate::types::string::Datetime, - #[serde(skip_serializing_if = "Option::is_none")] - pub details: Option>, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub details: core::option::Option>, pub mime_type: String, - #[serde(skip_serializing_if = "Option::is_none")] - pub moderation: Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub moderation: core::option::Option, pub size: i64, } pub type BlobView = crate::types::Object; +///Logs identity related events on a repo subject. Normally captured by automod from the firehose and emitted to ozone for historical tracking. +#[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq)] +#[serde(rename_all = "camelCase")] +pub struct IdentityEventData { + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub comment: core::option::Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub handle: core::option::Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub pds_host: core::option::Option, + pub timestamp: crate::types::string::Datetime, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub tombstone: core::option::Option, +} +pub type IdentityEvent = crate::types::Object; #[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq)] #[serde(rename_all = "camelCase")] pub struct ImageDetailsData { @@ -23,8 +67,8 @@ pub type ImageDetails = crate::types::Object; #[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq)] #[serde(rename_all = "camelCase")] pub struct ModEventAcknowledgeData { - #[serde(skip_serializing_if = "Option::is_none")] - pub comment: Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub comment: core::option::Option, } pub type ModEventAcknowledge = crate::types::Object; ///Add a comment to a subject @@ -33,16 +77,16 @@ pub type ModEventAcknowledge = crate::types::Object; pub struct ModEventCommentData { pub comment: String, ///Make the comment persistent on the subject - #[serde(skip_serializing_if = "Option::is_none")] - pub sticky: Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub sticky: core::option::Option, } pub type ModEventComment = crate::types::Object; ///Divert a record's blobs to a 3rd party service for further scanning/tagging #[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq)] #[serde(rename_all = "camelCase")] pub struct ModEventDivertData { - #[serde(skip_serializing_if = "Option::is_none")] - pub comment: Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub comment: core::option::Option, } pub type ModEventDivert = crate::types::Object; ///Keep a log of outgoing email to a user @@ -50,11 +94,11 @@ pub type ModEventDivert = crate::types::Object; #[serde(rename_all = "camelCase")] pub struct ModEventEmailData { ///Additional comment about the outgoing comm. - #[serde(skip_serializing_if = "Option::is_none")] - pub comment: Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub comment: core::option::Option, ///The content of the email sent to the user. - #[serde(skip_serializing_if = "Option::is_none")] - pub content: Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub content: core::option::Option, ///The subject line of the email sent to the user. pub subject_line: String, } @@ -62,16 +106,16 @@ pub type ModEventEmail = crate::types::Object; #[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq)] #[serde(rename_all = "camelCase")] pub struct ModEventEscalateData { - #[serde(skip_serializing_if = "Option::is_none")] - pub comment: Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub comment: core::option::Option, } pub type ModEventEscalate = crate::types::Object; ///Apply/Negate labels on a subject #[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq)] #[serde(rename_all = "camelCase")] pub struct ModEventLabelData { - #[serde(skip_serializing_if = "Option::is_none")] - pub comment: Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub comment: core::option::Option, pub create_label_vals: Vec, pub negate_label_vals: Vec, } @@ -80,8 +124,8 @@ pub type ModEventLabel = crate::types::Object; #[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq)] #[serde(rename_all = "camelCase")] pub struct ModEventMuteData { - #[serde(skip_serializing_if = "Option::is_none")] - pub comment: Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub comment: core::option::Option, ///Indicates how long the subject should remain muted. pub duration_in_hours: i64, } @@ -90,21 +134,22 @@ pub type ModEventMute = crate::types::Object; #[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq)] #[serde(rename_all = "camelCase")] pub struct ModEventMuteReporterData { - #[serde(skip_serializing_if = "Option::is_none")] - pub comment: Option, - ///Indicates how long the account should remain muted. - pub duration_in_hours: i64, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub comment: core::option::Option, + ///Indicates how long the account should remain muted. Falsy value here means a permanent mute. + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub duration_in_hours: core::option::Option, } pub type ModEventMuteReporter = crate::types::Object; ///Report a subject #[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq)] #[serde(rename_all = "camelCase")] pub struct ModEventReportData { - #[serde(skip_serializing_if = "Option::is_none")] - pub comment: Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub comment: core::option::Option, ///Set to true if the reporter was muted from reporting at the time of the event. These reports won't impact the reviewState of the subject. - #[serde(skip_serializing_if = "Option::is_none")] - pub is_reporter_muted: Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub is_reporter_muted: core::option::Option, pub report_type: crate::com::atproto::moderation::defs::ReasonType, } pub type ModEventReport = crate::types::Object; @@ -113,8 +158,8 @@ pub type ModEventReport = crate::types::Object; #[serde(rename_all = "camelCase")] pub struct ModEventResolveAppealData { ///Describe resolution. - #[serde(skip_serializing_if = "Option::is_none")] - pub comment: Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub comment: core::option::Option, } pub type ModEventResolveAppeal = crate::types::Object; ///Revert take down action on a subject @@ -122,8 +167,8 @@ pub type ModEventResolveAppeal = crate::types::Object #[serde(rename_all = "camelCase")] pub struct ModEventReverseTakedownData { ///Describe reasoning behind the reversal. - #[serde(skip_serializing_if = "Option::is_none")] - pub comment: Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub comment: core::option::Option, } pub type ModEventReverseTakedown = crate::types::Object; ///Add/Remove a tag on a subject @@ -133,8 +178,8 @@ pub struct ModEventTagData { ///Tags to be added to the subject. If already exists, won't be duplicated. pub add: Vec, ///Additional comment about added/removed tags. - #[serde(skip_serializing_if = "Option::is_none")] - pub comment: Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub comment: core::option::Option, ///Tags to be removed to the subject. Ignores a tag If it doesn't exist, won't be duplicated. pub remove: Vec, } @@ -144,13 +189,13 @@ pub type ModEventTag = crate::types::Object; #[serde(rename_all = "camelCase")] pub struct ModEventTakedownData { ///If true, all other reports on content authored by this account will be resolved (acknowledged). - #[serde(skip_serializing_if = "Option::is_none")] - pub acknowledge_account_subjects: Option, - #[serde(skip_serializing_if = "Option::is_none")] - pub comment: Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub acknowledge_account_subjects: core::option::Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub comment: core::option::Option, ///Indicates how long the takedown should be in effect before automatically expiring. - #[serde(skip_serializing_if = "Option::is_none")] - pub duration_in_hours: Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub duration_in_hours: core::option::Option, } pub type ModEventTakedown = crate::types::Object; ///Unmute action on a subject @@ -158,8 +203,8 @@ pub type ModEventTakedown = crate::types::Object; #[serde(rename_all = "camelCase")] pub struct ModEventUnmuteData { ///Describe reasoning behind the reversal. - #[serde(skip_serializing_if = "Option::is_none")] - pub comment: Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub comment: core::option::Option, } pub type ModEventUnmute = crate::types::Object; ///Unmute incoming reports from an account @@ -167,8 +212,8 @@ pub type ModEventUnmute = crate::types::Object; #[serde(rename_all = "camelCase")] pub struct ModEventUnmuteReporterData { ///Describe reasoning behind the reversal. - #[serde(skip_serializing_if = "Option::is_none")] - pub comment: Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub comment: core::option::Option, } pub type ModEventUnmuteReporter = crate::types::Object; #[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq)] @@ -176,14 +221,14 @@ pub type ModEventUnmuteReporter = crate::types::Object, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub creator_handle: core::option::Option, pub event: crate::types::Union, pub id: i64, pub subject: crate::types::Union, pub subject_blob_cids: Vec, - #[serde(skip_serializing_if = "Option::is_none")] - pub subject_handle: Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub subject_handle: core::option::Option, } pub type ModEventView = crate::types::Object; #[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq)] @@ -200,17 +245,41 @@ pub type ModEventViewDetail = crate::types::Object; #[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq)] #[serde(rename_all = "camelCase")] pub struct ModerationData { - #[serde(skip_serializing_if = "Option::is_none")] - pub subject_status: Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub subject_status: core::option::Option, } pub type Moderation = crate::types::Object; #[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq)] #[serde(rename_all = "camelCase")] pub struct ModerationDetailData { - #[serde(skip_serializing_if = "Option::is_none")] - pub subject_status: Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub subject_status: core::option::Option, } pub type ModerationDetail = crate::types::Object; +///Logs lifecycle event on a record subject. Normally captured by automod from the firehose and emitted to ozone for historical tracking. +#[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq)] +#[serde(rename_all = "camelCase")] +pub struct RecordEventData { + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub cid: core::option::Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub comment: core::option::Option, + pub op: String, + pub timestamp: crate::types::string::Datetime, +} +pub type RecordEvent = crate::types::Object; +#[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq)] +#[serde(rename_all = "camelCase")] +pub struct RecordHostingData { + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub created_at: core::option::Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub deleted_at: core::option::Option, + pub status: String, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub updated_at: core::option::Option, +} +pub type RecordHosting = crate::types::Object; #[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq)] #[serde(rename_all = "camelCase")] pub struct RecordViewData { @@ -229,8 +298,8 @@ pub struct RecordViewDetailData { pub blobs: Vec, pub cid: crate::types::string::Cid, pub indexed_at: crate::types::string::Datetime, - #[serde(skip_serializing_if = "Option::is_none")] - pub labels: Option>, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub labels: core::option::Option>, pub moderation: ModerationDetail, pub repo: RepoView, pub uri: String, @@ -246,47 +315,57 @@ pub type RecordViewNotFound = crate::types::Object; #[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq)] #[serde(rename_all = "camelCase")] pub struct RepoViewData { - #[serde(skip_serializing_if = "Option::is_none")] - pub deactivated_at: Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub deactivated_at: core::option::Option, pub did: crate::types::string::Did, - #[serde(skip_serializing_if = "Option::is_none")] - pub email: Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub email: core::option::Option, pub handle: crate::types::string::Handle, pub indexed_at: crate::types::string::Datetime, - #[serde(skip_serializing_if = "Option::is_none")] - pub invite_note: Option, - #[serde(skip_serializing_if = "Option::is_none")] - pub invited_by: Option, - #[serde(skip_serializing_if = "Option::is_none")] - pub invites_disabled: Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub invite_note: core::option::Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub invited_by: core::option::Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub invites_disabled: core::option::Option, pub moderation: Moderation, pub related_records: Vec, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub threat_signatures: core::option::Option< + Vec, + >, } pub type RepoView = crate::types::Object; #[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq)] #[serde(rename_all = "camelCase")] pub struct RepoViewDetailData { - #[serde(skip_serializing_if = "Option::is_none")] - pub deactivated_at: Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub deactivated_at: core::option::Option, pub did: crate::types::string::Did, - #[serde(skip_serializing_if = "Option::is_none")] - pub email: Option, - #[serde(skip_serializing_if = "Option::is_none")] - pub email_confirmed_at: Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub email: core::option::Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub email_confirmed_at: core::option::Option, pub handle: crate::types::string::Handle, pub indexed_at: crate::types::string::Datetime, - #[serde(skip_serializing_if = "Option::is_none")] - pub invite_note: Option, - #[serde(skip_serializing_if = "Option::is_none")] - pub invited_by: Option, - #[serde(skip_serializing_if = "Option::is_none")] - pub invites: Option>, - #[serde(skip_serializing_if = "Option::is_none")] - pub invites_disabled: Option, - #[serde(skip_serializing_if = "Option::is_none")] - pub labels: Option>, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub invite_note: core::option::Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub invited_by: core::option::Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub invites: core::option::Option< + Vec, + >, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub invites_disabled: core::option::Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub labels: core::option::Option>, pub moderation: ModerationDetail, pub related_records: Vec, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub threat_signatures: core::option::Option< + Vec, + >, } pub type RepoViewDetail = crate::types::Object; #[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq)] @@ -308,39 +387,41 @@ pub type SubjectReviewState = String; #[serde(rename_all = "camelCase")] pub struct SubjectStatusViewData { ///True indicates that the a previously taken moderator action was appealed against, by the author of the content. False indicates last appeal was resolved by moderators. - #[serde(skip_serializing_if = "Option::is_none")] - pub appealed: Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub appealed: core::option::Option, ///Sticky comment on the subject. - #[serde(skip_serializing_if = "Option::is_none")] - pub comment: Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub comment: core::option::Option, ///Timestamp referencing the first moderation status impacting event was emitted on the subject pub created_at: crate::types::string::Datetime, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub hosting: core::option::Option>, pub id: i64, ///Timestamp referencing when the author of the subject appealed a moderation action - #[serde(skip_serializing_if = "Option::is_none")] - pub last_appealed_at: Option, - #[serde(skip_serializing_if = "Option::is_none")] - pub last_reported_at: Option, - #[serde(skip_serializing_if = "Option::is_none")] - pub last_reviewed_at: Option, - #[serde(skip_serializing_if = "Option::is_none")] - pub last_reviewed_by: Option, - #[serde(skip_serializing_if = "Option::is_none")] - pub mute_reporting_until: Option, - #[serde(skip_serializing_if = "Option::is_none")] - pub mute_until: Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub last_appealed_at: core::option::Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub last_reported_at: core::option::Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub last_reviewed_at: core::option::Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub last_reviewed_by: core::option::Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub mute_reporting_until: core::option::Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub mute_until: core::option::Option, pub review_state: SubjectReviewState, pub subject: crate::types::Union, - #[serde(skip_serializing_if = "Option::is_none")] - pub subject_blob_cids: Option>, - #[serde(skip_serializing_if = "Option::is_none")] - pub subject_repo_handle: Option, - #[serde(skip_serializing_if = "Option::is_none")] - pub suspend_until: Option, - #[serde(skip_serializing_if = "Option::is_none")] - pub tags: Option>, - #[serde(skip_serializing_if = "Option::is_none")] - pub takendown: Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub subject_blob_cids: core::option::Option>, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub subject_repo_handle: core::option::Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub suspend_until: core::option::Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub tags: core::option::Option>, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub takendown: core::option::Option, ///Timestamp referencing when the last update was made to the moderation status of the subject pub updated_at: crate::types::string::Datetime, } @@ -394,6 +475,12 @@ pub enum ModEventViewDetailEventRefs { ModEventDivert(Box), #[serde(rename = "tools.ozone.moderation.defs#modEventTag")] ModEventTag(Box), + #[serde(rename = "tools.ozone.moderation.defs#accountEvent")] + AccountEvent(Box), + #[serde(rename = "tools.ozone.moderation.defs#identityEvent")] + IdentityEvent(Box), + #[serde(rename = "tools.ozone.moderation.defs#recordEvent")] + RecordEvent(Box), } #[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq)] #[serde(tag = "$type")] @@ -440,6 +527,12 @@ pub enum ModEventViewEventRefs { ModEventDivert(Box), #[serde(rename = "tools.ozone.moderation.defs#modEventTag")] ModEventTag(Box), + #[serde(rename = "tools.ozone.moderation.defs#accountEvent")] + AccountEvent(Box), + #[serde(rename = "tools.ozone.moderation.defs#identityEvent")] + IdentityEvent(Box), + #[serde(rename = "tools.ozone.moderation.defs#recordEvent")] + RecordEvent(Box), } #[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq)] #[serde(tag = "$type")] @@ -453,6 +546,14 @@ pub enum ModEventViewSubjectRefs { } #[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq)] #[serde(tag = "$type")] +pub enum SubjectStatusViewHostingRefs { + #[serde(rename = "tools.ozone.moderation.defs#accountHosting")] + AccountHosting(Box), + #[serde(rename = "tools.ozone.moderation.defs#recordHosting")] + RecordHosting(Box), +} +#[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq)] +#[serde(tag = "$type")] pub enum SubjectStatusViewSubjectRefs { #[serde(rename = "com.atproto.admin.defs#repoRef")] ComAtprotoAdminDefsRepoRef(Box), diff --git a/atrium-api/src/tools/ozone/moderation/emit_event.rs b/atrium-api/src/tools/ozone/moderation/emit_event.rs index 82fc95d3..dad963ee 100644 --- a/atrium-api/src/tools/ozone/moderation/emit_event.rs +++ b/atrium-api/src/tools/ozone/moderation/emit_event.rs @@ -7,8 +7,8 @@ pub struct InputData { pub created_by: crate::types::string::Did, pub event: crate::types::Union, pub subject: crate::types::Union, - #[serde(skip_serializing_if = "Option::is_none")] - pub subject_blob_cids: Option>, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub subject_blob_cids: core::option::Option>, } pub type Input = crate::types::Object; pub type Output = crate::tools::ozone::moderation::defs::ModEventView; @@ -89,6 +89,18 @@ pub enum InputEventRefs { ToolsOzoneModerationDefsModEventTag( Box, ), + #[serde(rename = "tools.ozone.moderation.defs#accountEvent")] + ToolsOzoneModerationDefsAccountEvent( + Box, + ), + #[serde(rename = "tools.ozone.moderation.defs#identityEvent")] + ToolsOzoneModerationDefsIdentityEvent( + Box, + ), + #[serde(rename = "tools.ozone.moderation.defs#recordEvent")] + ToolsOzoneModerationDefsRecordEvent( + Box, + ), } #[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq)] #[serde(tag = "$type")] diff --git a/atrium-api/src/tools/ozone/moderation/get_record.rs b/atrium-api/src/tools/ozone/moderation/get_record.rs index 281ea473..d1af25c8 100644 --- a/atrium-api/src/tools/ozone/moderation/get_record.rs +++ b/atrium-api/src/tools/ozone/moderation/get_record.rs @@ -4,8 +4,8 @@ pub const NSID: &str = "tools.ozone.moderation.getRecord"; #[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq)] #[serde(rename_all = "camelCase")] pub struct ParametersData { - #[serde(skip_serializing_if = "Option::is_none")] - pub cid: Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub cid: core::option::Option, pub uri: String, } pub type Parameters = crate::types::Object; diff --git a/atrium-api/src/tools/ozone/moderation/query_events.rs b/atrium-api/src/tools/ozone/moderation/query_events.rs index bbb691f4..e66fa1c0 100644 --- a/atrium-api/src/tools/ozone/moderation/query_events.rs +++ b/atrium-api/src/tools/ozone/moderation/query_events.rs @@ -5,55 +5,61 @@ pub const NSID: &str = "tools.ozone.moderation.queryEvents"; #[serde(rename_all = "camelCase")] pub struct ParametersData { ///If specified, only events where all of these labels were added are returned - #[serde(skip_serializing_if = "Option::is_none")] - pub added_labels: Option>, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub added_labels: core::option::Option>, ///If specified, only events where all of these tags were added are returned - #[serde(skip_serializing_if = "Option::is_none")] - pub added_tags: Option>, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub added_tags: core::option::Option>, + ///If specified, only events where the subject belongs to the given collections will be returned. When subjectType is set to 'account', this will be ignored. + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub collections: core::option::Option>, ///If specified, only events with comments containing the keyword are returned - #[serde(skip_serializing_if = "Option::is_none")] - pub comment: Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub comment: core::option::Option, ///Retrieve events created after a given timestamp - #[serde(skip_serializing_if = "Option::is_none")] - pub created_after: Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub created_after: core::option::Option, ///Retrieve events created before a given timestamp - #[serde(skip_serializing_if = "Option::is_none")] - pub created_before: Option, - #[serde(skip_serializing_if = "Option::is_none")] - pub created_by: Option, - #[serde(skip_serializing_if = "Option::is_none")] - pub cursor: Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub created_before: core::option::Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub created_by: core::option::Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub cursor: core::option::Option, ///If true, only events with comments are returned - #[serde(skip_serializing_if = "Option::is_none")] - pub has_comment: Option, - ///If true, events on all record types (posts, lists, profile etc.) owned by the did are returned - #[serde(skip_serializing_if = "Option::is_none")] - pub include_all_user_records: Option, - #[serde(skip_serializing_if = "Option::is_none")] - pub limit: Option>, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub has_comment: core::option::Option, + ///If true, events on all record types (posts, lists, profile etc.) or records from given 'collections' param, owned by the did are returned. + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub include_all_user_records: core::option::Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub limit: core::option::Option>, ///If specified, only events where all of these labels were removed are returned - #[serde(skip_serializing_if = "Option::is_none")] - pub removed_labels: Option>, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub removed_labels: core::option::Option>, ///If specified, only events where all of these tags were removed are returned - #[serde(skip_serializing_if = "Option::is_none")] - pub removed_tags: Option>, - #[serde(skip_serializing_if = "Option::is_none")] - pub report_types: Option>, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub removed_tags: core::option::Option>, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub report_types: core::option::Option>, ///Sort direction for the events. Defaults to descending order of created at timestamp. - #[serde(skip_serializing_if = "Option::is_none")] - pub sort_direction: Option, - #[serde(skip_serializing_if = "Option::is_none")] - pub subject: Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub sort_direction: core::option::Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub subject: core::option::Option, + ///If specified, only events where the subject is of the given type (account or record) will be returned. When this is set to 'account' the 'collections' parameter will be ignored. When includeAllUserRecords or subject is set, this will be ignored. + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub subject_type: core::option::Option, ///The types of events (fully qualified string in the format of tools.ozone.moderation.defs#modEvent) to filter by. If not specified, all events are returned. - #[serde(skip_serializing_if = "Option::is_none")] - pub types: Option>, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub types: core::option::Option>, } pub type Parameters = crate::types::Object; #[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq)] #[serde(rename_all = "camelCase")] pub struct OutputData { - #[serde(skip_serializing_if = "Option::is_none")] - pub cursor: Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub cursor: core::option::Option, pub events: Vec, } pub type Output = crate::types::Object; diff --git a/atrium-api/src/tools/ozone/moderation/query_statuses.rs b/atrium-api/src/tools/ozone/moderation/query_statuses.rs index 6bd10a50..b5a32be4 100644 --- a/atrium-api/src/tools/ozone/moderation/query_statuses.rs +++ b/atrium-api/src/tools/ozone/moderation/query_statuses.rs @@ -5,65 +5,86 @@ pub const NSID: &str = "tools.ozone.moderation.queryStatuses"; #[serde(rename_all = "camelCase")] pub struct ParametersData { ///Get subjects in unresolved appealed status - #[serde(skip_serializing_if = "Option::is_none")] - pub appealed: Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub appealed: core::option::Option, + ///If specified, subjects belonging to the given collections will be returned. When subjectType is set to 'account', this will be ignored. + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub collections: core::option::Option>, ///Search subjects by keyword from comments - #[serde(skip_serializing_if = "Option::is_none")] - pub comment: Option, - #[serde(skip_serializing_if = "Option::is_none")] - pub cursor: Option, - #[serde(skip_serializing_if = "Option::is_none")] - pub exclude_tags: Option>, - #[serde(skip_serializing_if = "Option::is_none")] - pub ignore_subjects: Option>, - ///All subjects belonging to the account specified in the 'subject' param will be returned. - #[serde(skip_serializing_if = "Option::is_none")] - pub include_all_user_records: Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub comment: core::option::Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub cursor: core::option::Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub exclude_tags: core::option::Option>, + ///Search subjects where the associated record/account was deleted after a given timestamp + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub hosting_deleted_after: core::option::Option, + ///Search subjects where the associated record/account was deleted before a given timestamp + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub hosting_deleted_before: core::option::Option, + ///Search subjects by the status of the associated record/account + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub hosting_statuses: core::option::Option>, + ///Search subjects where the associated record/account was updated after a given timestamp + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub hosting_updated_after: core::option::Option, + ///Search subjects where the associated record/account was updated before a given timestamp + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub hosting_updated_before: core::option::Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub ignore_subjects: core::option::Option>, + ///All subjects, or subjects from given 'collections' param, belonging to the account specified in the 'subject' param will be returned. + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub include_all_user_records: core::option::Option, ///By default, we don't include muted subjects in the results. Set this to true to include them. - #[serde(skip_serializing_if = "Option::is_none")] - pub include_muted: Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub include_muted: core::option::Option, ///Get all subject statuses that were reviewed by a specific moderator - #[serde(skip_serializing_if = "Option::is_none")] - pub last_reviewed_by: Option, - #[serde(skip_serializing_if = "Option::is_none")] - pub limit: Option>, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub last_reviewed_by: core::option::Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub limit: core::option::Option>, ///When set to true, only muted subjects and reporters will be returned. - #[serde(skip_serializing_if = "Option::is_none")] - pub only_muted: Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub only_muted: core::option::Option, ///Search subjects reported after a given timestamp - #[serde(skip_serializing_if = "Option::is_none")] - pub reported_after: Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub reported_after: core::option::Option, ///Search subjects reported before a given timestamp - #[serde(skip_serializing_if = "Option::is_none")] - pub reported_before: Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub reported_before: core::option::Option, ///Specify when fetching subjects in a certain state - #[serde(skip_serializing_if = "Option::is_none")] - pub review_state: Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub review_state: core::option::Option, ///Search subjects reviewed after a given timestamp - #[serde(skip_serializing_if = "Option::is_none")] - pub reviewed_after: Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub reviewed_after: core::option::Option, ///Search subjects reviewed before a given timestamp - #[serde(skip_serializing_if = "Option::is_none")] - pub reviewed_before: Option, - #[serde(skip_serializing_if = "Option::is_none")] - pub sort_direction: Option, - #[serde(skip_serializing_if = "Option::is_none")] - pub sort_field: Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub reviewed_before: core::option::Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub sort_direction: core::option::Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub sort_field: core::option::Option, ///The subject to get the status for. - #[serde(skip_serializing_if = "Option::is_none")] - pub subject: Option, - #[serde(skip_serializing_if = "Option::is_none")] - pub tags: Option>, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub subject: core::option::Option, + ///If specified, subjects of the given type (account or record) will be returned. When this is set to 'account' the 'collections' parameter will be ignored. When includeAllUserRecords or subject is set, this will be ignored. + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub subject_type: core::option::Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub tags: core::option::Option>, ///Get subjects that were taken down - #[serde(skip_serializing_if = "Option::is_none")] - pub takendown: Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub takendown: core::option::Option, } pub type Parameters = crate::types::Object; #[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq)] #[serde(rename_all = "camelCase")] pub struct OutputData { - #[serde(skip_serializing_if = "Option::is_none")] - pub cursor: Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub cursor: core::option::Option, pub subject_statuses: Vec, } pub type Output = crate::types::Object; diff --git a/atrium-api/src/tools/ozone/moderation/search_repos.rs b/atrium-api/src/tools/ozone/moderation/search_repos.rs index f793ee46..bb748d76 100644 --- a/atrium-api/src/tools/ozone/moderation/search_repos.rs +++ b/atrium-api/src/tools/ozone/moderation/search_repos.rs @@ -4,22 +4,22 @@ pub const NSID: &str = "tools.ozone.moderation.searchRepos"; #[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq)] #[serde(rename_all = "camelCase")] pub struct ParametersData { - #[serde(skip_serializing_if = "Option::is_none")] - pub cursor: Option, - #[serde(skip_serializing_if = "Option::is_none")] - pub limit: Option>, - #[serde(skip_serializing_if = "Option::is_none")] - pub q: Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub cursor: core::option::Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub limit: core::option::Option>, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub q: core::option::Option, ///DEPRECATED: use 'q' instead - #[serde(skip_serializing_if = "Option::is_none")] - pub term: Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub term: core::option::Option, } pub type Parameters = crate::types::Object; #[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq)] #[serde(rename_all = "camelCase")] pub struct OutputData { - #[serde(skip_serializing_if = "Option::is_none")] - pub cursor: Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub cursor: core::option::Option, pub repos: Vec, } pub type Output = crate::types::Object; diff --git a/atrium-api/src/tools/ozone/server/get_config.rs b/atrium-api/src/tools/ozone/server/get_config.rs index c4ee5242..f727cf5e 100644 --- a/atrium-api/src/tools/ozone/server/get_config.rs +++ b/atrium-api/src/tools/ozone/server/get_config.rs @@ -4,16 +4,16 @@ pub const NSID: &str = "tools.ozone.server.getConfig"; #[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq)] #[serde(rename_all = "camelCase")] pub struct OutputData { - #[serde(skip_serializing_if = "Option::is_none")] - pub appview: Option, - #[serde(skip_serializing_if = "Option::is_none")] - pub blob_divert: Option, - #[serde(skip_serializing_if = "Option::is_none")] - pub chat: Option, - #[serde(skip_serializing_if = "Option::is_none")] - pub pds: Option, - #[serde(skip_serializing_if = "Option::is_none")] - pub viewer: Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub appview: core::option::Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub blob_divert: core::option::Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub chat: core::option::Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub pds: core::option::Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub viewer: core::option::Option, } pub type Output = crate::types::Object; #[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq)] @@ -27,14 +27,14 @@ impl std::fmt::Display for Error { #[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq)] #[serde(rename_all = "camelCase")] pub struct ServiceConfigData { - #[serde(skip_serializing_if = "Option::is_none")] - pub url: Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub url: core::option::Option, } pub type ServiceConfig = crate::types::Object; #[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq)] #[serde(rename_all = "camelCase")] pub struct ViewerConfigData { - #[serde(skip_serializing_if = "Option::is_none")] - pub role: Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub role: core::option::Option, } pub type ViewerConfig = crate::types::Object; diff --git a/atrium-api/src/tools/ozone/set/defs.rs b/atrium-api/src/tools/ozone/set/defs.rs index 17b604b6..b16df0b2 100644 --- a/atrium-api/src/tools/ozone/set/defs.rs +++ b/atrium-api/src/tools/ozone/set/defs.rs @@ -3,8 +3,8 @@ #[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq)] #[serde(rename_all = "camelCase")] pub struct SetData { - #[serde(skip_serializing_if = "Option::is_none")] - pub description: Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub description: core::option::Option, pub name: String, } pub type Set = crate::types::Object; @@ -12,8 +12,8 @@ pub type Set = crate::types::Object; #[serde(rename_all = "camelCase")] pub struct SetViewData { pub created_at: crate::types::string::Datetime, - #[serde(skip_serializing_if = "Option::is_none")] - pub description: Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub description: core::option::Option, pub name: String, pub set_size: i64, pub updated_at: crate::types::string::Datetime, diff --git a/atrium-api/src/tools/ozone/set/get_values.rs b/atrium-api/src/tools/ozone/set/get_values.rs index 996c2237..c5569986 100644 --- a/atrium-api/src/tools/ozone/set/get_values.rs +++ b/atrium-api/src/tools/ozone/set/get_values.rs @@ -4,18 +4,18 @@ pub const NSID: &str = "tools.ozone.set.getValues"; #[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq)] #[serde(rename_all = "camelCase")] pub struct ParametersData { - #[serde(skip_serializing_if = "Option::is_none")] - pub cursor: Option, - #[serde(skip_serializing_if = "Option::is_none")] - pub limit: Option>, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub cursor: core::option::Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub limit: core::option::Option>, pub name: String, } pub type Parameters = crate::types::Object; #[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq)] #[serde(rename_all = "camelCase")] pub struct OutputData { - #[serde(skip_serializing_if = "Option::is_none")] - pub cursor: Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub cursor: core::option::Option, pub set: crate::tools::ozone::set::defs::SetView, pub values: Vec, } diff --git a/atrium-api/src/tools/ozone/set/query_sets.rs b/atrium-api/src/tools/ozone/set/query_sets.rs index e0d1b485..1489e606 100644 --- a/atrium-api/src/tools/ozone/set/query_sets.rs +++ b/atrium-api/src/tools/ozone/set/query_sets.rs @@ -4,24 +4,24 @@ pub const NSID: &str = "tools.ozone.set.querySets"; #[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq)] #[serde(rename_all = "camelCase")] pub struct ParametersData { - #[serde(skip_serializing_if = "Option::is_none")] - pub cursor: Option, - #[serde(skip_serializing_if = "Option::is_none")] - pub limit: Option>, - #[serde(skip_serializing_if = "Option::is_none")] - pub name_prefix: Option, - #[serde(skip_serializing_if = "Option::is_none")] - pub sort_by: Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub cursor: core::option::Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub limit: core::option::Option>, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub name_prefix: core::option::Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub sort_by: core::option::Option, ///Defaults to ascending order of name field. - #[serde(skip_serializing_if = "Option::is_none")] - pub sort_direction: Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub sort_direction: core::option::Option, } pub type Parameters = crate::types::Object; #[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq)] #[serde(rename_all = "camelCase")] pub struct OutputData { - #[serde(skip_serializing_if = "Option::is_none")] - pub cursor: Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub cursor: core::option::Option, pub sets: Vec, } pub type Output = crate::types::Object; diff --git a/atrium-api/src/tools/ozone/setting.rs b/atrium-api/src/tools/ozone/setting.rs new file mode 100644 index 00000000..2f17aa5f --- /dev/null +++ b/atrium-api/src/tools/ozone/setting.rs @@ -0,0 +1,6 @@ +// @generated - This file is generated by atrium-codegen. DO NOT EDIT. +//!Definitions for the `tools.ozone.setting` namespace. +pub mod defs; +pub mod list_options; +pub mod remove_options; +pub mod upsert_option; diff --git a/atrium-api/src/tools/ozone/setting/defs.rs b/atrium-api/src/tools/ozone/setting/defs.rs new file mode 100644 index 00000000..0b75c6ee --- /dev/null +++ b/atrium-api/src/tools/ozone/setting/defs.rs @@ -0,0 +1,21 @@ +// @generated - This file is generated by atrium-codegen. DO NOT EDIT. +//!Definitions for the `tools.ozone.setting.defs` namespace. +#[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq)] +#[serde(rename_all = "camelCase")] +pub struct OptionData { + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub created_at: core::option::Option, + pub created_by: crate::types::string::Did, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub description: core::option::Option, + pub did: crate::types::string::Did, + pub key: crate::types::string::Nsid, + pub last_updated_by: crate::types::string::Did, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub manager_role: core::option::Option, + pub scope: String, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub updated_at: core::option::Option, + pub value: crate::types::Unknown, +} +pub type Option = crate::types::Object; diff --git a/atrium-api/src/tools/ozone/setting/list_options.rs b/atrium-api/src/tools/ozone/setting/list_options.rs new file mode 100644 index 00000000..363dfd37 --- /dev/null +++ b/atrium-api/src/tools/ozone/setting/list_options.rs @@ -0,0 +1,36 @@ +// @generated - This file is generated by atrium-codegen. DO NOT EDIT. +//!Definitions for the `tools.ozone.setting.listOptions` namespace. +pub const NSID: &str = "tools.ozone.setting.listOptions"; +#[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq)] +#[serde(rename_all = "camelCase")] +pub struct ParametersData { + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub cursor: core::option::Option, + ///Filter for only the specified keys. Ignored if prefix is provided + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub keys: core::option::Option>, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub limit: core::option::Option>, + ///Filter keys by prefix + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub prefix: core::option::Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub scope: core::option::Option, +} +pub type Parameters = crate::types::Object; +#[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq)] +#[serde(rename_all = "camelCase")] +pub struct OutputData { + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub cursor: core::option::Option, + pub options: Vec, +} +pub type Output = crate::types::Object; +#[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq)] +#[serde(tag = "error", content = "message")] +pub enum Error {} +impl std::fmt::Display for Error { + fn fmt(&self, _f: &mut std::fmt::Formatter) -> std::fmt::Result { + Ok(()) + } +} diff --git a/atrium-api/src/tools/ozone/setting/remove_options.rs b/atrium-api/src/tools/ozone/setting/remove_options.rs new file mode 100644 index 00000000..580af16a --- /dev/null +++ b/atrium-api/src/tools/ozone/setting/remove_options.rs @@ -0,0 +1,22 @@ +// @generated - This file is generated by atrium-codegen. DO NOT EDIT. +//!Definitions for the `tools.ozone.setting.removeOptions` namespace. +pub const NSID: &str = "tools.ozone.setting.removeOptions"; +#[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq)] +#[serde(rename_all = "camelCase")] +pub struct InputData { + pub keys: Vec, + pub scope: String, +} +pub type Input = crate::types::Object; +#[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq)] +#[serde(rename_all = "camelCase")] +pub struct OutputData {} +pub type Output = crate::types::Object; +#[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq)] +#[serde(tag = "error", content = "message")] +pub enum Error {} +impl std::fmt::Display for Error { + fn fmt(&self, _f: &mut std::fmt::Formatter) -> std::fmt::Result { + Ok(()) + } +} diff --git a/atrium-api/src/tools/ozone/setting/upsert_option.rs b/atrium-api/src/tools/ozone/setting/upsert_option.rs new file mode 100644 index 00000000..4ed650a8 --- /dev/null +++ b/atrium-api/src/tools/ozone/setting/upsert_option.rs @@ -0,0 +1,29 @@ +// @generated - This file is generated by atrium-codegen. DO NOT EDIT. +//!Definitions for the `tools.ozone.setting.upsertOption` namespace. +pub const NSID: &str = "tools.ozone.setting.upsertOption"; +#[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq)] +#[serde(rename_all = "camelCase")] +pub struct InputData { + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub description: core::option::Option, + pub key: crate::types::string::Nsid, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub manager_role: core::option::Option, + pub scope: String, + pub value: crate::types::Unknown, +} +pub type Input = crate::types::Object; +#[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq)] +#[serde(rename_all = "camelCase")] +pub struct OutputData { + pub option: crate::tools::ozone::setting::defs::Option, +} +pub type Output = crate::types::Object; +#[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq)] +#[serde(tag = "error", content = "message")] +pub enum Error {} +impl std::fmt::Display for Error { + fn fmt(&self, _f: &mut std::fmt::Formatter) -> std::fmt::Result { + Ok(()) + } +} diff --git a/atrium-api/src/tools/ozone/signature/find_related_accounts.rs b/atrium-api/src/tools/ozone/signature/find_related_accounts.rs index ba06ecad..fbcc8071 100644 --- a/atrium-api/src/tools/ozone/signature/find_related_accounts.rs +++ b/atrium-api/src/tools/ozone/signature/find_related_accounts.rs @@ -4,19 +4,19 @@ pub const NSID: &str = "tools.ozone.signature.findRelatedAccounts"; #[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq)] #[serde(rename_all = "camelCase")] pub struct ParametersData { - #[serde(skip_serializing_if = "Option::is_none")] - pub cursor: Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub cursor: core::option::Option, pub did: crate::types::string::Did, - #[serde(skip_serializing_if = "Option::is_none")] - pub limit: Option>, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub limit: core::option::Option>, } pub type Parameters = crate::types::Object; #[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq)] #[serde(rename_all = "camelCase")] pub struct OutputData { pub accounts: Vec, - #[serde(skip_serializing_if = "Option::is_none")] - pub cursor: Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub cursor: core::option::Option, } pub type Output = crate::types::Object; #[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq)] @@ -31,7 +31,9 @@ impl std::fmt::Display for Error { #[serde(rename_all = "camelCase")] pub struct RelatedAccountData { pub account: crate::com::atproto::admin::defs::AccountView, - #[serde(skip_serializing_if = "Option::is_none")] - pub similarities: Option>, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub similarities: core::option::Option< + Vec, + >, } pub type RelatedAccount = crate::types::Object; diff --git a/atrium-api/src/tools/ozone/signature/search_accounts.rs b/atrium-api/src/tools/ozone/signature/search_accounts.rs index cae665f6..da605f3a 100644 --- a/atrium-api/src/tools/ozone/signature/search_accounts.rs +++ b/atrium-api/src/tools/ozone/signature/search_accounts.rs @@ -4,10 +4,10 @@ pub const NSID: &str = "tools.ozone.signature.searchAccounts"; #[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq)] #[serde(rename_all = "camelCase")] pub struct ParametersData { - #[serde(skip_serializing_if = "Option::is_none")] - pub cursor: Option, - #[serde(skip_serializing_if = "Option::is_none")] - pub limit: Option>, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub cursor: core::option::Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub limit: core::option::Option>, pub values: Vec, } pub type Parameters = crate::types::Object; @@ -15,8 +15,8 @@ pub type Parameters = crate::types::Object; #[serde(rename_all = "camelCase")] pub struct OutputData { pub accounts: Vec, - #[serde(skip_serializing_if = "Option::is_none")] - pub cursor: Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub cursor: core::option::Option, } pub type Output = crate::types::Object; #[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq)] diff --git a/atrium-api/src/tools/ozone/team/defs.rs b/atrium-api/src/tools/ozone/team/defs.rs index f4f98dfc..4c0a2560 100644 --- a/atrium-api/src/tools/ozone/team/defs.rs +++ b/atrium-api/src/tools/ozone/team/defs.rs @@ -3,18 +3,20 @@ #[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq)] #[serde(rename_all = "camelCase")] pub struct MemberData { - #[serde(skip_serializing_if = "Option::is_none")] - pub created_at: Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub created_at: core::option::Option, pub did: crate::types::string::Did, - #[serde(skip_serializing_if = "Option::is_none")] - pub disabled: Option, - #[serde(skip_serializing_if = "Option::is_none")] - pub last_updated_by: Option, - #[serde(skip_serializing_if = "Option::is_none")] - pub profile: Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub disabled: core::option::Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub last_updated_by: core::option::Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub profile: core::option::Option< + crate::app::bsky::actor::defs::ProfileViewDetailed, + >, pub role: String, - #[serde(skip_serializing_if = "Option::is_none")] - pub updated_at: Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub updated_at: core::option::Option, } pub type Member = crate::types::Object; ///Admin role. Highest level of access, can perform all actions. diff --git a/atrium-api/src/tools/ozone/team/list_members.rs b/atrium-api/src/tools/ozone/team/list_members.rs index 88ad7501..ff944626 100644 --- a/atrium-api/src/tools/ozone/team/list_members.rs +++ b/atrium-api/src/tools/ozone/team/list_members.rs @@ -4,17 +4,17 @@ pub const NSID: &str = "tools.ozone.team.listMembers"; #[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq)] #[serde(rename_all = "camelCase")] pub struct ParametersData { - #[serde(skip_serializing_if = "Option::is_none")] - pub cursor: Option, - #[serde(skip_serializing_if = "Option::is_none")] - pub limit: Option>, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub cursor: core::option::Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub limit: core::option::Option>, } pub type Parameters = crate::types::Object; #[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq)] #[serde(rename_all = "camelCase")] pub struct OutputData { - #[serde(skip_serializing_if = "Option::is_none")] - pub cursor: Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub cursor: core::option::Option, pub members: Vec, } pub type Output = crate::types::Object; diff --git a/atrium-api/src/tools/ozone/team/update_member.rs b/atrium-api/src/tools/ozone/team/update_member.rs index 906b9a83..0903b64e 100644 --- a/atrium-api/src/tools/ozone/team/update_member.rs +++ b/atrium-api/src/tools/ozone/team/update_member.rs @@ -5,10 +5,10 @@ pub const NSID: &str = "tools.ozone.team.updateMember"; #[serde(rename_all = "camelCase")] pub struct InputData { pub did: crate::types::string::Did, - #[serde(skip_serializing_if = "Option::is_none")] - pub disabled: Option, - #[serde(skip_serializing_if = "Option::is_none")] - pub role: Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub disabled: core::option::Option, + #[serde(skip_serializing_if = "core::option::Option::is_none")] + pub role: core::option::Option, } pub type Input = crate::types::Object; pub type Output = crate::tools::ozone::team::defs::Member; diff --git a/lexicon/atrium-codegen/src/token_stream.rs b/lexicon/atrium-codegen/src/token_stream.rs index a0277b22..2324a7b4 100644 --- a/lexicon/atrium-codegen/src/token_stream.rs +++ b/lexicon/atrium-codegen/src/token_stream.rs @@ -135,9 +135,7 @@ fn xrpc_body(body: &LexXrpcBody, name: &str) -> Result { fn xrpc_errors(errors: &Option>) -> Result { let derives = derives()?; let errors = errors.as_ref().map_or(Vec::new(), |e| { - e.iter() - .map(|error| (error.name.clone(), error.description.clone())) - .collect() + e.iter().map(|error| (error.name.clone(), error.description.clone())).collect() }); let enum_variants: Vec = errors .iter() @@ -195,11 +193,8 @@ fn lex_query(query: &LexXrpcQuery) -> Result { } else { quote!() }; - let outputs = if let Some(body) = &query.output { - xrpc_body(body, "Output")? - } else { - quote!() - }; + let outputs = + if let Some(body) = &query.output { xrpc_body(body, "Output")? } else { quote!() }; let errors = xrpc_errors(&query.errors)?; Ok(quote! { #params @@ -209,16 +204,10 @@ fn lex_query(query: &LexXrpcQuery) -> Result { } fn lex_procedure(procedure: &LexXrpcProcedure) -> Result { - let inputs = if let Some(body) = &procedure.input { - xrpc_body(body, "Input")? - } else { - quote!() - }; - let outputs = if let Some(body) = &procedure.output { - xrpc_body(body, "Output")? - } else { - quote!() - }; + let inputs = + if let Some(body) = &procedure.input { xrpc_body(body, "Input")? } else { quote!() }; + let outputs = + if let Some(body) = &procedure.output { xrpc_body(body, "Output")? } else { quote!() }; let errors = xrpc_errors(&procedure.errors)?; Ok(quote! { #inputs @@ -306,12 +295,7 @@ fn lex_object_property( LexObjectProperty::Ref(r#ref) => ref_type(r#ref)?, LexObjectProperty::Union(union) => union_type( union, - format!( - "{}{}Refs", - object_name.to_pascal_case(), - name.to_pascal_case() - ) - .as_str(), + format!("{}{}Refs", object_name.to_pascal_case(), name.to_pascal_case()).as_str(), )?, LexObjectProperty::Bytes(bytes) => bytes_type(bytes)?, LexObjectProperty::CidLink(cid_link) => cid_link_type(cid_link)?, @@ -324,19 +308,11 @@ fn lex_object_property( }; let field_name = format_ident!( "{}", - if name == "ref" || name == "type" { - format!("r#{name}") - } else { - name.to_snake_case() - } + if name == "ref" || name == "type" { format!("r#{name}") } else { name.to_snake_case() } ); let mut attributes = match property { LexObjectProperty::Bytes(_) => { - let default = if is_required { - quote!() - } else { - quote!(#[serde(default)]) - }; + let default = if is_required { quote!() } else { quote!(#[serde(default)]) }; quote! { #default #[serde(with = "serde_bytes")] @@ -345,10 +321,10 @@ fn lex_object_property( _ => quote!(), }; if !is_required { - field_type = quote!(Option<#field_type>); + field_type = quote!(core::option::Option<#field_type>); attributes = quote! { #attributes - #[serde(skip_serializing_if = "Option::is_none")] + #[serde(skip_serializing_if = "core::option::Option::is_none")] }; } Ok(quote! { @@ -593,11 +569,7 @@ pub fn enum_common( for r#ref in refs { let path = resolve_path(r#ref, if is_record { "record" } else { "main" })?; let rename = if r#ref.starts_with('#') { - format!( - "{}{}", - schema_id.expect("schema id must be specified"), - r#ref - ) + format!("{}{}", schema_id.expect("schema id must be specified"), r#ref) } else { r#ref.clone() }; @@ -614,9 +586,8 @@ pub fn enum_common( let name = format_ident!("{}", parts.join("")); let mut feature = quote!(); if is_record { - if let Some((_, Some(feature_name))) = namespaces - .iter() - .find(|(prefix, _)| r#ref.starts_with(prefix)) + if let Some((_, Some(feature_name))) = + namespaces.iter().find(|(prefix, _)| r#ref.starts_with(prefix)) { feature = quote! { #[cfg_attr(docsrs, doc(cfg(feature = #feature_name)))] @@ -657,9 +628,8 @@ pub fn impl_into_record( parts.pop(); let name = format_ident!("{}", parts.join("")); let mut feature = quote!(); - if let Some((_, Some(feature_name))) = namespaces - .iter() - .find(|(prefix, _)| r#ref.starts_with(prefix)) + if let Some((_, Some(feature_name))) = + namespaces.iter().find(|(prefix, _)| r#ref.starts_with(prefix)) { feature = quote! { #[cfg_attr(docsrs, doc(cfg(feature = #feature_name)))] @@ -739,9 +709,8 @@ pub fn client( }; methods.push(method); } - let feature = if let Some((_, Some(feature_name))) = namespaces - .iter() - .find(|(prefix, _)| key.starts_with(prefix)) + let feature = if let Some((_, Some(feature_name))) = + namespaces.iter().find(|(prefix, _)| key.starts_with(prefix)) { quote!(#[cfg(feature = #feature_name)]) } else { @@ -810,11 +779,8 @@ fn client_services( #feature pub #name: #name::Service, }); - let target = if target.is_empty() { - child.to_string() - } else { - format!("{target}.{child}") - }; + let target = + if target.is_empty() { child.to_string() } else { format!("{target}.{child}") }; let submodule = client_services(&target, tree, namespaces)?; mods.push(quote! { #feature @@ -853,11 +819,8 @@ fn client_new( if *is_leaf { continue; } - let parts = if key.is_empty() { - vec![*name] - } else { - key.split('.').chain([*name]).collect_vec() - }; + let parts = + if key.is_empty() { vec![*name] } else { key.split('.').chain([*name]).collect_vec() }; let namespace = parts.join("."); let feature = if let Some((_, Some(feature_name))) = namespaces.iter().find(|(prefix, _)| prefix == &namespace) @@ -909,18 +872,10 @@ fn xrpc_impl_query(query: &LexXrpcQuery, nsid: &str) -> Result { let generic_args = vec![ if has_params { quote!(_) } else { quote!(()) }, quote!(()), - if output_type == OutputType::Data { - quote!(_) - } else { - quote!(()) - }, + if output_type == OutputType::Data { quote!(_) } else { quote!(()) }, quote!(_), ]; - let param_value = if has_params { - quote!(Some(params)) - } else { - quote!(None) - }; + let param_value = if has_params { quote!(Some(params)) } else { quote!(None) }; let nsid_path = resolve_path(nsid, "NSID")?; let xrpc_call = quote! { self.xrpc.send_xrpc::<#(#generic_args),*>(&atrium_xrpc::XrpcRequest { @@ -966,11 +921,7 @@ fn xrpc_impl_procedure(procedure: &LexXrpcProcedure, nsid: &str) -> Result Result { let mut derives = Vec::new(); - for derive in &[ - "serde::Serialize", - "serde::Deserialize", - "Debug", - "Clone", - "PartialEq", - "Eq", - ] { + for derive in &["serde::Serialize", "serde::Deserialize", "Debug", "Clone", "PartialEq", "Eq"] { derives.push(syn::parse_str::(derive)?); } Ok(quote!(#[derive(#(#derives),*)])) From a9d9140b63e5eb8351aaffaedb54a1815e81418c Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Tue, 19 Nov 2024 02:13:09 +0000 Subject: [PATCH 4/8] chore: release --- Cargo.lock | 10 +++++----- Cargo.toml | 8 ++++---- atrium-api/CHANGELOG.md | 8 ++++++++ atrium-api/Cargo.toml | 2 +- atrium-xrpc-client/CHANGELOG.md | 6 ++++++ atrium-xrpc-client/Cargo.toml | 2 +- atrium-xrpc/CHANGELOG.md | 6 ++++++ atrium-xrpc/Cargo.toml | 2 +- bsky-cli/CHANGELOG.md | 6 ++++++ bsky-cli/Cargo.toml | 2 +- bsky-sdk/CHANGELOG.md | 7 +++++++ bsky-sdk/Cargo.toml | 2 +- 12 files changed, 47 insertions(+), 14 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 249e4db1..13bae053 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -178,7 +178,7 @@ checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0" [[package]] name = "atrium-api" -version = "0.24.7" +version = "0.24.8" dependencies = [ "atrium-xrpc", "atrium-xrpc-client", @@ -264,7 +264,7 @@ dependencies = [ [[package]] name = "atrium-xrpc" -version = "0.11.6" +version = "0.11.7" dependencies = [ "bumpalo", "http 1.1.0", @@ -279,7 +279,7 @@ dependencies = [ [[package]] name = "atrium-xrpc-client" -version = "0.5.9" +version = "0.5.10" dependencies = [ "atrium-xrpc", "bumpalo", @@ -360,7 +360,7 @@ dependencies = [ [[package]] name = "bsky-cli" -version = "0.1.25" +version = "0.1.26" dependencies = [ "anyhow", "bsky-sdk", @@ -374,7 +374,7 @@ dependencies = [ [[package]] name = "bsky-sdk" -version = "0.1.12" +version = "0.1.13" dependencies = [ "anyhow", "atrium-api", diff --git a/Cargo.toml b/Cargo.toml index 96dd91f0..4033edcf 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -25,11 +25,11 @@ keywords = ["atproto", "bluesky"] [workspace.dependencies] # Intra-workspace dependencies -atrium-api = { version = "0.24.7", path = "atrium-api", default-features = false } +atrium-api = { version = "0.24.8", path = "atrium-api", default-features = false } atrium-identity = { version = "0.1.0", path = "atrium-oauth/identity" } -atrium-xrpc = { version = "0.11.6", path = "atrium-xrpc" } -atrium-xrpc-client = { version = "0.5.9", path = "atrium-xrpc-client" } -bsky-sdk = { version = "0.1.12", path = "bsky-sdk" } +atrium-xrpc = { version = "0.11.7", path = "atrium-xrpc" } +atrium-xrpc-client = { version = "0.5.10", path = "atrium-xrpc-client" } +bsky-sdk = { version = "0.1.13", path = "bsky-sdk" } # DAG-CBOR codec ipld-core = { version = "0.4.1", default-features = false, features = ["std"] } diff --git a/atrium-api/CHANGELOG.md b/atrium-api/CHANGELOG.md index 03a66807..bd351d3d 100644 --- a/atrium-api/CHANGELOG.md +++ b/atrium-api/CHANGELOG.md @@ -6,6 +6,14 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [Unreleased] +## [0.24.8](https://github.com/sugyan/atrium/compare/atrium-api-v0.24.7...atrium-api-v0.24.8) - 2024-11-19 + +### Added + +- Update API, based on the latest lexicon schemas ([#256](https://github.com/sugyan/atrium/pull/256)) +- Update XrpcClient, add AuthorizationToken ([#248](https://github.com/sugyan/atrium/pull/248)) +- Replace OnceCell with static OnceLock for regex compilation ([#250](https://github.com/sugyan/atrium/pull/250)) + ## [0.24.7](https://github.com/sugyan/atrium/compare/atrium-api-v0.24.6...atrium-api-v0.24.7) - 2024-10-28 ### Added diff --git a/atrium-api/Cargo.toml b/atrium-api/Cargo.toml index 94060175..246e1690 100644 --- a/atrium-api/Cargo.toml +++ b/atrium-api/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "atrium-api" -version = "0.24.7" +version = "0.24.8" authors = ["sugyan "] edition.workspace = true rust-version.workspace = true diff --git a/atrium-xrpc-client/CHANGELOG.md b/atrium-xrpc-client/CHANGELOG.md index a7f7e145..11a1ed79 100644 --- a/atrium-xrpc-client/CHANGELOG.md +++ b/atrium-xrpc-client/CHANGELOG.md @@ -6,6 +6,12 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [Unreleased] +## [0.5.10](https://github.com/sugyan/atrium/compare/atrium-xrpc-client-v0.5.9...atrium-xrpc-client-v0.5.10) - 2024-11-19 + +### Other + +- updated the following local packages: atrium-xrpc + ## [0.5.9](https://github.com/sugyan/atrium/compare/atrium-xrpc-client-v0.5.8...atrium-xrpc-client-v0.5.9) - 2024-10-28 ### Other diff --git a/atrium-xrpc-client/Cargo.toml b/atrium-xrpc-client/Cargo.toml index 5c94c9fb..7affdfe4 100644 --- a/atrium-xrpc-client/Cargo.toml +++ b/atrium-xrpc-client/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "atrium-xrpc-client" -version = "0.5.9" +version = "0.5.10" authors = ["sugyan "] edition.workspace = true rust-version.workspace = true diff --git a/atrium-xrpc/CHANGELOG.md b/atrium-xrpc/CHANGELOG.md index 0e4ee6c9..2d657eea 100644 --- a/atrium-xrpc/CHANGELOG.md +++ b/atrium-xrpc/CHANGELOG.md @@ -6,6 +6,12 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [Unreleased] +## [0.11.7](https://github.com/sugyan/atrium/compare/atrium-xrpc-v0.11.6...atrium-xrpc-v0.11.7) - 2024-11-19 + +### Added + +- Update XrpcClient, add AuthorizationToken ([#248](https://github.com/sugyan/atrium/pull/248)) + ## [0.11.6](https://github.com/sugyan/atrium/compare/atrium-xrpc-v0.11.5...atrium-xrpc-v0.11.6) - 2024-10-28 ### Other diff --git a/atrium-xrpc/Cargo.toml b/atrium-xrpc/Cargo.toml index 2b027711..086e0f15 100644 --- a/atrium-xrpc/Cargo.toml +++ b/atrium-xrpc/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "atrium-xrpc" -version = "0.11.6" +version = "0.11.7" authors = ["sugyan "] edition.workspace = true rust-version.workspace = true diff --git a/bsky-cli/CHANGELOG.md b/bsky-cli/CHANGELOG.md index eb61f4fc..39951312 100644 --- a/bsky-cli/CHANGELOG.md +++ b/bsky-cli/CHANGELOG.md @@ -6,6 +6,12 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [Unreleased] +## [0.1.26](https://github.com/sugyan/atrium/compare/bsky-cli-v0.1.25...bsky-cli-v0.1.26) - 2024-11-19 + +### Other + +- updated the following local packages: bsky-sdk + ## [0.1.25](https://github.com/sugyan/atrium/compare/bsky-cli-v0.1.24...bsky-cli-v0.1.25) - 2024-10-28 ### Added diff --git a/bsky-cli/Cargo.toml b/bsky-cli/Cargo.toml index 7919ab32..1b74785a 100644 --- a/bsky-cli/Cargo.toml +++ b/bsky-cli/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "bsky-cli" -version = "0.1.25" +version = "0.1.26" authors = ["sugyan "] edition.workspace = true rust-version.workspace = true diff --git a/bsky-sdk/CHANGELOG.md b/bsky-sdk/CHANGELOG.md index 4f0e19e3..3fee463a 100644 --- a/bsky-sdk/CHANGELOG.md +++ b/bsky-sdk/CHANGELOG.md @@ -6,6 +6,13 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [Unreleased] +## [0.1.13](https://github.com/sugyan/atrium/compare/bsky-sdk-v0.1.12...bsky-sdk-v0.1.13) - 2024-11-19 + +### Other + +- Update README +- Add example of how to create a Post on bsky ([#255](https://github.com/sugyan/atrium/pull/255)) + ## [0.1.12](https://github.com/sugyan/atrium/compare/bsky-sdk-v0.1.11...bsky-sdk-v0.1.12) - 2024-10-28 ### Added diff --git a/bsky-sdk/Cargo.toml b/bsky-sdk/Cargo.toml index 150d836d..7f6fb63a 100644 --- a/bsky-sdk/Cargo.toml +++ b/bsky-sdk/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "bsky-sdk" -version = "0.1.12" +version = "0.1.13" authors = ["sugyan "] edition.workspace = true rust-version.workspace = true From 6f7722d70c1da405c3a000f7b34e9ca43c6c603a Mon Sep 17 00:00:00 2001 From: sugyan Date: Tue, 19 Nov 2024 11:17:41 +0900 Subject: [PATCH 5/8] Force version bump --- Cargo.lock | 2 +- Cargo.toml | 2 +- atrium-xrpc/CHANGELOG.md | 2 +- atrium-xrpc/Cargo.toml | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 13bae053..5dd1b42c 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -264,7 +264,7 @@ dependencies = [ [[package]] name = "atrium-xrpc" -version = "0.11.7" +version = "0.12.0" dependencies = [ "bumpalo", "http 1.1.0", diff --git a/Cargo.toml b/Cargo.toml index 4033edcf..726d8dcd 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -27,7 +27,7 @@ keywords = ["atproto", "bluesky"] # Intra-workspace dependencies atrium-api = { version = "0.24.8", path = "atrium-api", default-features = false } atrium-identity = { version = "0.1.0", path = "atrium-oauth/identity" } -atrium-xrpc = { version = "0.11.7", path = "atrium-xrpc" } +atrium-xrpc = { version = "0.12.0", path = "atrium-xrpc" } atrium-xrpc-client = { version = "0.5.10", path = "atrium-xrpc-client" } bsky-sdk = { version = "0.1.13", path = "bsky-sdk" } diff --git a/atrium-xrpc/CHANGELOG.md b/atrium-xrpc/CHANGELOG.md index 2d657eea..032cac35 100644 --- a/atrium-xrpc/CHANGELOG.md +++ b/atrium-xrpc/CHANGELOG.md @@ -6,7 +6,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [Unreleased] -## [0.11.7](https://github.com/sugyan/atrium/compare/atrium-xrpc-v0.11.6...atrium-xrpc-v0.11.7) - 2024-11-19 +## [0.12.0](https://github.com/sugyan/atrium/compare/atrium-xrpc-v0.11.6...atrium-xrpc-v0.12.0) - 2024-11-19 ### Added diff --git a/atrium-xrpc/Cargo.toml b/atrium-xrpc/Cargo.toml index 086e0f15..7f069244 100644 --- a/atrium-xrpc/Cargo.toml +++ b/atrium-xrpc/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "atrium-xrpc" -version = "0.11.7" +version = "0.12.0" authors = ["sugyan "] edition.workspace = true rust-version.workspace = true From de18c4f76a41ff2fa5758a36f6d21d2358c6851b Mon Sep 17 00:00:00 2001 From: Mikoto <60188643+avdb13@users.noreply.github.com> Date: Thu, 21 Nov 2024 06:29:42 +0000 Subject: [PATCH 6/8] feat: Extract common abstractions (#244) * initialize crate * add `Cached` trait * add `Throttled` trait * add resolvers * add store * add workflows * fix `atrium-oauth` * add error conversions * change type visibility * fix identity crate * fix oauth-client crate * small fix * mofify crate authors * change `Resolver` type signature * apply suggestions * fix `Throttled` tests * fix wasm `CacheTrait` --- .github/workflows/common.yml | 19 ++ .github/workflows/wasm.yml | 1 + Cargo.toml | 2 + atrium-common/Cargo.toml | 36 +++ atrium-common/src/lib.rs | 3 + atrium-common/src/resolver.rs | 222 ++++++++++++++++ atrium-common/src/resolver/cached.rs | 31 +++ atrium-common/src/resolver/throttled.rs | 43 +++ atrium-common/src/store.rs | 19 ++ atrium-common/src/store/memory.rs | 46 ++++ atrium-common/src/types.rs | 2 + atrium-common/src/types/cached.rs | 34 +++ atrium-common/src/types/cached/impl.rs | 24 ++ .../src/types/cached/impl}/moka.rs | 4 +- .../src/types/cached/impl}/wasm.rs | 4 +- atrium-common/src/types/throttled.rs | 31 +++ atrium-oauth/identity/Cargo.toml | 21 +- atrium-oauth/identity/src/did.rs | 6 +- .../identity/src/did/common_resolver.rs | 3 +- atrium-oauth/identity/src/did/plc_resolver.rs | 3 +- atrium-oauth/identity/src/did/web_resolver.rs | 3 +- atrium-oauth/identity/src/handle.rs | 6 +- .../identity/src/handle/appview_resolver.rs | 3 +- .../identity/src/handle/atproto_resolver.rs | 4 +- .../identity/src/handle/dns_resolver.rs | 3 +- .../src/handle/well_known_resolver.rs | 3 +- .../identity/src/identity_resolver.rs | 4 +- atrium-oauth/identity/src/lib.rs | 1 - atrium-oauth/identity/src/resolver.rs | 246 ------------------ .../identity/src/resolver/cache_impl.rs | 9 - .../identity/src/resolver/cached_resolver.rs | 61 ----- .../src/resolver/throttled_resolver.rs | 59 ----- atrium-oauth/oauth-client/Cargo.toml | 1 + atrium-oauth/oauth-client/src/oauth_client.rs | 3 +- atrium-oauth/oauth-client/src/resolver.rs | 33 ++- .../oauth_authorization_server_resolver.rs | 4 +- .../oauth_protected_resource_resolver.rs | 4 +- 37 files changed, 574 insertions(+), 427 deletions(-) create mode 100644 .github/workflows/common.yml create mode 100644 atrium-common/Cargo.toml create mode 100644 atrium-common/src/lib.rs create mode 100644 atrium-common/src/resolver.rs create mode 100644 atrium-common/src/resolver/cached.rs create mode 100644 atrium-common/src/resolver/throttled.rs create mode 100644 atrium-common/src/store.rs create mode 100644 atrium-common/src/store/memory.rs create mode 100644 atrium-common/src/types.rs create mode 100644 atrium-common/src/types/cached.rs create mode 100644 atrium-common/src/types/cached/impl.rs rename {atrium-oauth/identity/src/resolver/cache_impl => atrium-common/src/types/cached/impl}/moka.rs (88%) rename {atrium-oauth/identity/src/resolver/cache_impl => atrium-common/src/types/cached/impl}/wasm.rs (95%) create mode 100644 atrium-common/src/types/throttled.rs delete mode 100644 atrium-oauth/identity/src/resolver/cache_impl.rs delete mode 100644 atrium-oauth/identity/src/resolver/cached_resolver.rs delete mode 100644 atrium-oauth/identity/src/resolver/throttled_resolver.rs diff --git a/.github/workflows/common.yml b/.github/workflows/common.yml new file mode 100644 index 00000000..284712ab --- /dev/null +++ b/.github/workflows/common.yml @@ -0,0 +1,19 @@ +name: Common +on: + push: + branches: ["main"] + pull_request: + branches: ["main"] +env: + CARGO_TERM_COLOR: always +jobs: + test: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - name: Build + run: | + cargo build -p atrium-common --verbose + - name: Run tests + run: | + cargo test -p atrium-common --lib diff --git a/.github/workflows/wasm.yml b/.github/workflows/wasm.yml index 472e97de..4f84f176 100644 --- a/.github/workflows/wasm.yml +++ b/.github/workflows/wasm.yml @@ -67,3 +67,4 @@ jobs: - run: wasm-pack test --node atrium-xrpc - run: wasm-pack test --node atrium-xrpc-client - run: wasm-pack test --node atrium-oauth/identity + - run: wasm-pack test --node atrium-common diff --git a/Cargo.toml b/Cargo.toml index 726d8dcd..7623fe3c 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,7 @@ [workspace] members = [ "atrium-api", + "atrium-common", "atrium-crypto", "atrium-xrpc", "atrium-xrpc-client", @@ -26,6 +27,7 @@ keywords = ["atproto", "bluesky"] [workspace.dependencies] # Intra-workspace dependencies atrium-api = { version = "0.24.8", path = "atrium-api", default-features = false } +atrium-common = { version = "0.1.0", path = "atrium-common" } atrium-identity = { version = "0.1.0", path = "atrium-oauth/identity" } atrium-xrpc = { version = "0.12.0", path = "atrium-xrpc" } atrium-xrpc-client = { version = "0.5.10", path = "atrium-xrpc-client" } diff --git a/atrium-common/Cargo.toml b/atrium-common/Cargo.toml new file mode 100644 index 00000000..9bda3a56 --- /dev/null +++ b/atrium-common/Cargo.toml @@ -0,0 +1,36 @@ +[package] +name = "atrium-common" +version = "0.1.0" +authors = ["sugyan ", "avdb13 "] +edition.workspace = true +rust-version.workspace = true +description = "Utility library for common abstractions in atproto" +documentation = "https://docs.rs/atrium-common" +readme = "README.md" +repository.workspace = true +license.workspace = true +keywords = ["atproto", "bluesky"] + +[dependencies] +dashmap.workspace = true +thiserror.workspace = true +tokio = { workspace = true, default-features = false, features = ["sync"] } +trait-variant.workspace = true + +[target.'cfg(not(target_arch = "wasm32"))'.dependencies] +moka = { workspace = true, features = ["future"] } + +[target.'cfg(target_arch = "wasm32")'.dependencies] +lru.workspace = true +web-time.workspace = true + +[dev-dependencies] +futures.workspace = true + +[target.'cfg(not(target_arch = "wasm32"))'.dev-dependencies] +tokio = { workspace = true, features = ["macros", "rt-multi-thread", "time"] } + +[target.'cfg(target_arch = "wasm32")'.dev-dependencies] +gloo-timers.workspace = true +tokio = { workspace = true, features = ["time"] } +wasm-bindgen-test.workspace = true diff --git a/atrium-common/src/lib.rs b/atrium-common/src/lib.rs new file mode 100644 index 00000000..8a69602e --- /dev/null +++ b/atrium-common/src/lib.rs @@ -0,0 +1,3 @@ +pub mod resolver; +pub mod store; +pub mod types; diff --git a/atrium-common/src/resolver.rs b/atrium-common/src/resolver.rs new file mode 100644 index 00000000..72e3e26a --- /dev/null +++ b/atrium-common/src/resolver.rs @@ -0,0 +1,222 @@ +mod cached; +mod throttled; + +pub use self::cached::CachedResolver; +pub use self::throttled::ThrottledResolver; +use std::future::Future; + +#[cfg_attr(not(target_arch = "wasm32"), trait_variant::make(Send))] +pub trait Resolver { + type Input: ?Sized; + type Output; + type Error; + + fn resolve( + &self, + input: &Self::Input, + ) -> impl Future>; +} + +#[cfg(test)] +mod tests { + use super::*; + use crate::types::cached::r#impl::{Cache, CacheImpl}; + use crate::types::cached::{CacheConfig, Cacheable}; + use crate::types::throttled::Throttleable; + use std::collections::HashMap; + use std::sync::Arc; + use std::time::Duration; + use tokio::sync::RwLock; + #[cfg(target_arch = "wasm32")] + use wasm_bindgen_test::wasm_bindgen_test; + + #[cfg(not(target_arch = "wasm32"))] + async fn sleep(duration: Duration) { + tokio::time::sleep(duration).await; + } + + #[cfg(target_arch = "wasm32")] + async fn sleep(duration: Duration) { + gloo_timers::future::sleep(duration).await; + } + + #[derive(Debug, PartialEq)] + struct Error; + + type Result = core::result::Result; + + struct MockResolver { + data: HashMap, + counts: Arc>>, + } + + impl Resolver for MockResolver { + type Input = String; + type Output = String; + type Error = Error; + + async fn resolve(&self, input: &Self::Input) -> Result { + sleep(Duration::from_millis(10)).await; + *self.counts.write().await.entry(input.clone()).or_default() += 1; + if let Some(value) = self.data.get(input) { + Ok(value.clone()) + } else { + Err(Error) + } + } + } + + fn mock_resolver(counts: Arc>>) -> MockResolver { + MockResolver { + data: [ + (String::from("k1"), String::from("v1")), + (String::from("k2"), String::from("v2")), + ] + .into_iter() + .collect(), + counts, + } + } + + #[cfg_attr(target_arch = "wasm32", wasm_bindgen_test)] + #[cfg_attr(not(target_arch = "wasm32"), tokio::test)] + async fn test_no_cached() { + let counts = Arc::new(RwLock::new(HashMap::new())); + let resolver = mock_resolver(counts.clone()); + for (input, expected) in [ + ("k1", Some("v1")), + ("k2", Some("v2")), + ("k2", Some("v2")), + ("k1", Some("v1")), + ("k3", None), + ("k1", Some("v1")), + ("k3", None), + ] { + let result = resolver.resolve(&input.to_string()).await; + match expected { + Some(value) => assert_eq!(result.expect("failed to resolve"), value), + None => assert_eq!(result.expect_err("succesfully resolved"), Error), + } + } + assert_eq!( + *counts.read().await, + [(String::from("k1"), 3), (String::from("k2"), 2), (String::from("k3"), 2),] + .into_iter() + .collect() + ); + } + + #[cfg_attr(target_arch = "wasm32", wasm_bindgen_test)] + #[cfg_attr(not(target_arch = "wasm32"), tokio::test)] + async fn test_cached() { + let counts = Arc::new(RwLock::new(HashMap::new())); + let resolver = mock_resolver(counts.clone()).cached(CacheImpl::new(CacheConfig::default())); + for (input, expected) in [ + ("k1", Some("v1")), + ("k2", Some("v2")), + ("k2", Some("v2")), + ("k1", Some("v1")), + ("k3", None), + ("k1", Some("v1")), + ("k3", None), + ] { + let result = resolver.resolve(&input.to_string()).await; + match expected { + Some(value) => assert_eq!(result.expect("failed to resolve"), value), + None => assert_eq!(result.expect_err("succesfully resolved"), Error), + } + } + assert_eq!( + *counts.read().await, + [(String::from("k1"), 1), (String::from("k2"), 1), (String::from("k3"), 2),] + .into_iter() + .collect() + ); + } + + #[cfg_attr(not(target_arch = "wasm32"), tokio::test)] + #[cfg_attr(target_arch = "wasm32", wasm_bindgen_test)] + async fn test_cached_with_max_capacity() { + let counts = Arc::new(RwLock::new(HashMap::new())); + let resolver = mock_resolver(counts.clone()) + .cached(CacheImpl::new(CacheConfig { max_capacity: Some(1), ..Default::default() })); + for (input, expected) in [ + ("k1", Some("v1")), + ("k2", Some("v2")), + ("k2", Some("v2")), + ("k1", Some("v1")), + ("k3", None), + ("k1", Some("v1")), + ("k3", None), + ] { + let result = resolver.resolve(&input.to_string()).await; + match expected { + Some(value) => assert_eq!(result.expect("failed to resolve"), value), + None => assert_eq!(result.expect_err("succesfully resolved"), Error), + } + } + assert_eq!( + *counts.read().await, + [(String::from("k1"), 2), (String::from("k2"), 1), (String::from("k3"), 2),] + .into_iter() + .collect() + ); + } + + #[cfg_attr(not(target_arch = "wasm32"), tokio::test)] + #[cfg_attr(target_arch = "wasm32", wasm_bindgen_test)] + async fn test_cached_with_time_to_live() { + let counts = Arc::new(RwLock::new(HashMap::new())); + let resolver = mock_resolver(counts.clone()).cached(CacheImpl::new(CacheConfig { + time_to_live: Some(Duration::from_millis(10)), + ..Default::default() + })); + for _ in 0..10 { + let result = resolver.resolve(&String::from("k1")).await; + assert_eq!(result.expect("failed to resolve"), "v1"); + } + sleep(Duration::from_millis(10)).await; + for _ in 0..10 { + let result = resolver.resolve(&String::from("k1")).await; + assert_eq!(result.expect("failed to resolve"), "v1"); + } + assert_eq!(*counts.read().await, [(String::from("k1"), 2)].into_iter().collect()); + } + + #[cfg_attr(target_arch = "wasm32", wasm_bindgen_test)] + #[cfg_attr(not(target_arch = "wasm32"), tokio::test)] + async fn test_throttled() { + let counts = Arc::new(RwLock::new(HashMap::new())); + let resolver = Arc::new(mock_resolver(counts.clone()).throttled()); + + let mut handles = Vec::new(); + for (input, expected) in [ + ("k1", Some("v1")), + ("k2", Some("v2")), + ("k2", Some("v2")), + ("k1", Some("v1")), + ("k3", None), + ("k1", Some("v1")), + ("k3", None), + ] { + let resolver = resolver.clone(); + handles.push(async move { (resolver.resolve(&input.to_string()).await, expected) }); + } + for (result, expected) in futures::future::join_all(handles).await { + let result = result.and_then(|opt| opt.ok_or(Error)); + + match expected { + Some(value) => { + assert_eq!(result.expect("failed to resolve"), value) + } + None => assert_eq!(result.expect_err("succesfully resolved"), Error), + } + } + assert_eq!( + *counts.read().await, + [(String::from("k1"), 1), (String::from("k2"), 1), (String::from("k3"), 1),] + .into_iter() + .collect() + ); + } +} diff --git a/atrium-common/src/resolver/cached.rs b/atrium-common/src/resolver/cached.rs new file mode 100644 index 00000000..6f55f56d --- /dev/null +++ b/atrium-common/src/resolver/cached.rs @@ -0,0 +1,31 @@ +use std::hash::Hash; + +use crate::types::cached::r#impl::{Cache, CacheImpl}; +use crate::types::cached::Cached; + +use super::Resolver; + +pub type CachedResolver = Cached::Input, ::Output>>; + +impl Resolver for Cached +where + R: Resolver + Send + Sync + 'static, + R::Input: Clone + Hash + Eq + Send + Sync + 'static, + R::Output: Clone + Send + Sync + 'static, + C: Cache + Send + Sync + 'static, + C::Input: Clone + Hash + Eq + Send + Sync + 'static, + C::Output: Clone + Send + Sync + 'static, +{ + type Input = R::Input; + type Output = R::Output; + type Error = R::Error; + + async fn resolve(&self, input: &Self::Input) -> Result { + if let Some(output) = self.cache.get(input).await { + return Ok(output); + } + let output = self.inner.resolve(input).await?; + self.cache.set(input.clone(), output.clone()).await; + Ok(output) + } +} diff --git a/atrium-common/src/resolver/throttled.rs b/atrium-common/src/resolver/throttled.rs new file mode 100644 index 00000000..f16893d4 --- /dev/null +++ b/atrium-common/src/resolver/throttled.rs @@ -0,0 +1,43 @@ +use std::{hash::Hash, sync::Arc}; + +use dashmap::{DashMap, Entry}; +use tokio::sync::broadcast::{channel, Sender}; +use tokio::sync::Mutex; + +use crate::types::throttled::Throttled; + +use super::Resolver; + +pub type SenderMap = + DashMap<::Input, Arc::Output>>>>>; + +pub type ThrottledResolver = Throttled>; + +impl Resolver for Throttled> +where + R: Resolver + Send + Sync + 'static, + R::Input: Clone + Hash + Eq + Send + Sync + 'static, + R::Output: Clone + Send + Sync + 'static, +{ + type Input = R::Input; + type Output = Option; + type Error = R::Error; + + async fn resolve(&self, input: &Self::Input) -> Result { + match self.pending.entry(input.clone()) { + Entry::Occupied(occupied) => { + let tx = occupied.get().lock().await.clone(); + drop(occupied); + Ok(tx.subscribe().recv().await.expect("recv")) + } + Entry::Vacant(vacant) => { + let (tx, _) = channel(1); + vacant.insert(Arc::new(Mutex::new(tx.clone()))); + let result = self.inner.resolve(input).await; + tx.send(result.as_ref().ok().cloned()).ok(); + self.pending.remove(input); + result.map(Some) + } + } + } +} diff --git a/atrium-common/src/store.rs b/atrium-common/src/store.rs new file mode 100644 index 00000000..d2d8a30a --- /dev/null +++ b/atrium-common/src/store.rs @@ -0,0 +1,19 @@ +pub mod memory; + +use std::error::Error; +use std::future::Future; +use std::hash::Hash; + +#[cfg_attr(not(target_arch = "wasm32"), trait_variant::make(Send))] +pub trait Store +where + K: Eq + Hash, + V: Clone, +{ + type Error: Error; + + fn get(&self, key: &K) -> impl Future, Self::Error>>; + fn set(&self, key: K, value: V) -> impl Future>; + fn del(&self, key: &K) -> impl Future>; + fn clear(&self) -> impl Future>; +} diff --git a/atrium-common/src/store/memory.rs b/atrium-common/src/store/memory.rs new file mode 100644 index 00000000..dc81fd7c --- /dev/null +++ b/atrium-common/src/store/memory.rs @@ -0,0 +1,46 @@ +use super::Store; +use std::collections::HashMap; +use std::fmt::Debug; +use std::hash::Hash; +use std::sync::{Arc, Mutex}; +use thiserror::Error; + +#[derive(Error, Debug)] +#[error("memory store error")] +pub struct Error; + +// TODO: LRU cache? +#[derive(Clone)] +pub struct MemoryStore { + store: Arc>>, +} + +impl Default for MemoryStore { + fn default() -> Self { + Self { store: Arc::new(Mutex::new(HashMap::new())) } + } +} + +impl Store for MemoryStore +where + K: Debug + Eq + Hash + Send + Sync + 'static, + V: Debug + Clone + Send + Sync + 'static, +{ + type Error = Error; + + async fn get(&self, key: &K) -> Result, Self::Error> { + Ok(self.store.lock().unwrap().get(key).cloned()) + } + async fn set(&self, key: K, value: V) -> Result<(), Self::Error> { + self.store.lock().unwrap().insert(key, value); + Ok(()) + } + async fn del(&self, key: &K) -> Result<(), Self::Error> { + self.store.lock().unwrap().remove(key); + Ok(()) + } + async fn clear(&self) -> Result<(), Self::Error> { + self.store.lock().unwrap().clear(); + Ok(()) + } +} diff --git a/atrium-common/src/types.rs b/atrium-common/src/types.rs new file mode 100644 index 00000000..5c9c52ef --- /dev/null +++ b/atrium-common/src/types.rs @@ -0,0 +1,2 @@ +pub mod cached; +pub mod throttled; diff --git a/atrium-common/src/types/cached.rs b/atrium-common/src/types/cached.rs new file mode 100644 index 00000000..e9e19a77 --- /dev/null +++ b/atrium-common/src/types/cached.rs @@ -0,0 +1,34 @@ +pub mod r#impl; + +use std::fmt::Debug; +use std::time::Duration; + +#[derive(Clone, Debug, Default)] +pub struct CacheConfig { + pub max_capacity: Option, + pub time_to_live: Option, +} + +pub trait Cacheable +where + Self: Sized, +{ + fn cached(self, cache: C) -> Cached; +} + +impl Cacheable for T { + fn cached(self, cache: C) -> Cached { + Cached::new(self, cache) + } +} + +pub struct Cached { + pub inner: T, + pub cache: C, +} + +impl Cached { + pub fn new(inner: T, cache: C) -> Self { + Self { inner, cache } + } +} diff --git a/atrium-common/src/types/cached/impl.rs b/atrium-common/src/types/cached/impl.rs new file mode 100644 index 00000000..d7f634f2 --- /dev/null +++ b/atrium-common/src/types/cached/impl.rs @@ -0,0 +1,24 @@ +#[cfg(not(target_arch = "wasm32"))] +mod moka; +#[cfg(target_arch = "wasm32")] +mod wasm; + +use std::future::Future; +use std::hash::Hash; + +#[cfg(not(target_arch = "wasm32"))] +pub use self::moka::MokaCache as CacheImpl; +#[cfg(target_arch = "wasm32")] +pub use self::wasm::WasmCache as CacheImpl; + +use super::CacheConfig; + +#[cfg_attr(not(target_arch = "wasm32"), trait_variant::make(Send))] +pub trait Cache { + type Input: Hash + Eq + Sync + 'static; + type Output: Clone + Sync + 'static; + + fn new(config: CacheConfig) -> Self; + fn get(&self, key: &Self::Input) -> impl Future>; + fn set(&self, key: Self::Input, value: Self::Output) -> impl Future; +} diff --git a/atrium-oauth/identity/src/resolver/cache_impl/moka.rs b/atrium-common/src/types/cached/impl/moka.rs similarity index 88% rename from atrium-oauth/identity/src/resolver/cache_impl/moka.rs rename to atrium-common/src/types/cached/impl/moka.rs index f35fa3a8..cbc2a91d 100644 --- a/atrium-oauth/identity/src/resolver/cache_impl/moka.rs +++ b/atrium-common/src/types/cached/impl/moka.rs @@ -1,4 +1,4 @@ -use super::super::cached_resolver::{Cache as CacheTrait, CachedResolverConfig}; +use super::{Cache as CacheTrait, CacheConfig}; use moka::{future::Cache, policy::EvictionPolicy}; use std::collections::hash_map::RandomState; use std::hash::Hash; @@ -15,7 +15,7 @@ where type Input = I; type Output = O; - fn new(config: CachedResolverConfig) -> Self { + fn new(config: CacheConfig) -> Self { let mut builder = Cache::::builder().eviction_policy(EvictionPolicy::lru()); if let Some(max_capacity) = config.max_capacity { builder = builder.max_capacity(max_capacity); diff --git a/atrium-oauth/identity/src/resolver/cache_impl/wasm.rs b/atrium-common/src/types/cached/impl/wasm.rs similarity index 95% rename from atrium-oauth/identity/src/resolver/cache_impl/wasm.rs rename to atrium-common/src/types/cached/impl/wasm.rs index 8af03932..ba82c48a 100644 --- a/atrium-oauth/identity/src/resolver/cache_impl/wasm.rs +++ b/atrium-common/src/types/cached/impl/wasm.rs @@ -1,4 +1,4 @@ -use super::super::cached_resolver::{Cache as CacheTrait, CachedResolverConfig}; +use super::{Cache as CacheTrait, CacheConfig}; use lru::LruCache; use std::collections::HashMap; use std::hash::Hash; @@ -64,7 +64,7 @@ where type Input = I; type Output = O; - fn new(config: CachedResolverConfig) -> Self { + fn new(config: CacheConfig) -> Self { let store = if let Some(max_capacity) = config.max_capacity { Store::Lru(LruCache::new( NonZeroUsize::new(max_capacity as usize) diff --git a/atrium-common/src/types/throttled.rs b/atrium-common/src/types/throttled.rs new file mode 100644 index 00000000..69fa588e --- /dev/null +++ b/atrium-common/src/types/throttled.rs @@ -0,0 +1,31 @@ +use std::sync::Arc; + +pub trait Throttleable

+where + Self: std::marker::Sized, +{ + fn throttled(self) -> Throttled; +} + +impl Throttleable

for T +where + P: Default, +{ + fn throttled(self) -> Throttled { + Throttled::new(self) + } +} + +pub struct Throttled { + pub inner: T, + pub pending: Arc

, +} + +impl Throttled +where + P: Default, +{ + pub fn new(inner: T) -> Self { + Self { inner, pending: Arc::new(P::default()) } + } +} diff --git a/atrium-oauth/identity/Cargo.toml b/atrium-oauth/identity/Cargo.toml index 55a0b15b..6273ff77 100644 --- a/atrium-oauth/identity/Cargo.toml +++ b/atrium-oauth/identity/Cargo.toml @@ -15,34 +15,15 @@ keywords = ["atproto", "bluesky", "identity"] [dependencies] atrium-api = { workspace = true, default-features = false } +atrium-common.workspace = true atrium-xrpc.workspace = true -dashmap.workspace = true hickory-proto = { workspace = true, optional = true } serde = { workspace = true, features = ["derive"] } serde_html_form.workspace = true serde_json.workspace = true thiserror.workspace = true -tokio = { workspace = true, default-features = false, features = ["sync"] } trait-variant.workspace = true -[target.'cfg(not(target_arch = "wasm32"))'.dependencies] -moka = { workspace = true, features = ["future"] } - -[target.'cfg(target_arch = "wasm32")'.dependencies] -lru.workspace = true -web-time.workspace = true - -[dev-dependencies] -futures.workspace = true - -[target.'cfg(not(target_arch = "wasm32"))'.dev-dependencies] -tokio = { workspace = true, features = ["macros", "rt-multi-thread", "time"] } - -[target.'cfg(target_arch = "wasm32")'.dev-dependencies] -gloo-timers.workspace = true -tokio = { workspace = true, features = ["time"] } -wasm-bindgen-test.workspace = true - [features] default = [] doh-handle-resolver = ["dep:hickory-proto"] diff --git a/atrium-oauth/identity/src/did.rs b/atrium-oauth/identity/src/did.rs index 79621721..0b731cb1 100644 --- a/atrium-oauth/identity/src/did.rs +++ b/atrium-oauth/identity/src/did.rs @@ -2,10 +2,12 @@ mod common_resolver; mod plc_resolver; mod web_resolver; +use crate::Error; + pub use self::common_resolver::{CommonDidResolver, CommonDidResolverConfig}; pub use self::plc_resolver::DEFAULT_PLC_DIRECTORY_URL; -use crate::Resolver; use atrium_api::did_doc::DidDocument; use atrium_api::types::string::Did; +use atrium_common::resolver::Resolver; -pub trait DidResolver: Resolver {} +pub trait DidResolver: Resolver {} diff --git a/atrium-oauth/identity/src/did/common_resolver.rs b/atrium-oauth/identity/src/did/common_resolver.rs index 601127f7..5c18f634 100644 --- a/atrium-oauth/identity/src/did/common_resolver.rs +++ b/atrium-oauth/identity/src/did/common_resolver.rs @@ -1,12 +1,12 @@ use atrium_api::did_doc::DidDocument; use atrium_api::types::string::Did; +use atrium_common::resolver::Resolver; use atrium_xrpc::HttpClient; use super::plc_resolver::{PlcDidResolver, PlcDidResolverConfig}; use super::web_resolver::{WebDidResolver, WebDidResolverConfig}; use super::DidResolver; use crate::error::{Error, Result}; -use crate::Resolver; use std::sync::Arc; #[derive(Clone, Debug)] @@ -41,6 +41,7 @@ where { type Input = Did; type Output = DidDocument; + type Error = Error; async fn resolve(&self, did: &Self::Input) -> Result { match did.strip_prefix("did:").and_then(|s| s.split_once(':').map(|(method, _)| method)) { diff --git a/atrium-oauth/identity/src/did/plc_resolver.rs b/atrium-oauth/identity/src/did/plc_resolver.rs index 5f8dc1e7..5d32582e 100644 --- a/atrium-oauth/identity/src/did/plc_resolver.rs +++ b/atrium-oauth/identity/src/did/plc_resolver.rs @@ -1,8 +1,8 @@ use super::DidResolver; use crate::error::{Error, Result}; -use crate::Resolver; use atrium_api::did_doc::DidDocument; use atrium_api::types::string::Did; +use atrium_common::resolver::Resolver; use atrium_xrpc::http::uri::Builder; use atrium_xrpc::http::{Request, Uri}; use atrium_xrpc::HttpClient; @@ -33,6 +33,7 @@ where { type Input = Did; type Output = DidDocument; + type Error = Error; async fn resolve(&self, did: &Self::Input) -> Result { let uri = Builder::from(self.plc_directory_url.parse::()?) diff --git a/atrium-oauth/identity/src/did/web_resolver.rs b/atrium-oauth/identity/src/did/web_resolver.rs index 582bdd00..eba6ed99 100644 --- a/atrium-oauth/identity/src/did/web_resolver.rs +++ b/atrium-oauth/identity/src/did/web_resolver.rs @@ -1,8 +1,8 @@ use super::DidResolver; use crate::error::{Error, Result}; -use crate::Resolver; use atrium_api::did_doc::DidDocument; use atrium_api::types::string::Did; +use atrium_common::resolver::Resolver; use atrium_xrpc::http::{header::ACCEPT, Request, Uri}; use atrium_xrpc::HttpClient; use std::sync::Arc; @@ -30,6 +30,7 @@ where { type Input = Did; type Output = DidDocument; + type Error = Error; async fn resolve(&self, did: &Self::Input) -> Result { let document_url = format!( diff --git a/atrium-oauth/identity/src/handle.rs b/atrium-oauth/identity/src/handle.rs index 2ae285dd..da7f0d93 100644 --- a/atrium-oauth/identity/src/handle.rs +++ b/atrium-oauth/identity/src/handle.rs @@ -5,13 +5,15 @@ mod dns_resolver; mod doh_dns_txt_resolver; mod well_known_resolver; +use crate::Error; + pub use self::appview_resolver::{AppViewHandleResolver, AppViewHandleResolverConfig}; pub use self::atproto_resolver::{AtprotoHandleResolver, AtprotoHandleResolverConfig}; pub use self::dns_resolver::DnsTxtResolver; #[cfg(feature = "doh-handle-resolver")] pub use self::doh_dns_txt_resolver::{DohDnsTxtResolver, DohDnsTxtResolverConfig}; pub use self::well_known_resolver::{WellKnownHandleResolver, WellKnownHandleResolverConfig}; -use crate::Resolver; use atrium_api::types::string::{Did, Handle}; +use atrium_common::resolver::Resolver; -pub trait HandleResolver: Resolver {} +pub trait HandleResolver: Resolver {} diff --git a/atrium-oauth/identity/src/handle/appview_resolver.rs b/atrium-oauth/identity/src/handle/appview_resolver.rs index 90255a35..098ab783 100644 --- a/atrium-oauth/identity/src/handle/appview_resolver.rs +++ b/atrium-oauth/identity/src/handle/appview_resolver.rs @@ -1,8 +1,8 @@ use super::HandleResolver; use crate::error::{Error, Result}; -use crate::Resolver; use atrium_api::com::atproto::identity::resolve_handle; use atrium_api::types::string::{Did, Handle}; +use atrium_common::resolver::Resolver; use atrium_xrpc::http::uri::Builder; use atrium_xrpc::http::{Request, Uri}; use atrium_xrpc::HttpClient; @@ -31,6 +31,7 @@ where { type Input = Handle; type Output = Did; + type Error = Error; async fn resolve(&self, handle: &Self::Input) -> Result { let uri = Builder::from(self.service_url.parse::()?) diff --git a/atrium-oauth/identity/src/handle/atproto_resolver.rs b/atrium-oauth/identity/src/handle/atproto_resolver.rs index 25ec54b4..98579f81 100644 --- a/atrium-oauth/identity/src/handle/atproto_resolver.rs +++ b/atrium-oauth/identity/src/handle/atproto_resolver.rs @@ -2,8 +2,9 @@ use super::dns_resolver::{DnsHandleResolver, DnsHandleResolverConfig, DnsTxtReso use super::well_known_resolver::{WellKnownHandleResolver, WellKnownHandleResolverConfig}; use super::HandleResolver; use crate::error::Result; -use crate::Resolver; +use crate::Error; use atrium_api::types::string::{Did, Handle}; +use atrium_common::resolver::Resolver; use atrium_xrpc::HttpClient; use std::sync::Arc; @@ -38,6 +39,7 @@ where { type Input = Handle; type Output = Did; + type Error = Error; async fn resolve(&self, handle: &Self::Input) -> Result { let d_fut = self.dns.resolve(handle); diff --git a/atrium-oauth/identity/src/handle/dns_resolver.rs b/atrium-oauth/identity/src/handle/dns_resolver.rs index 7cdc6a92..984254b5 100644 --- a/atrium-oauth/identity/src/handle/dns_resolver.rs +++ b/atrium-oauth/identity/src/handle/dns_resolver.rs @@ -1,7 +1,7 @@ use super::HandleResolver; use crate::error::{Error, Result}; -use crate::Resolver; use atrium_api::types::string::{Did, Handle}; +use atrium_common::resolver::Resolver; use std::future::Future; const SUBDOMAIN: &str = "_atproto"; @@ -41,6 +41,7 @@ where { type Input = Handle; type Output = Did; + type Error = Error; async fn resolve(&self, handle: &Self::Input) -> Result { for result in self diff --git a/atrium-oauth/identity/src/handle/well_known_resolver.rs b/atrium-oauth/identity/src/handle/well_known_resolver.rs index 9f04b2b7..e3542b31 100644 --- a/atrium-oauth/identity/src/handle/well_known_resolver.rs +++ b/atrium-oauth/identity/src/handle/well_known_resolver.rs @@ -1,7 +1,7 @@ use super::HandleResolver; use crate::error::{Error, Result}; -use crate::Resolver; use atrium_api::types::string::{Did, Handle}; +use atrium_common::resolver::Resolver; use atrium_xrpc::http::Request; use atrium_xrpc::HttpClient; use std::sync::Arc; @@ -29,6 +29,7 @@ where { type Input = Handle; type Output = Did; + type Error = Error; async fn resolve(&self, handle: &Self::Input) -> Result { let url = format!("https://{}{WELL_KNWON_PATH}", handle.as_str()); diff --git a/atrium-oauth/identity/src/identity_resolver.rs b/atrium-oauth/identity/src/identity_resolver.rs index e8244bce..a70e1856 100644 --- a/atrium-oauth/identity/src/identity_resolver.rs +++ b/atrium-oauth/identity/src/identity_resolver.rs @@ -1,6 +1,7 @@ use crate::error::{Error, Result}; -use crate::{did::DidResolver, handle::HandleResolver, Resolver}; +use crate::{did::DidResolver, handle::HandleResolver}; use atrium_api::types::string::AtIdentifier; +use atrium_common::resolver::Resolver; use serde::{Deserialize, Serialize}; #[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)] @@ -33,6 +34,7 @@ where { type Input = str; type Output = ResolvedIdentity; + type Error = Error; async fn resolve(&self, input: &Self::Input) -> Result { let document = diff --git a/atrium-oauth/identity/src/lib.rs b/atrium-oauth/identity/src/lib.rs index d64a61cf..9f397322 100644 --- a/atrium-oauth/identity/src/lib.rs +++ b/atrium-oauth/identity/src/lib.rs @@ -5,4 +5,3 @@ pub mod identity_resolver; pub mod resolver; pub use self::error::{Error, Result}; -pub use self::resolver::Resolver; diff --git a/atrium-oauth/identity/src/resolver.rs b/atrium-oauth/identity/src/resolver.rs index 5cfdff90..3f3d911d 100644 --- a/atrium-oauth/identity/src/resolver.rs +++ b/atrium-oauth/identity/src/resolver.rs @@ -1,247 +1 @@ -mod cache_impl; -mod cached_resolver; -mod throttled_resolver; - -pub use self::cached_resolver::{CachedResolver, CachedResolverConfig}; -pub use self::throttled_resolver::ThrottledResolver; pub use crate::error::Result; -use std::future::Future; -use std::hash::Hash; - -#[cfg_attr(not(target_arch = "wasm32"), trait_variant::make(Send))] -pub trait Resolver { - type Input: ?Sized; - type Output; - - fn resolve(&self, input: &Self::Input) -> impl Future>; -} - -pub trait Cacheable -where - Self: Sized + Resolver, - Self::Input: Sized, -{ - fn cached(self, config: CachedResolverConfig) -> CachedResolver; -} - -impl Cacheable for R -where - R: Sized + Resolver, - R::Input: Sized + Hash + Eq + Send + Sync + 'static, - R::Output: Clone + Send + Sync + 'static, -{ - fn cached(self, config: CachedResolverConfig) -> CachedResolver { - CachedResolver::new(self, config) - } -} - -pub trait Throttleable -where - Self: Sized + Resolver, - Self::Input: Sized, -{ - fn throttled(self) -> ThrottledResolver; -} - -impl Throttleable for R -where - R: Sized + Resolver, - R::Input: Clone + Hash + Eq + Send + Sync + 'static, - R::Output: Clone + Send + Sync + 'static, -{ - fn throttled(self) -> ThrottledResolver { - ThrottledResolver::new(self) - } -} - -#[cfg(test)] -mod tests { - use super::*; - use crate::error::Error; - use std::collections::HashMap; - use std::sync::Arc; - use std::time::Duration; - use tokio::sync::RwLock; - #[cfg(target_arch = "wasm32")] - use wasm_bindgen_test::wasm_bindgen_test; - - #[cfg(not(target_arch = "wasm32"))] - async fn sleep(duration: Duration) { - tokio::time::sleep(duration).await; - } - - #[cfg(target_arch = "wasm32")] - async fn sleep(duration: Duration) { - gloo_timers::future::sleep(duration).await; - } - - struct MockResolver { - data: HashMap, - counts: Arc>>, - } - - impl Resolver for MockResolver { - type Input = String; - type Output = String; - - async fn resolve(&self, input: &Self::Input) -> Result { - sleep(Duration::from_millis(10)).await; - *self.counts.write().await.entry(input.clone()).or_default() += 1; - if let Some(value) = self.data.get(input) { - Ok(value.clone()) - } else { - Err(Error::NotFound) - } - } - } - - fn mock_resolver(counts: Arc>>) -> MockResolver { - MockResolver { - data: [ - (String::from("k1"), String::from("v1")), - (String::from("k2"), String::from("v2")), - ] - .into_iter() - .collect(), - counts, - } - } - - #[cfg_attr(target_arch = "wasm32", wasm_bindgen_test)] - #[cfg_attr(not(target_arch = "wasm32"), tokio::test)] - async fn test_no_cached() { - let counts = Arc::new(RwLock::new(HashMap::new())); - let resolver = mock_resolver(counts.clone()); - for (input, expected) in [ - ("k1", Some("v1")), - ("k2", Some("v2")), - ("k2", Some("v2")), - ("k1", Some("v1")), - ("k3", None), - ("k1", Some("v1")), - ("k3", None), - ] { - let result = resolver.resolve(&input.to_string()).await; - match expected { - Some(value) => assert_eq!(result.expect("failed to resolve"), value), - None => assert!(result.is_err()), - } - } - assert_eq!( - *counts.read().await, - [(String::from("k1"), 3), (String::from("k2"), 2), (String::from("k3"), 2),] - .into_iter() - .collect() - ); - } - - #[cfg_attr(target_arch = "wasm32", wasm_bindgen_test)] - #[cfg_attr(not(target_arch = "wasm32"), tokio::test)] - async fn test_cached() { - let counts = Arc::new(RwLock::new(HashMap::new())); - let resolver = mock_resolver(counts.clone()).cached(Default::default()); - for (input, expected) in [ - ("k1", Some("v1")), - ("k2", Some("v2")), - ("k2", Some("v2")), - ("k1", Some("v1")), - ("k3", None), - ("k1", Some("v1")), - ("k3", None), - ] { - let result = resolver.resolve(&input.to_string()).await; - match expected { - Some(value) => assert_eq!(result.expect("failed to resolve"), value), - None => assert!(result.is_err()), - } - } - assert_eq!( - *counts.read().await, - [(String::from("k1"), 1), (String::from("k2"), 1), (String::from("k3"), 2),] - .into_iter() - .collect() - ); - } - - #[cfg_attr(not(target_arch = "wasm32"), tokio::test)] - #[cfg_attr(target_arch = "wasm32", wasm_bindgen_test)] - async fn test_cached_with_max_capacity() { - let counts = Arc::new(RwLock::new(HashMap::new())); - let resolver = mock_resolver(counts.clone()) - .cached(CachedResolverConfig { max_capacity: Some(1), ..Default::default() }); - for (input, expected) in [ - ("k1", Some("v1")), - ("k2", Some("v2")), - ("k2", Some("v2")), - ("k1", Some("v1")), - ("k3", None), - ("k1", Some("v1")), - ("k3", None), - ] { - let result = resolver.resolve(&input.to_string()).await; - match expected { - Some(value) => assert_eq!(result.expect("failed to resolve"), value), - None => assert!(result.is_err()), - } - } - assert_eq!( - *counts.read().await, - [(String::from("k1"), 2), (String::from("k2"), 1), (String::from("k3"), 2),] - .into_iter() - .collect() - ); - } - - #[cfg_attr(not(target_arch = "wasm32"), tokio::test)] - #[cfg_attr(target_arch = "wasm32", wasm_bindgen_test)] - async fn test_cached_with_time_to_live() { - let counts = Arc::new(RwLock::new(HashMap::new())); - let resolver = mock_resolver(counts.clone()).cached(CachedResolverConfig { - time_to_live: Some(Duration::from_millis(10)), - ..Default::default() - }); - for _ in 0..10 { - let result = resolver.resolve(&String::from("k1")).await; - assert_eq!(result.expect("failed to resolve"), "v1"); - } - sleep(Duration::from_millis(10)).await; - for _ in 0..10 { - let result = resolver.resolve(&String::from("k1")).await; - assert_eq!(result.expect("failed to resolve"), "v1"); - } - assert_eq!(*counts.read().await, [(String::from("k1"), 2)].into_iter().collect()); - } - - #[cfg_attr(target_arch = "wasm32", wasm_bindgen_test)] - #[cfg_attr(not(target_arch = "wasm32"), tokio::test)] - async fn test_throttled() { - let counts = Arc::new(RwLock::new(HashMap::new())); - let resolver = Arc::new(mock_resolver(counts.clone()).throttled()); - - let mut handles = Vec::new(); - for (input, expected) in [ - ("k1", Some("v1")), - ("k2", Some("v2")), - ("k2", Some("v2")), - ("k1", Some("v1")), - ("k3", None), - ("k1", Some("v1")), - ("k3", None), - ] { - let resolver = resolver.clone(); - handles.push(async move { (resolver.resolve(&input.to_string()).await, expected) }); - } - for (result, expected) in futures::future::join_all(handles).await { - match expected { - Some(value) => assert_eq!(result.expect("failed to resolve"), value), - None => assert!(result.is_err()), - } - } - assert_eq!( - *counts.read().await, - [(String::from("k1"), 1), (String::from("k2"), 1), (String::from("k3"), 1),] - .into_iter() - .collect() - ); - } -} diff --git a/atrium-oauth/identity/src/resolver/cache_impl.rs b/atrium-oauth/identity/src/resolver/cache_impl.rs deleted file mode 100644 index c1b72c9c..00000000 --- a/atrium-oauth/identity/src/resolver/cache_impl.rs +++ /dev/null @@ -1,9 +0,0 @@ -#[cfg(not(target_arch = "wasm32"))] -mod moka; -#[cfg(target_arch = "wasm32")] -mod wasm; - -#[cfg(not(target_arch = "wasm32"))] -pub use self::moka::MokaCache as CacheImpl; -#[cfg(target_arch = "wasm32")] -pub use self::wasm::WasmCache as CacheImpl; diff --git a/atrium-oauth/identity/src/resolver/cached_resolver.rs b/atrium-oauth/identity/src/resolver/cached_resolver.rs deleted file mode 100644 index 79a38295..00000000 --- a/atrium-oauth/identity/src/resolver/cached_resolver.rs +++ /dev/null @@ -1,61 +0,0 @@ -use super::cache_impl::CacheImpl; -use crate::error::Result; -use crate::Resolver; -use std::fmt::Debug; -use std::hash::Hash; -use std::time::Duration; - -#[cfg_attr(not(target_arch = "wasm32"), trait_variant::make(Send))] -pub(crate) trait Cache { - type Input: Hash + Eq + Sync + 'static; - type Output: Clone + Sync + 'static; - - fn new(config: CachedResolverConfig) -> Self; - async fn get(&self, key: &Self::Input) -> Option; - async fn set(&self, key: Self::Input, value: Self::Output); -} - -#[derive(Clone, Debug, Default)] -pub struct CachedResolverConfig { - pub max_capacity: Option, - pub time_to_live: Option, -} - -pub struct CachedResolver -where - R: Resolver, - R::Input: Sized, -{ - resolver: R, - cache: CacheImpl, -} - -impl CachedResolver -where - R: Resolver, - R::Input: Sized + Hash + Eq + Send + Sync + 'static, - R::Output: Clone + Send + Sync + 'static, -{ - pub fn new(resolver: R, config: CachedResolverConfig) -> Self { - Self { resolver, cache: CacheImpl::new(config) } - } -} - -impl Resolver for CachedResolver -where - R: Resolver + Send + Sync + 'static, - R::Input: Clone + Hash + Eq + Send + Sync + 'static + Debug, - R::Output: Clone + Send + Sync + 'static, -{ - type Input = R::Input; - type Output = R::Output; - - async fn resolve(&self, input: &Self::Input) -> Result { - if let Some(output) = self.cache.get(input).await { - return Ok(output); - } - let output = self.resolver.resolve(input).await?; - self.cache.set(input.clone(), output.clone()).await; - Ok(output) - } -} diff --git a/atrium-oauth/identity/src/resolver/throttled_resolver.rs b/atrium-oauth/identity/src/resolver/throttled_resolver.rs deleted file mode 100644 index 195473f0..00000000 --- a/atrium-oauth/identity/src/resolver/throttled_resolver.rs +++ /dev/null @@ -1,59 +0,0 @@ -use super::Resolver; -use crate::error::{Error, Result}; -use dashmap::{DashMap, Entry}; -use std::hash::Hash; -use std::sync::Arc; -use tokio::sync::broadcast::{channel, Sender}; -use tokio::sync::Mutex; - -type SharedSender = Arc>>>; - -pub struct ThrottledResolver -where - R: Resolver, - R::Input: Sized, -{ - resolver: R, - senders: Arc>>, -} - -impl ThrottledResolver -where - R: Resolver, - R::Input: Clone + Hash + Eq + Send + Sync + 'static, -{ - pub fn new(resolver: R) -> Self { - Self { resolver, senders: Arc::new(DashMap::new()) } - } -} - -impl Resolver for ThrottledResolver -where - R: Resolver + Send + Sync + 'static, - R::Input: Clone + Hash + Eq + Send + Sync + 'static, - R::Output: Clone + Send + Sync + 'static, -{ - type Input = R::Input; - type Output = R::Output; - - async fn resolve(&self, input: &Self::Input) -> Result { - match self.senders.entry(input.clone()) { - Entry::Occupied(occupied) => { - let tx = occupied.get().lock().await.clone(); - drop(occupied); - match tx.subscribe().recv().await.expect("recv") { - Some(result) => Ok(result), - None => Err(Error::NotFound), - } - } - Entry::Vacant(vacant) => { - let (tx, _) = channel(1); - vacant.insert(Arc::new(Mutex::new(tx.clone()))); - let result = self.resolver.resolve(input).await; - tx.send(result.as_ref().ok().cloned()).ok(); - self.senders.remove(input); - result - } - } - } -} diff --git a/atrium-oauth/oauth-client/Cargo.toml b/atrium-oauth/oauth-client/Cargo.toml index 99a0f3db..02596f59 100644 --- a/atrium-oauth/oauth-client/Cargo.toml +++ b/atrium-oauth/oauth-client/Cargo.toml @@ -15,6 +15,7 @@ keywords = ["atproto", "bluesky", "oauth"] [dependencies] atrium-api = { workspace = true, default-features = false } +atrium-common.workspace = true atrium-identity.workspace = true atrium-xrpc.workspace = true base64.workspace = true diff --git a/atrium-oauth/oauth-client/src/oauth_client.rs b/atrium-oauth/oauth-client/src/oauth_client.rs index ca1534a3..25e21b43 100644 --- a/atrium-oauth/oauth-client/src/oauth_client.rs +++ b/atrium-oauth/oauth-client/src/oauth_client.rs @@ -11,7 +11,8 @@ use crate::types::{ TryIntoOAuthClientMetadata, }; use crate::utils::{compare_algos, generate_key, generate_nonce, get_random_values}; -use atrium_identity::{did::DidResolver, handle::HandleResolver, Resolver}; +use atrium_common::resolver::Resolver; +use atrium_identity::{did::DidResolver, handle::HandleResolver}; use atrium_xrpc::HttpClient; use base64::engine::general_purpose::URL_SAFE_NO_PAD; use base64::Engine; diff --git a/atrium-oauth/oauth-client/src/resolver.rs b/atrium-oauth/oauth-client/src/resolver.rs index ad36e813..d75f7abe 100644 --- a/atrium-oauth/oauth-client/src/resolver.rs +++ b/atrium-oauth/oauth-client/src/resolver.rs @@ -1,3 +1,11 @@ +use atrium_common::resolver::CachedResolver; +use atrium_common::resolver::Resolver; +use atrium_common::resolver::ThrottledResolver; +use atrium_common::types::cached::r#impl::Cache; +use atrium_common::types::cached::r#impl::CacheImpl; +use atrium_common::types::cached::CacheConfig; +use atrium_common::types::cached::Cacheable; +use atrium_common::types::throttled::Throttleable; mod oauth_authorization_server_resolver; mod oauth_protected_resource_resolver; @@ -7,10 +15,7 @@ use crate::types::{OAuthAuthorizationServerMetadata, OAuthProtectedResourceMetad use atrium_identity::identity_resolver::{ IdentityResolver, IdentityResolverConfig, ResolvedIdentity, }; -use atrium_identity::resolver::{ - Cacheable, CachedResolver, CachedResolverConfig, Throttleable, ThrottledResolver, -}; -use atrium_identity::{did::DidResolver, handle::HandleResolver, Resolver}; +use atrium_identity::{did::DidResolver, handle::HandleResolver}; use atrium_identity::{Error, Result}; use atrium_xrpc::HttpClient; use std::marker::PhantomData; @@ -19,13 +24,13 @@ use std::time::Duration; #[derive(Clone, Debug)] pub struct OAuthAuthorizationServerMetadataResolverConfig { - pub cache: CachedResolverConfig, + pub cache: CacheConfig, } impl Default for OAuthAuthorizationServerMetadataResolverConfig { fn default() -> Self { Self { - cache: CachedResolverConfig { + cache: CacheConfig { max_capacity: Some(100), time_to_live: Some(Duration::from_secs(60)), }, @@ -35,13 +40,13 @@ impl Default for OAuthAuthorizationServerMetadataResolverConfig { #[derive(Clone, Debug)] pub struct OAuthProtectedResourceMetadataResolverConfig { - pub cache: CachedResolverConfig, + pub cache: CacheConfig, } impl Default for OAuthProtectedResourceMetadataResolverConfig { fn default() -> Self { Self { - cache: CachedResolverConfig { + cache: CacheConfig { max_capacity: Some(100), time_to_live: Some(Duration::from_secs(60)), }, @@ -81,11 +86,11 @@ where let protected_resource_resolver = DefaultOAuthProtectedResourceResolver::new(http_client.clone()) .throttled() - .cached(config.authorization_server_metadata.cache); + .cached(CacheImpl::new(config.authorization_server_metadata.cache)); let authorization_server_resolver = DefaultOAuthAuthorizationServerResolver::new(http_client.clone()) .throttled() - .cached(config.protected_resource_metadata.cache); + .cached(CacheImpl::new(config.protected_resource_metadata.cache)); Self { identity_resolver: IdentityResolver::new(IdentityResolverConfig { did_resolver: config.did_resolver, @@ -108,7 +113,9 @@ where &self, issuer: impl AsRef, ) -> Result { - self.authorization_server_resolver.resolve(&issuer.as_ref().to_string()).await + let result = + self.authorization_server_resolver.resolve(&issuer.as_ref().to_string()).await?; + result.ok_or_else(|| Error::NotFound) } async fn resolve_from_service(&self, input: &str) -> Result { // Assume first that input is a PDS URL (as required by ATPROTO) @@ -130,7 +137,8 @@ where &self, pds: &str, ) -> Result { - let rs_metadata = self.protected_resource_resolver.resolve(&pds.to_string()).await?; + let result = self.protected_resource_resolver.resolve(&pds.to_string()).await?; + let rs_metadata = result.ok_or_else(|| Error::NotFound)?; // ATPROTO requires one, and only one, authorization server entry // > That document MUST contain a single item in the authorization_servers array. // https://github.com/bluesky-social/proposals/tree/main/0004-oauth#server-metadata @@ -182,6 +190,7 @@ where { type Input = str; type Output = (OAuthAuthorizationServerMetadata, Option); + type Error = Error; async fn resolve(&self, input: &Self::Input) -> Result { // Allow using an entryway, or PDS url, directly as login input (e.g. diff --git a/atrium-oauth/oauth-client/src/resolver/oauth_authorization_server_resolver.rs b/atrium-oauth/oauth-client/src/resolver/oauth_authorization_server_resolver.rs index e38428fe..fd06f3a4 100644 --- a/atrium-oauth/oauth-client/src/resolver/oauth_authorization_server_resolver.rs +++ b/atrium-oauth/oauth-client/src/resolver/oauth_authorization_server_resolver.rs @@ -1,5 +1,6 @@ +use crate::resolver::Resolver; use crate::types::OAuthAuthorizationServerMetadata; -use atrium_identity::{Error, Resolver, Result}; +use atrium_identity::{Error, Result}; use atrium_xrpc::http::uri::Builder; use atrium_xrpc::http::{Request, StatusCode, Uri}; use atrium_xrpc::HttpClient; @@ -21,6 +22,7 @@ where { type Input = String; type Output = OAuthAuthorizationServerMetadata; + type Error = Error; async fn resolve(&self, issuer: &Self::Input) -> Result { let uri = Builder::from(issuer.parse::()?) diff --git a/atrium-oauth/oauth-client/src/resolver/oauth_protected_resource_resolver.rs b/atrium-oauth/oauth-client/src/resolver/oauth_protected_resource_resolver.rs index 98c2ea7a..9aecdfed 100644 --- a/atrium-oauth/oauth-client/src/resolver/oauth_protected_resource_resolver.rs +++ b/atrium-oauth/oauth-client/src/resolver/oauth_protected_resource_resolver.rs @@ -1,5 +1,6 @@ use crate::types::OAuthProtectedResourceMetadata; -use atrium_identity::{Error, Resolver, Result}; +use atrium_common::resolver::Resolver; +use atrium_identity::{Error, Result}; use atrium_xrpc::http::uri::Builder; use atrium_xrpc::http::{Request, StatusCode, Uri}; use atrium_xrpc::HttpClient; @@ -21,6 +22,7 @@ where { type Input = String; type Output = OAuthProtectedResourceMetadata; + type Error = Error; async fn resolve(&self, resource: &Self::Input) -> Result { let uri = Builder::from(resource.parse::()?) From 1a92b8a9bc1edde00ade3e381fa4f07fae5a84a4 Mon Sep 17 00:00:00 2001 From: Yoshihiro Sugi Date: Thu, 21 Nov 2024 16:14:35 +0900 Subject: [PATCH 7/8] feat: Update oauth_client (#254) * Update oauth_client * Update Dpop client, add parameters for refresh token --- Cargo.lock | 11 + atrium-oauth/oauth-client/Cargo.toml | 1 + atrium-oauth/oauth-client/examples/main.rs | 15 +- atrium-oauth/oauth-client/src/atproto.rs | 266 ++++++++++++++++-- .../oauth-client/src/http_client/dpop.rs | 69 +++-- atrium-oauth/oauth-client/src/lib.rs | 2 +- atrium-oauth/oauth-client/src/oauth_client.rs | 6 +- atrium-oauth/oauth-client/src/server_agent.rs | 14 +- atrium-oauth/oauth-client/src/types.rs | 14 +- .../oauth-client/src/types/request.rs | 10 + 10 files changed, 354 insertions(+), 54 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 5dd1b42c..0fde4d43 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -717,6 +717,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f55bf8e7b65898637379c1b74eb1551107c8294ed26d855ceb9fd1a09cfc9bc0" dependencies = [ "const-oid", + "pem-rfc7468", "zeroize", ] @@ -779,6 +780,7 @@ dependencies = [ "ff", "generic-array", "group", + "pem-rfc7468", "pkcs8", "rand_core", "sec1", @@ -1840,6 +1842,15 @@ dependencies = [ "windows-targets 0.52.6", ] +[[package]] +name = "pem-rfc7468" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "88b39c9bfcfc231068454382784bb460aae594343fb030d46e9f50a645418412" +dependencies = [ + "base64ct", +] + [[package]] name = "percent-encoding" version = "2.3.1" diff --git a/atrium-oauth/oauth-client/Cargo.toml b/atrium-oauth/oauth-client/Cargo.toml index 02596f59..8920ccfc 100644 --- a/atrium-oauth/oauth-client/Cargo.toml +++ b/atrium-oauth/oauth-client/Cargo.toml @@ -36,6 +36,7 @@ trait-variant.workspace = true [dev-dependencies] hickory-resolver.workspace = true +p256 = { workspace = true, features = ["pem"] } tokio = { workspace = true, features = ["macros", "rt-multi-thread"] } [features] diff --git a/atrium-oauth/oauth-client/examples/main.rs b/atrium-oauth/oauth-client/examples/main.rs index 40a91a9e..ee211fc4 100644 --- a/atrium-oauth/oauth-client/examples/main.rs +++ b/atrium-oauth/oauth-client/examples/main.rs @@ -2,8 +2,8 @@ use atrium_identity::did::{CommonDidResolver, CommonDidResolverConfig, DEFAULT_P use atrium_identity::handle::{AtprotoHandleResolver, AtprotoHandleResolverConfig, DnsTxtResolver}; use atrium_oauth_client::store::state::MemoryStateStore; use atrium_oauth_client::{ - AtprotoLocalhostClientMetadata, AuthorizeOptions, DefaultHttpClient, OAuthClient, - OAuthClientConfig, OAuthResolverConfig, + AtprotoLocalhostClientMetadata, AuthorizeOptions, DefaultHttpClient, KnownScope, OAuthClient, + OAuthClientConfig, OAuthResolverConfig, Scope, }; use atrium_xrpc::http::Uri; use hickory_resolver::TokioAsyncResolver; @@ -37,7 +37,11 @@ async fn main() -> Result<(), Box> { let http_client = Arc::new(DefaultHttpClient::default()); let config = OAuthClientConfig { client_metadata: AtprotoLocalhostClientMetadata { - redirect_uris: vec!["http://127.0.0.1".to_string()], + redirect_uris: Some(vec![String::from("http://127.0.0.1/callback")]), + scopes: Some(vec![ + Scope::Known(KnownScope::Atproto), + Scope::Known(KnownScope::TransitionGeneric), + ]), }, keys: None, resolver: OAuthResolverConfig { @@ -61,7 +65,10 @@ async fn main() -> Result<(), Box> { .authorize( std::env::var("HANDLE").unwrap_or(String::from("https://bsky.social")), AuthorizeOptions { - scopes: Some(vec![String::from("atproto")]), + scopes: vec![ + Scope::Known(KnownScope::Atproto), + Scope::Known(KnownScope::TransitionGeneric) + ], ..Default::default() } ) diff --git a/atrium-oauth/oauth-client/src/atproto.rs b/atrium-oauth/oauth-client/src/atproto.rs index 94bf4c56..ae23170f 100644 --- a/atrium-oauth/oauth-client/src/atproto.rs +++ b/atrium-oauth/oauth-client/src/atproto.rs @@ -1,6 +1,6 @@ use crate::keyset::Keyset; use crate::types::{OAuthClientMetadata, TryIntoOAuthClientMetadata}; -use atrium_xrpc::http::Uri; +use atrium_xrpc::http::uri::{InvalidUri, Scheme, Uri}; use serde::{Deserialize, Serialize}; use thiserror::Error; @@ -18,6 +18,22 @@ pub enum Error { EmptyJwks, #[error("`private_key_jwt` auth method requires `token_endpoint_auth_signing_alg`, otherwise must not be provided")] AuthSigningAlg, + #[error(transparent)] + SerdeHtmlForm(#[from] serde_html_form::ser::Error), + #[error(transparent)] + LocalhostClient(#[from] LocalhostClientError), +} + +#[derive(Error, Debug)] +pub enum LocalhostClientError { + #[error("invalid redirect_uri: {0}")] + Invalid(#[from] InvalidUri), + #[error("loopback client_id must use `http:` redirect_uri")] + NotHttpScheme, + #[error("loopback client_id must not use `localhost` as redirect_uri hostname")] + Localhost, + #[error("loopback client_id must not use loopback addresses as redirect_uri")] + NotLoopbackHost, } pub type Result = core::result::Result; @@ -56,22 +72,37 @@ impl From for String { } #[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)] -#[serde(rename_all = "snake_case")] +#[serde(untagged)] pub enum Scope { + Known(KnownScope), + Unknown(String), +} + +#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)] +pub enum KnownScope { + #[serde(rename = "atproto")] Atproto, + #[serde(rename = "transition:generic")] + TransitionGeneric, + #[serde(rename = "transition:chat.bsky")] + TransitionChatBsky, } -impl From for String { - fn from(value: Scope) -> Self { - match value { - Scope::Atproto => String::from("atproto"), +impl AsRef for Scope { + fn as_ref(&self) -> &str { + match self { + Self::Known(KnownScope::Atproto) => "atproto", + Self::Known(KnownScope::TransitionGeneric) => "transition:generic", + Self::Known(KnownScope::TransitionChatBsky) => "transition:chat.bsky", + Self::Unknown(value) => value, } } } #[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize, Default)] pub struct AtprotoLocalhostClientMetadata { - pub redirect_uris: Vec, + pub redirect_uris: Option>, + pub scopes: Option>, } #[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)] @@ -90,14 +121,46 @@ impl TryIntoOAuthClientMetadata for AtprotoLocalhostClientMetadata { type Error = Error; fn try_into_client_metadata(self, _: &Option) -> Result { - if self.redirect_uris.is_empty() { - return Err(Error::EmptyRedirectUris); + // validate redirect_uris + if let Some(redirect_uris) = &self.redirect_uris { + for redirect_uri in redirect_uris { + let uri = redirect_uri.parse::().map_err(LocalhostClientError::Invalid)?; + if uri.scheme() != Some(&Scheme::HTTP) { + return Err(Error::LocalhostClient(LocalhostClientError::NotHttpScheme)); + } + if uri.host() == Some("localhost") { + return Err(Error::LocalhostClient(LocalhostClientError::Localhost)); + } + if uri.host().map_or(true, |host| host != "127.0.0.1" && host != "[::1]") { + return Err(Error::LocalhostClient(LocalhostClientError::NotLoopbackHost)); + } + } + } + // determine client_id + #[derive(serde::Serialize)] + struct Parameters { + #[serde(skip_serializing_if = "Option::is_none")] + redirect_uri: Option>, + #[serde(skip_serializing_if = "Option::is_none")] + scope: Option, + } + let query = serde_html_form::to_string(Parameters { + redirect_uri: self.redirect_uris.clone(), + scope: self + .scopes + .map(|scopes| scopes.iter().map(AsRef::as_ref).collect::>().join(" ")), + })?; + let mut client_id = String::from("http://localhost"); + if !query.is_empty() { + client_id.push_str(&format!("?{query}")); } Ok(OAuthClientMetadata { - client_id: String::from("http://localhost"), + client_id, client_uri: None, - redirect_uris: self.redirect_uris, - scope: None, // will be set to `atproto` + redirect_uris: self + .redirect_uris + .unwrap_or(vec![String::from("http://127.0.0.1/"), String::from("http://[::1]/")]), + scope: None, grant_types: None, // will be set to `authorization_code` and `refresh_token` token_endpoint_auth_method: Some(String::from("none")), dpop_bound_access_tokens: None, // will be set to `true` @@ -121,7 +184,7 @@ impl TryIntoOAuthClientMetadata for AtprotoClientMetadata { if !self.grant_types.contains(&GrantType::AuthorizationCode) { return Err(Error::InvalidGrantTypes); } - if !self.scopes.contains(&Scope::Atproto) { + if !self.scopes.contains(&Scope::Known(KnownScope::Atproto)) { return Err(Error::InvalidScope); } let (jwks_uri, mut jwks) = (self.jwks_uri, None); @@ -150,9 +213,7 @@ impl TryIntoOAuthClientMetadata for AtprotoClientMetadata { redirect_uris: self.redirect_uris, token_endpoint_auth_method: Some(self.token_endpoint_auth_method.into()), grant_types: Some(self.grant_types.into_iter().map(|v| v.into()).collect()), - scope: Some( - self.scopes.into_iter().map(|v| v.into()).collect::>().join(" "), - ), + scope: Some(self.scopes.iter().map(AsRef::as_ref).collect::>().join(" ")), dpop_bound_access_tokens: Some(true), jwks_uri, jwks, @@ -160,3 +221,176 @@ impl TryIntoOAuthClientMetadata for AtprotoClientMetadata { }) } } + +#[cfg(test)] +mod tests { + use super::*; + use elliptic_curve::SecretKey; + use jose_jwk::{Jwk, Key, Parameters}; + use p256::pkcs8::DecodePrivateKey; + + const PRIVATE_KEY: &str = r#"-----BEGIN PRIVATE KEY----- +MIGHAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBG0wawIBAQQgED1AAgC7Fc9kPh5T +4i4Tn+z+tc47W1zYgzXtyjJtD92hRANCAAT80DqC+Z/JpTO7/pkPBmWqIV1IGh1P +gbGGr0pN+oSing7cZ0169JaRHTNh+0LNQXrFobInX6cj95FzEdRyT4T3 +-----END PRIVATE KEY-----"#; + + #[test] + fn test_localhost_client_metadata_default() { + let metadata = AtprotoLocalhostClientMetadata::default(); + assert_eq!( + metadata.try_into_client_metadata(&None).expect("failed to convert metadata"), + OAuthClientMetadata { + client_id: String::from("http://localhost"), + client_uri: None, + redirect_uris: vec![ + String::from("http://127.0.0.1/"), + String::from("http://[::1]/"), + ], + scope: None, + grant_types: None, + token_endpoint_auth_method: Some(AuthMethod::None.into()), + dpop_bound_access_tokens: None, + jwks_uri: None, + jwks: None, + token_endpoint_auth_signing_alg: None, + } + ); + } + + #[test] + fn test_localhost_client_metadata_custom() { + let metadata = AtprotoLocalhostClientMetadata { + redirect_uris: Some(vec![ + String::from("http://127.0.0.1/callback"), + String::from("http://[::1]/callback"), + ]), + scopes: Some(vec![ + Scope::Known(KnownScope::Atproto), + Scope::Known(KnownScope::TransitionGeneric), + Scope::Unknown(String::from("unknown")), + ]), + }; + assert_eq!( + metadata.try_into_client_metadata(&None).expect("failed to convert metadata"), + OAuthClientMetadata { + client_id: String::from("http://localhost?redirect_uri=http%3A%2F%2F127.0.0.1%2Fcallback&redirect_uri=http%3A%2F%2F%5B%3A%3A1%5D%2Fcallback&scope=atproto+transition%3Ageneric+unknown"), + client_uri: None, + redirect_uris: vec![ + String::from("http://127.0.0.1/callback"), + String::from("http://[::1]/callback"), + ], + scope: None, + grant_types: None, + token_endpoint_auth_method: Some(AuthMethod::None.into()), + dpop_bound_access_tokens: None, + jwks_uri: None, + jwks: None, + token_endpoint_auth_signing_alg: None, + } + ); + } + + #[test] + fn test_localhost_client_metadata_invalid() { + { + let metadata = AtprotoLocalhostClientMetadata { + redirect_uris: Some(vec![String::from("http://")]), + ..Default::default() + }; + let err = metadata.try_into_client_metadata(&None).expect_err("expected to fail"); + assert!(matches!(err, Error::LocalhostClient(LocalhostClientError::Invalid(_)))); + } + { + let metadata = AtprotoLocalhostClientMetadata { + redirect_uris: Some(vec![String::from("https://127.0.0.1/")]), + ..Default::default() + }; + let err = metadata.try_into_client_metadata(&None).expect_err("expected to fail"); + assert!(matches!(err, Error::LocalhostClient(LocalhostClientError::NotHttpScheme))); + } + { + let metadata = AtprotoLocalhostClientMetadata { + redirect_uris: Some(vec![String::from("http://localhost:8000/")]), + ..Default::default() + }; + let err = metadata.try_into_client_metadata(&None).expect_err("expected to fail"); + assert!(matches!(err, Error::LocalhostClient(LocalhostClientError::Localhost))); + } + { + let metadata = AtprotoLocalhostClientMetadata { + redirect_uris: Some(vec![String::from("http://192.168.0.0/")]), + ..Default::default() + }; + let err = metadata.try_into_client_metadata(&None).expect_err("expected to fail"); + assert!(matches!(err, Error::LocalhostClient(LocalhostClientError::NotLoopbackHost))); + } + } + + #[test] + fn test_client_metadata() { + let metadata = AtprotoClientMetadata { + client_id: String::from("https://example.com/client_metadata.json"), + client_uri: String::from("https://example.com"), + redirect_uris: vec![String::from("https://example.com/callback")], + token_endpoint_auth_method: AuthMethod::PrivateKeyJwt, + grant_types: vec![GrantType::AuthorizationCode], + scopes: vec![Scope::Known(KnownScope::Atproto)], + jwks_uri: None, + token_endpoint_auth_signing_alg: Some(String::from("ES256")), + }; + { + let metadata = metadata.clone(); + let err = metadata.try_into_client_metadata(&None).expect_err("expected to fail"); + assert!(matches!(err, Error::EmptyJwks)); + } + { + let metadata = metadata.clone(); + let secret_key = SecretKey::::from_pkcs8_pem(PRIVATE_KEY) + .expect("failed to parse private key"); + let keys = vec![Jwk { + key: Key::from(&secret_key.into()), + prm: Parameters { kid: Some(String::from("kid00")), ..Default::default() }, + }]; + let keyset = Keyset::try_from(keys.clone()).expect("failed to create keyset"); + assert_eq!( + metadata + .try_into_client_metadata(&Some(keyset.clone())) + .expect("failed to convert metadata"), + OAuthClientMetadata { + client_id: String::from("https://example.com/client_metadata.json"), + client_uri: Some(String::from("https://example.com")), + redirect_uris: vec![String::from("https://example.com/callback"),], + scope: Some(String::from("atproto")), + grant_types: Some(vec![String::from("authorization_code")]), + token_endpoint_auth_method: Some(AuthMethod::PrivateKeyJwt.into()), + dpop_bound_access_tokens: Some(true), + jwks_uri: None, + jwks: Some(keyset.public_jwks()), + token_endpoint_auth_signing_alg: Some(String::from("ES256")), + } + ); + } + } + + #[test] + fn test_scope_serde() { + #[derive(Debug, PartialEq, Eq, Serialize, Deserialize)] + struct Scopes { + scopes: Vec, + } + + let scopes = Scopes { + scopes: vec![ + Scope::Known(KnownScope::Atproto), + Scope::Known(KnownScope::TransitionGeneric), + Scope::Unknown(String::from("unknown")), + ], + }; + let json = serde_json::to_string(&scopes).expect("failed to serialize scopes"); + assert_eq!(json, r#"{"scopes":["atproto","transition:generic","unknown"]}"#); + let deserialized = + serde_json::from_str::(&json).expect("failed to deserialize scopes"); + assert_eq!(deserialized, scopes); + } +} diff --git a/atrium-oauth/oauth-client/src/http_client/dpop.rs b/atrium-oauth/oauth-client/src/http_client/dpop.rs index 489fc3e8..b92fd621 100644 --- a/atrium-oauth/oauth-client/src/http_client/dpop.rs +++ b/atrium-oauth/oauth-client/src/http_client/dpop.rs @@ -13,6 +13,7 @@ use jose_jwk::{crypto, EcCurves, Jwk, Key}; use rand::rngs::SmallRng; use rand::{RngCore, SeedableRng}; use serde::Deserialize; +use sha2::{Digest, Sha256}; use std::sync::Arc; use thiserror::Error; @@ -40,17 +41,16 @@ where S: SimpleStore, { inner: Arc, - key: Key, - #[allow(dead_code)] - iss: String, + pub(crate) key: Key, nonces: S, + is_auth_server: bool, } impl DpopClient { pub fn new( key: Key, - iss: String, http_client: Arc, + is_auth_server: bool, supported_algs: &Option>, ) -> Result { if let Some(algs) = supported_algs { @@ -66,9 +66,21 @@ impl DpopClient { } } let nonces = MemorySimpleStore::::default(); - Ok(Self { inner: http_client, key, iss, nonces }) + Ok(Self { inner: http_client, key, nonces, is_auth_server }) } - fn build_proof(&self, htm: String, htu: String, nonce: Option) -> Result { +} + +impl DpopClient +where + S: SimpleStore, +{ + fn build_proof( + &self, + htm: String, + htu: String, + ath: Option, + nonce: Option, + ) -> Result { match crypto::Key::try_from(&self.key).map_err(Error::JwkCrypto)? { crypto::Key::P256(crypto::Kind::Secret(secret_key)) => { let mut header = RegisteredHeader::from(Algorithm::Signing(Signing::Es256)); @@ -83,12 +95,7 @@ impl DpopClient { iat: Some(Utc::now().timestamp()), ..Default::default() }, - public: PublicClaims { - htm: Some(htm), - htu: Some(htu), - nonce, - ..Default::default() - }, + public: PublicClaims { htm: Some(htm), htu: Some(htu), ath, nonce }, }; Ok(create_signed_jwt(secret_key.into(), header.into(), claims)?) } @@ -96,14 +103,24 @@ impl DpopClient { } } fn is_use_dpop_nonce_error(&self, response: &Response>) -> bool { - // is auth server? - if response.status() == 400 { - if let Ok(res) = serde_json::from_slice::(response.body()) { - return res.error == "use_dpop_nonce"; - }; + // https://datatracker.ietf.org/doc/html/rfc9449#name-authorization-server-provid + if self.is_auth_server { + if response.status() == 400 { + if let Ok(res) = serde_json::from_slice::(response.body()) { + return res.error == "use_dpop_nonce"; + }; + } + } + // https://datatracker.ietf.org/doc/html/rfc6750#section-3 + // https://datatracker.ietf.org/doc/html/rfc9449#name-resource-server-provided-no + else if response.status() == 401 { + if let Some(www_auth) = + response.headers().get("WWW-Authenticate").and_then(|v| v.to_str().ok()) + { + return www_auth.starts_with("DPoP") + && www_auth.contains(r#"error="use_dpop_nonce""#); + } } - // is resource server? - false } // https://datatracker.ietf.org/doc/html/rfc9449#section-4.2 @@ -115,9 +132,10 @@ impl DpopClient { } } -impl HttpClient for DpopClient +impl HttpClient for DpopClient where T: HttpClient + Send + Sync + 'static, + S: SimpleStore + Send + Sync + 'static, { async fn send_http( &self, @@ -128,9 +146,16 @@ where let nonce_key = uri.authority().unwrap().to_string(); let htm = request.method().to_string(); let htu = uri.to_string(); + // https://datatracker.ietf.org/doc/html/rfc9449#section-4.2 + let ath = request + .headers() + .get("Authorization") + .filter(|v| v.to_str().map_or(false, |s| s.starts_with("DPoP "))) + .map(|auth| URL_SAFE_NO_PAD.encode(Sha256::digest(&auth.as_bytes()[5..]))); let init_nonce = self.nonces.get(&nonce_key).await?; - let init_proof = self.build_proof(htm.clone(), htu.clone(), init_nonce.clone())?; + let init_proof = + self.build_proof(htm.clone(), htu.clone(), ath.clone(), init_nonce.clone())?; request.headers_mut().insert("DPoP", init_proof.parse()?); let response = self.inner.send_http(request.clone()).await?; @@ -151,7 +176,7 @@ where if !self.is_use_dpop_nonce_error(&response) { return Ok(response); } - let next_proof = self.build_proof(htm, htu, next_nonce)?; + let next_proof = self.build_proof(htm, htu, ath, next_nonce)?; request.headers_mut().insert("DPoP", next_proof.parse()?); let response = self.inner.send_http(request).await?; Ok(response) diff --git a/atrium-oauth/oauth-client/src/lib.rs b/atrium-oauth/oauth-client/src/lib.rs index d9a7f071..06071dc7 100644 --- a/atrium-oauth/oauth-client/src/lib.rs +++ b/atrium-oauth/oauth-client/src/lib.rs @@ -12,7 +12,7 @@ mod types; mod utils; pub use atproto::{ - AtprotoClientMetadata, AtprotoLocalhostClientMetadata, AuthMethod, GrantType, Scope, + AtprotoClientMetadata, AtprotoLocalhostClientMetadata, AuthMethod, GrantType, KnownScope, Scope, }; pub use error::{Error, Result}; #[cfg(feature = "default-client")] diff --git a/atrium-oauth/oauth-client/src/oauth_client.rs b/atrium-oauth/oauth-client/src/oauth_client.rs index 25e21b43..e844f00a 100644 --- a/atrium-oauth/oauth-client/src/oauth_client.rs +++ b/atrium-oauth/oauth-client/src/oauth_client.rs @@ -166,7 +166,7 @@ where response_type: AuthorizationResponseType::Code, redirect_uri, state, - scope: options.scopes.map(|v| v.join(" ")), + scope: Some(options.scopes.iter().map(AsRef::as_ref).collect::>().join(" ")), response_mode: None, code_challenge, code_challenge_method: AuthorizationCodeChallengeMethod::S256, @@ -256,8 +256,6 @@ where // https://datatracker.ietf.org/doc/html/rfc7636#section-4.1 let verifier = URL_SAFE_NO_PAD.encode(get_random_values::<_, 32>(&mut ThreadRng::default())); - let mut hasher = Sha256::new(); - hasher.update(verifier.as_bytes()); - (URL_SAFE_NO_PAD.encode(Sha256::digest(verifier.as_bytes())), verifier) + (URL_SAFE_NO_PAD.encode(Sha256::digest(&verifier)), verifier) } } diff --git a/atrium-oauth/oauth-client/src/server_agent.rs b/atrium-oauth/oauth-client/src/server_agent.rs index 2a05beff..c9d556f3 100644 --- a/atrium-oauth/oauth-client/src/server_agent.rs +++ b/atrium-oauth/oauth-client/src/server_agent.rs @@ -5,7 +5,8 @@ use crate::keyset::Keyset; use crate::resolver::OAuthResolver; use crate::types::{ OAuthAuthorizationServerMetadata, OAuthClientMetadata, OAuthTokenResponse, - PushedAuthorizationRequestParameters, TokenGrantType, TokenRequestParameters, TokenSet, + PushedAuthorizationRequestParameters, RefreshRequestParameters, TokenGrantType, + TokenRequestParameters, TokenSet, }; use crate::utils::{compare_algos, generate_nonce}; use atrium_api::types::string::Datetime; @@ -56,6 +57,7 @@ pub type Result = core::result::Result; #[allow(dead_code)] pub enum OAuthRequest { Token(TokenRequestParameters), + Refresh(RefreshRequestParameters), Revocation, Introspection, PushedAuthorizationRequest(PushedAuthorizationRequestParameters), @@ -65,6 +67,7 @@ impl OAuthRequest { fn name(&self) -> String { String::from(match self { Self::Token(_) => "token", + Self::Refresh(_) => "refresh", Self::Revocation => "revocation", Self::Introspection => "introspection", Self::PushedAuthorizationRequest(_) => "pushed_authorization_request", @@ -72,7 +75,7 @@ impl OAuthRequest { } fn expected_status(&self) -> StatusCode { match self { - Self::Token(_) => StatusCode::OK, + Self::Token(_) | Self::Refresh(_) => StatusCode::OK, Self::PushedAuthorizationRequest(_) => StatusCode::CREATED, _ => unimplemented!(), } @@ -120,8 +123,8 @@ where ) -> Result { let dpop_client = DpopClient::new( dpop_key, - client_metadata.client_id.clone(), http_client, + true, &server_metadata.token_endpoint_auth_signing_alg_values_supported, )?; Ok(Self { server_metadata, client_metadata, dpop_client, resolver, keyset }) @@ -181,6 +184,7 @@ where }; let body = match &request { OAuthRequest::Token(params) => self.build_body(params)?, + OAuthRequest::Refresh(params) => self.build_body(params)?, OAuthRequest::PushedAuthorizationRequest(params) => self.build_body(params)?, _ => unimplemented!(), }; @@ -266,7 +270,9 @@ where } fn endpoint(&self, request: &OAuthRequest) -> Option<&String> { match request { - OAuthRequest::Token(_) => Some(&self.server_metadata.token_endpoint), + OAuthRequest::Token(_) | OAuthRequest::Refresh(_) => { + Some(&self.server_metadata.token_endpoint) + } OAuthRequest::Revocation => self.server_metadata.revocation_endpoint.as_ref(), OAuthRequest::Introspection => self.server_metadata.introspection_endpoint.as_ref(), OAuthRequest::PushedAuthorizationRequest(_) => { diff --git a/atrium-oauth/oauth-client/src/types.rs b/atrium-oauth/oauth-client/src/types.rs index 45ef9bdb..a5712674 100644 --- a/atrium-oauth/oauth-client/src/types.rs +++ b/atrium-oauth/oauth-client/src/types.rs @@ -4,11 +4,13 @@ mod request; mod response; mod token; +use crate::atproto::{KnownScope, Scope}; pub use client_metadata::{OAuthClientMetadata, TryIntoOAuthClientMetadata}; pub use metadata::{OAuthAuthorizationServerMetadata, OAuthProtectedResourceMetadata}; pub use request::{ AuthorizationCodeChallengeMethod, AuthorizationResponseType, - PushedAuthorizationRequestParameters, TokenGrantType, TokenRequestParameters, + PushedAuthorizationRequestParameters, RefreshRequestParameters, TokenGrantType, + TokenRequestParameters, }; pub use response::{OAuthPusehedAuthorizationRequestResponse, OAuthTokenResponse}; use serde::Deserialize; @@ -36,13 +38,19 @@ impl From for String { #[derive(Debug, Deserialize)] pub struct AuthorizeOptions { pub redirect_uri: Option, - pub scopes: Option>, // TODO: enum? + pub scopes: Vec, pub prompt: Option, + pub state: Option, } impl Default for AuthorizeOptions { fn default() -> Self { - Self { redirect_uri: None, scopes: Some(vec![String::from("atproto")]), prompt: None } + Self { + redirect_uri: None, + scopes: vec![Scope::Known(KnownScope::Atproto)], + prompt: None, + state: None, + } } } diff --git a/atrium-oauth/oauth-client/src/types/request.rs b/atrium-oauth/oauth-client/src/types/request.rs index a5b71474..d8d352e6 100644 --- a/atrium-oauth/oauth-client/src/types/request.rs +++ b/atrium-oauth/oauth-client/src/types/request.rs @@ -49,6 +49,8 @@ pub struct PushedAuthorizationRequestParameters { #[serde(rename_all = "snake_case")] pub enum TokenGrantType { AuthorizationCode, + #[allow(dead_code)] + RefreshToken, } #[derive(Serialize)] @@ -60,3 +62,11 @@ pub struct TokenRequestParameters { // https://datatracker.ietf.org/doc/html/rfc7636#section-4.5 pub code_verifier: String, } + +#[derive(Serialize)] +pub struct RefreshRequestParameters { + // https://datatracker.ietf.org/doc/html/rfc6749#section-6 + pub grant_type: TokenGrantType, + pub refresh_token: String, + pub scope: Option, +} From 22c959058ba4f62c7645382a445a31affbced12d Mon Sep 17 00:00:00 2001 From: sugyan Date: Thu, 21 Nov 2024 16:19:29 +0900 Subject: [PATCH 8/8] chore: Update Cargo.lock --- Cargo.lock | 26 ++++++++++++++++++-------- 1 file changed, 18 insertions(+), 8 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 0fde4d43..8e901706 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -199,6 +199,22 @@ dependencies = [ "wasm-bindgen-test", ] +[[package]] +name = "atrium-common" +version = "0.1.0" +dependencies = [ + "dashmap", + "futures", + "gloo-timers", + "lru", + "moka", + "thiserror", + "tokio", + "trait-variant", + "wasm-bindgen-test", + "web-time", +] + [[package]] name = "atrium-crypto" version = "0.1.2" @@ -219,21 +235,14 @@ name = "atrium-identity" version = "0.1.0" dependencies = [ "atrium-api", + "atrium-common", "atrium-xrpc", - "dashmap", - "futures", - "gloo-timers", "hickory-proto", - "lru", - "moka", "serde", "serde_html_form", "serde_json", "thiserror", - "tokio", "trait-variant", - "wasm-bindgen-test", - "web-time", ] [[package]] @@ -241,6 +250,7 @@ name = "atrium-oauth-client" version = "0.1.0" dependencies = [ "atrium-api", + "atrium-common", "atrium-identity", "atrium-xrpc", "base64",