A better Rust ATProto crate
103
fork

Configure Feed

Select the types of activity you want to include in your feed.

bunch of useful helpers, further codegen updates, examples, and bug fixes.

Orual 5b4be56f c08fa921

+8769 -264
-1
Cargo.lock
··· 1851 1851 "miette", 1852 1852 "multibase", 1853 1853 "multihash", 1854 - "num-traits", 1855 1854 "ouroboros", 1856 1855 "p256", 1857 1856 "rand 0.9.2",
+1 -1
README.md
··· 94 94 - `jacquard-oauth`: atproto OAuth implementation [![Crates.io](https://img.shields.io/crates/v/jacquard-oauth.svg)](https://crates.io/crates/jacquard-oauth) [![Documentation](https://docs.rs/jacquard-oauth/badge.svg)](https://docs.rs/jacquard-oauth) 95 95 - `jacquard-identity`: Identity resolution [![Crates.io](https://img.shields.io/crates/v/jacquard-identity.svg)](https://crates.io/crates/jacquard-identity) [![Documentation](https://docs.rs/jacquard-identity/badge.svg)](https://docs.rs/jacquard-identity) 96 96 - `jacquard-lexicon`: Lexicon parsing and code generation [![Crates.io](https://img.shields.io/crates/v/jacquard-lexicon.svg)](https://crates.io/crates/jacquard-lexicon) [![Documentation](https://docs.rs/jacquard-lexicon/badge.svg)](https://docs.rs/jacquard-lexicon) 97 - - `jacquard-derive`: Derive macros for lexicon types [![Crates.io](https://img.shields.io/crates/v/jacquard-derive.svg)](https://crates.io/crates/jacquard-derive) [![Documentation](https://docs.rs/jacquard-derive/badge.svg)](https://docs.rs/jacquard-derive) 97 + - `jacquard-derive`: Macros for lexicon types [![Crates.io](https://img.shields.io/crates/v/jacquard-derive.svg)](https://crates.io/crates/jacquard-derive) [![Documentation](https://docs.rs/jacquard-derive/badge.svg)](https://docs.rs/jacquard-derive) 98 98 99 99 ## Changelog 100 100
+38
crates/jacquard-api/src/app_blebbit/authr/folder/record.rs
··· 27 27 pub public: std::option::Option<bool>, 28 28 } 29 29 30 + /// Typed wrapper for GetRecord response with this collection's record type. 31 + #[derive( 32 + serde::Serialize, 33 + serde::Deserialize, 34 + Debug, 35 + Clone, 36 + PartialEq, 37 + Eq, 38 + jacquard_derive::IntoStatic 39 + )] 40 + #[serde(rename_all = "camelCase")] 41 + pub struct RecordGetRecordOutput<'a> { 42 + #[serde(skip_serializing_if = "std::option::Option::is_none")] 43 + #[serde(borrow)] 44 + pub cid: std::option::Option<jacquard_common::types::string::Cid<'a>>, 45 + #[serde(borrow)] 46 + pub uri: jacquard_common::types::string::AtUri<'a>, 47 + #[serde(borrow)] 48 + pub value: Record<'a>, 49 + } 50 + 51 + /// Marker type for deserializing records from this collection. 52 + pub struct RecordRecord; 53 + impl jacquard_common::xrpc::XrpcResp for RecordRecord { 54 + const NSID: &'static str = "app.blebbit.authr.folder.record"; 55 + const ENCODING: &'static str = "application/json"; 56 + type Output<'de> = RecordGetRecordOutput<'de>; 57 + type Err<'de> = jacquard_common::types::collection::RecordError<'de>; 58 + } 59 + 30 60 impl jacquard_common::types::collection::Collection for Record<'_> { 31 61 const NSID: &'static str = "app.blebbit.authr.folder.record"; 62 + type Record = RecordRecord; 63 + } 64 + 65 + impl From<RecordGetRecordOutput<'_>> for Record<'static> { 66 + fn from(output: RecordGetRecordOutput<'_>) -> Self { 67 + use jacquard_common::IntoStatic; 68 + output.value.into_static() 69 + } 32 70 }
+38
crates/jacquard-api/src/app_blebbit/authr/group/record.rs
··· 33 33 pub public: std::option::Option<bool>, 34 34 } 35 35 36 + /// Typed wrapper for GetRecord response with this collection's record type. 37 + #[derive( 38 + serde::Serialize, 39 + serde::Deserialize, 40 + Debug, 41 + Clone, 42 + PartialEq, 43 + Eq, 44 + jacquard_derive::IntoStatic 45 + )] 46 + #[serde(rename_all = "camelCase")] 47 + pub struct RecordGetRecordOutput<'a> { 48 + #[serde(skip_serializing_if = "std::option::Option::is_none")] 49 + #[serde(borrow)] 50 + pub cid: std::option::Option<jacquard_common::types::string::Cid<'a>>, 51 + #[serde(borrow)] 52 + pub uri: jacquard_common::types::string::AtUri<'a>, 53 + #[serde(borrow)] 54 + pub value: Record<'a>, 55 + } 56 + 57 + /// Marker type for deserializing records from this collection. 58 + pub struct RecordRecord; 59 + impl jacquard_common::xrpc::XrpcResp for RecordRecord { 60 + const NSID: &'static str = "app.blebbit.authr.group.record"; 61 + const ENCODING: &'static str = "application/json"; 62 + type Output<'de> = RecordGetRecordOutput<'de>; 63 + type Err<'de> = jacquard_common::types::collection::RecordError<'de>; 64 + } 65 + 36 66 impl jacquard_common::types::collection::Collection for Record<'_> { 37 67 const NSID: &'static str = "app.blebbit.authr.group.record"; 68 + type Record = RecordRecord; 69 + } 70 + 71 + impl From<RecordGetRecordOutput<'_>> for Record<'static> { 72 + fn from(output: RecordGetRecordOutput<'_>) -> Self { 73 + use jacquard_common::IntoStatic; 74 + output.value.into_static() 75 + } 38 76 }
+38
crates/jacquard-api/src/app_blebbit/authr/page/record.rs
··· 30 30 pub public: std::option::Option<bool>, 31 31 } 32 32 33 + /// Typed wrapper for GetRecord response with this collection's record type. 34 + #[derive( 35 + serde::Serialize, 36 + serde::Deserialize, 37 + Debug, 38 + Clone, 39 + PartialEq, 40 + Eq, 41 + jacquard_derive::IntoStatic 42 + )] 43 + #[serde(rename_all = "camelCase")] 44 + pub struct RecordGetRecordOutput<'a> { 45 + #[serde(skip_serializing_if = "std::option::Option::is_none")] 46 + #[serde(borrow)] 47 + pub cid: std::option::Option<jacquard_common::types::string::Cid<'a>>, 48 + #[serde(borrow)] 49 + pub uri: jacquard_common::types::string::AtUri<'a>, 50 + #[serde(borrow)] 51 + pub value: Record<'a>, 52 + } 53 + 54 + /// Marker type for deserializing records from this collection. 55 + pub struct RecordRecord; 56 + impl jacquard_common::xrpc::XrpcResp for RecordRecord { 57 + const NSID: &'static str = "app.blebbit.authr.page.record"; 58 + const ENCODING: &'static str = "application/json"; 59 + type Output<'de> = RecordGetRecordOutput<'de>; 60 + type Err<'de> = jacquard_common::types::collection::RecordError<'de>; 61 + } 62 + 33 63 impl jacquard_common::types::collection::Collection for Record<'_> { 34 64 const NSID: &'static str = "app.blebbit.authr.page.record"; 65 + type Record = RecordRecord; 66 + } 67 + 68 + impl From<RecordGetRecordOutput<'_>> for Record<'static> { 69 + fn from(output: RecordGetRecordOutput<'_>) -> Self { 70 + use jacquard_common::IntoStatic; 71 + output.value.into_static() 72 + } 35 73 }
+38
crates/jacquard-api/src/app_bsky/actor/profile.rs
··· 58 58 pub website: std::option::Option<jacquard_common::types::string::Uri<'a>>, 59 59 } 60 60 61 + /// Typed wrapper for GetRecord response with this collection's record type. 62 + #[derive( 63 + serde::Serialize, 64 + serde::Deserialize, 65 + Debug, 66 + Clone, 67 + PartialEq, 68 + Eq, 69 + jacquard_derive::IntoStatic 70 + )] 71 + #[serde(rename_all = "camelCase")] 72 + pub struct ProfileGetRecordOutput<'a> { 73 + #[serde(skip_serializing_if = "std::option::Option::is_none")] 74 + #[serde(borrow)] 75 + pub cid: std::option::Option<jacquard_common::types::string::Cid<'a>>, 76 + #[serde(borrow)] 77 + pub uri: jacquard_common::types::string::AtUri<'a>, 78 + #[serde(borrow)] 79 + pub value: Profile<'a>, 80 + } 81 + 82 + /// Marker type for deserializing records from this collection. 83 + pub struct ProfileRecord; 84 + impl jacquard_common::xrpc::XrpcResp for ProfileRecord { 85 + const NSID: &'static str = "app.bsky.actor.profile"; 86 + const ENCODING: &'static str = "application/json"; 87 + type Output<'de> = ProfileGetRecordOutput<'de>; 88 + type Err<'de> = jacquard_common::types::collection::RecordError<'de>; 89 + } 90 + 61 91 impl jacquard_common::types::collection::Collection for Profile<'_> { 62 92 const NSID: &'static str = "app.bsky.actor.profile"; 93 + type Record = ProfileRecord; 94 + } 95 + 96 + impl From<ProfileGetRecordOutput<'_>> for Profile<'static> { 97 + fn from(output: ProfileGetRecordOutput<'_>) -> Self { 98 + use jacquard_common::IntoStatic; 99 + output.value.into_static() 100 + } 63 101 }
+38
crates/jacquard-api/src/app_bsky/actor/status.rs
··· 49 49 pub status: jacquard_common::CowStr<'a>, 50 50 } 51 51 52 + /// Typed wrapper for GetRecord response with this collection's record type. 53 + #[derive( 54 + serde::Serialize, 55 + serde::Deserialize, 56 + Debug, 57 + Clone, 58 + PartialEq, 59 + Eq, 60 + jacquard_derive::IntoStatic 61 + )] 62 + #[serde(rename_all = "camelCase")] 63 + pub struct StatusGetRecordOutput<'a> { 64 + #[serde(skip_serializing_if = "std::option::Option::is_none")] 65 + #[serde(borrow)] 66 + pub cid: std::option::Option<jacquard_common::types::string::Cid<'a>>, 67 + #[serde(borrow)] 68 + pub uri: jacquard_common::types::string::AtUri<'a>, 69 + #[serde(borrow)] 70 + pub value: Status<'a>, 71 + } 72 + 73 + /// Marker type for deserializing records from this collection. 74 + pub struct StatusRecord; 75 + impl jacquard_common::xrpc::XrpcResp for StatusRecord { 76 + const NSID: &'static str = "app.bsky.actor.status"; 77 + const ENCODING: &'static str = "application/json"; 78 + type Output<'de> = StatusGetRecordOutput<'de>; 79 + type Err<'de> = jacquard_common::types::collection::RecordError<'de>; 80 + } 81 + 52 82 impl jacquard_common::types::collection::Collection for Status<'_> { 53 83 const NSID: &'static str = "app.bsky.actor.status"; 84 + type Record = StatusRecord; 85 + } 86 + 87 + impl From<StatusGetRecordOutput<'_>> for Status<'static> { 88 + fn from(output: StatusGetRecordOutput<'_>) -> Self { 89 + use jacquard_common::IntoStatic; 90 + output.value.into_static() 91 + } 54 92 }
+35 -11
crates/jacquard-api/src/app_bsky/feed/generator.rs
··· 8 8 ///Record declaring of the existence of a feed generator, and containing metadata about it. The record can exist in any repository. 9 9 #[jacquard_derive::lexicon] 10 10 #[derive( 11 - serde::Serialize, 12 - serde::Deserialize, 13 - Debug, 14 - Clone, 15 - PartialEq, 16 - Eq, 17 - jacquard_derive::IntoStatic 11 + serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq, jacquard_derive::IntoStatic, 18 12 )] 19 13 #[serde(rename_all = "camelCase")] 20 14 pub struct Generator<'a> { ··· 33 27 pub description: std::option::Option<jacquard_common::CowStr<'a>>, 34 28 #[serde(skip_serializing_if = "std::option::Option::is_none")] 35 29 #[serde(borrow)] 36 - pub description_facets: std::option::Option< 37 - Vec<crate::app_bsky::richtext::facet::Facet<'a>>, 38 - >, 30 + pub description_facets: std::option::Option<Vec<crate::app_bsky::richtext::facet::Facet<'a>>>, 39 31 #[serde(borrow)] 40 32 pub did: jacquard_common::types::string::Did<'a>, 41 33 #[serde(borrow)] ··· 46 38 pub labels: std::option::Option<crate::com_atproto::label::SelfLabels<'a>>, 47 39 } 48 40 41 + /// Typed wrapper for GetRecord response with this collection's record type. 42 + #[derive( 43 + serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq, jacquard_derive::IntoStatic, 44 + )] 45 + #[serde(rename_all = "camelCase")] 46 + pub struct GeneratorGetRecordOutput<'a> { 47 + #[serde(skip_serializing_if = "std::option::Option::is_none")] 48 + #[serde(borrow)] 49 + pub cid: std::option::Option<jacquard_common::types::string::Cid<'a>>, 50 + #[serde(borrow)] 51 + pub uri: jacquard_common::types::string::AtUri<'a>, 52 + #[serde(borrow)] 53 + pub value: Generator<'a>, 54 + } 55 + 56 + /// Marker type for deserializing records from this collection. 57 + pub struct GeneratorRecord; 58 + impl jacquard_common::xrpc::XrpcResp for GeneratorRecord { 59 + const NSID: &'static str = "app.bsky.feed.generator"; 60 + const ENCODING: &'static str = "application/json"; 61 + type Output<'de> = GeneratorGetRecordOutput<'de>; 62 + type Err<'de> = jacquard_common::types::collection::RecordError<'de>; 63 + } 64 + 49 65 impl jacquard_common::types::collection::Collection for Generator<'_> { 50 66 const NSID: &'static str = "app.bsky.feed.generator"; 51 - } 67 + type Record = GeneratorRecord; 68 + } 69 + 70 + impl From<GeneratorGetRecordOutput<'_>> for Generator<'static> { 71 + fn from(output: GeneratorGetRecordOutput<'_>) -> Self { 72 + use jacquard_common::IntoStatic; 73 + output.value.into_static() 74 + } 75 + }
+38
crates/jacquard-api/src/app_bsky/feed/like.rs
··· 26 26 pub via: std::option::Option<crate::com_atproto::repo::strong_ref::StrongRef<'a>>, 27 27 } 28 28 29 + /// Typed wrapper for GetRecord response with this collection's record type. 30 + #[derive( 31 + serde::Serialize, 32 + serde::Deserialize, 33 + Debug, 34 + Clone, 35 + PartialEq, 36 + Eq, 37 + jacquard_derive::IntoStatic 38 + )] 39 + #[serde(rename_all = "camelCase")] 40 + pub struct LikeGetRecordOutput<'a> { 41 + #[serde(skip_serializing_if = "std::option::Option::is_none")] 42 + #[serde(borrow)] 43 + pub cid: std::option::Option<jacquard_common::types::string::Cid<'a>>, 44 + #[serde(borrow)] 45 + pub uri: jacquard_common::types::string::AtUri<'a>, 46 + #[serde(borrow)] 47 + pub value: Like<'a>, 48 + } 49 + 50 + /// Marker type for deserializing records from this collection. 51 + pub struct LikeRecord; 52 + impl jacquard_common::xrpc::XrpcResp for LikeRecord { 53 + const NSID: &'static str = "app.bsky.feed.like"; 54 + const ENCODING: &'static str = "application/json"; 55 + type Output<'de> = LikeGetRecordOutput<'de>; 56 + type Err<'de> = jacquard_common::types::collection::RecordError<'de>; 57 + } 58 + 29 59 impl jacquard_common::types::collection::Collection for Like<'_> { 30 60 const NSID: &'static str = "app.bsky.feed.like"; 61 + type Record = LikeRecord; 62 + } 63 + 64 + impl From<LikeGetRecordOutput<'_>> for Like<'static> { 65 + fn from(output: LikeGetRecordOutput<'_>) -> Self { 66 + use jacquard_common::IntoStatic; 67 + output.value.into_static() 68 + } 31 69 }
+38
crates/jacquard-api/src/app_bsky/feed/post.rs
··· 97 97 RecordWithMedia(Box<crate::app_bsky::embed::record_with_media::RecordWithMedia<'a>>), 98 98 } 99 99 100 + /// Typed wrapper for GetRecord response with this collection's record type. 101 + #[derive( 102 + serde::Serialize, 103 + serde::Deserialize, 104 + Debug, 105 + Clone, 106 + PartialEq, 107 + Eq, 108 + jacquard_derive::IntoStatic 109 + )] 110 + #[serde(rename_all = "camelCase")] 111 + pub struct PostGetRecordOutput<'a> { 112 + #[serde(skip_serializing_if = "std::option::Option::is_none")] 113 + #[serde(borrow)] 114 + pub cid: std::option::Option<jacquard_common::types::string::Cid<'a>>, 115 + #[serde(borrow)] 116 + pub uri: jacquard_common::types::string::AtUri<'a>, 117 + #[serde(borrow)] 118 + pub value: Post<'a>, 119 + } 120 + 121 + /// Marker type for deserializing records from this collection. 122 + pub struct PostRecord; 123 + impl jacquard_common::xrpc::XrpcResp for PostRecord { 124 + const NSID: &'static str = "app.bsky.feed.post"; 125 + const ENCODING: &'static str = "application/json"; 126 + type Output<'de> = PostGetRecordOutput<'de>; 127 + type Err<'de> = jacquard_common::types::collection::RecordError<'de>; 128 + } 129 + 100 130 impl jacquard_common::types::collection::Collection for Post<'_> { 101 131 const NSID: &'static str = "app.bsky.feed.post"; 132 + type Record = PostRecord; 133 + } 134 + 135 + impl From<PostGetRecordOutput<'_>> for Post<'static> { 136 + fn from(output: PostGetRecordOutput<'_>) -> Self { 137 + use jacquard_common::IntoStatic; 138 + output.value.into_static() 139 + } 102 140 } 103 141 104 142 #[jacquard_derive::lexicon]
+38
crates/jacquard-api/src/app_bsky/feed/postgate.rs
··· 49 49 pub post: jacquard_common::types::string::AtUri<'a>, 50 50 } 51 51 52 + /// Typed wrapper for GetRecord response with this collection's record type. 53 + #[derive( 54 + serde::Serialize, 55 + serde::Deserialize, 56 + Debug, 57 + Clone, 58 + PartialEq, 59 + Eq, 60 + jacquard_derive::IntoStatic 61 + )] 62 + #[serde(rename_all = "camelCase")] 63 + pub struct PostgateGetRecordOutput<'a> { 64 + #[serde(skip_serializing_if = "std::option::Option::is_none")] 65 + #[serde(borrow)] 66 + pub cid: std::option::Option<jacquard_common::types::string::Cid<'a>>, 67 + #[serde(borrow)] 68 + pub uri: jacquard_common::types::string::AtUri<'a>, 69 + #[serde(borrow)] 70 + pub value: Postgate<'a>, 71 + } 72 + 73 + /// Marker type for deserializing records from this collection. 74 + pub struct PostgateRecord; 75 + impl jacquard_common::xrpc::XrpcResp for PostgateRecord { 76 + const NSID: &'static str = "app.bsky.feed.postgate"; 77 + const ENCODING: &'static str = "application/json"; 78 + type Output<'de> = PostgateGetRecordOutput<'de>; 79 + type Err<'de> = jacquard_common::types::collection::RecordError<'de>; 80 + } 81 + 52 82 impl jacquard_common::types::collection::Collection for Postgate<'_> { 53 83 const NSID: &'static str = "app.bsky.feed.postgate"; 84 + type Record = PostgateRecord; 85 + } 86 + 87 + impl From<PostgateGetRecordOutput<'_>> for Postgate<'static> { 88 + fn from(output: PostgateGetRecordOutput<'_>) -> Self { 89 + use jacquard_common::IntoStatic; 90 + output.value.into_static() 91 + } 54 92 }
+38
crates/jacquard-api/src/app_bsky/feed/repost.rs
··· 26 26 pub via: std::option::Option<crate::com_atproto::repo::strong_ref::StrongRef<'a>>, 27 27 } 28 28 29 + /// Typed wrapper for GetRecord response with this collection's record type. 30 + #[derive( 31 + serde::Serialize, 32 + serde::Deserialize, 33 + Debug, 34 + Clone, 35 + PartialEq, 36 + Eq, 37 + jacquard_derive::IntoStatic 38 + )] 39 + #[serde(rename_all = "camelCase")] 40 + pub struct RepostGetRecordOutput<'a> { 41 + #[serde(skip_serializing_if = "std::option::Option::is_none")] 42 + #[serde(borrow)] 43 + pub cid: std::option::Option<jacquard_common::types::string::Cid<'a>>, 44 + #[serde(borrow)] 45 + pub uri: jacquard_common::types::string::AtUri<'a>, 46 + #[serde(borrow)] 47 + pub value: Repost<'a>, 48 + } 49 + 50 + /// Marker type for deserializing records from this collection. 51 + pub struct RepostRecord; 52 + impl jacquard_common::xrpc::XrpcResp for RepostRecord { 53 + const NSID: &'static str = "app.bsky.feed.repost"; 54 + const ENCODING: &'static str = "application/json"; 55 + type Output<'de> = RepostGetRecordOutput<'de>; 56 + type Err<'de> = jacquard_common::types::collection::RecordError<'de>; 57 + } 58 + 29 59 impl jacquard_common::types::collection::Collection for Repost<'_> { 30 60 const NSID: &'static str = "app.bsky.feed.repost"; 61 + type Record = RepostRecord; 62 + } 63 + 64 + impl From<RepostGetRecordOutput<'_>> for Repost<'static> { 65 + fn from(output: RepostGetRecordOutput<'_>) -> Self { 66 + use jacquard_common::IntoStatic; 67 + output.value.into_static() 68 + } 31 69 }
+38
crates/jacquard-api/src/app_bsky/feed/threadgate.rs
··· 100 100 ListRule(Box<crate::app_bsky::feed::threadgate::ListRule<'a>>), 101 101 } 102 102 103 + /// Typed wrapper for GetRecord response with this collection's record type. 104 + #[derive( 105 + serde::Serialize, 106 + serde::Deserialize, 107 + Debug, 108 + Clone, 109 + PartialEq, 110 + Eq, 111 + jacquard_derive::IntoStatic 112 + )] 113 + #[serde(rename_all = "camelCase")] 114 + pub struct ThreadgateGetRecordOutput<'a> { 115 + #[serde(skip_serializing_if = "std::option::Option::is_none")] 116 + #[serde(borrow)] 117 + pub cid: std::option::Option<jacquard_common::types::string::Cid<'a>>, 118 + #[serde(borrow)] 119 + pub uri: jacquard_common::types::string::AtUri<'a>, 120 + #[serde(borrow)] 121 + pub value: Threadgate<'a>, 122 + } 123 + 124 + /// Marker type for deserializing records from this collection. 125 + pub struct ThreadgateRecord; 126 + impl jacquard_common::xrpc::XrpcResp for ThreadgateRecord { 127 + const NSID: &'static str = "app.bsky.feed.threadgate"; 128 + const ENCODING: &'static str = "application/json"; 129 + type Output<'de> = ThreadgateGetRecordOutput<'de>; 130 + type Err<'de> = jacquard_common::types::collection::RecordError<'de>; 131 + } 132 + 103 133 impl jacquard_common::types::collection::Collection for Threadgate<'_> { 104 134 const NSID: &'static str = "app.bsky.feed.threadgate"; 135 + type Record = ThreadgateRecord; 136 + } 137 + 138 + impl From<ThreadgateGetRecordOutput<'_>> for Threadgate<'static> { 139 + fn from(output: ThreadgateGetRecordOutput<'_>) -> Self { 140 + use jacquard_common::IntoStatic; 141 + output.value.into_static() 142 + } 105 143 } 106 144 107 145 ///Allow replies from actors mentioned in your post.
+38
crates/jacquard-api/src/app_bsky/graph/block.rs
··· 24 24 pub subject: jacquard_common::types::string::Did<'a>, 25 25 } 26 26 27 + /// Typed wrapper for GetRecord response with this collection's record type. 28 + #[derive( 29 + serde::Serialize, 30 + serde::Deserialize, 31 + Debug, 32 + Clone, 33 + PartialEq, 34 + Eq, 35 + jacquard_derive::IntoStatic 36 + )] 37 + #[serde(rename_all = "camelCase")] 38 + pub struct BlockGetRecordOutput<'a> { 39 + #[serde(skip_serializing_if = "std::option::Option::is_none")] 40 + #[serde(borrow)] 41 + pub cid: std::option::Option<jacquard_common::types::string::Cid<'a>>, 42 + #[serde(borrow)] 43 + pub uri: jacquard_common::types::string::AtUri<'a>, 44 + #[serde(borrow)] 45 + pub value: Block<'a>, 46 + } 47 + 48 + /// Marker type for deserializing records from this collection. 49 + pub struct BlockRecord; 50 + impl jacquard_common::xrpc::XrpcResp for BlockRecord { 51 + const NSID: &'static str = "app.bsky.graph.block"; 52 + const ENCODING: &'static str = "application/json"; 53 + type Output<'de> = BlockGetRecordOutput<'de>; 54 + type Err<'de> = jacquard_common::types::collection::RecordError<'de>; 55 + } 56 + 27 57 impl jacquard_common::types::collection::Collection for Block<'_> { 28 58 const NSID: &'static str = "app.bsky.graph.block"; 59 + type Record = BlockRecord; 60 + } 61 + 62 + impl From<BlockGetRecordOutput<'_>> for Block<'static> { 63 + fn from(output: BlockGetRecordOutput<'_>) -> Self { 64 + use jacquard_common::IntoStatic; 65 + output.value.into_static() 66 + } 29 67 }
+38
crates/jacquard-api/src/app_bsky/graph/follow.rs
··· 23 23 pub subject: jacquard_common::types::string::Did<'a>, 24 24 } 25 25 26 + /// Typed wrapper for GetRecord response with this collection's record type. 27 + #[derive( 28 + serde::Serialize, 29 + serde::Deserialize, 30 + Debug, 31 + Clone, 32 + PartialEq, 33 + Eq, 34 + jacquard_derive::IntoStatic 35 + )] 36 + #[serde(rename_all = "camelCase")] 37 + pub struct FollowGetRecordOutput<'a> { 38 + #[serde(skip_serializing_if = "std::option::Option::is_none")] 39 + #[serde(borrow)] 40 + pub cid: std::option::Option<jacquard_common::types::string::Cid<'a>>, 41 + #[serde(borrow)] 42 + pub uri: jacquard_common::types::string::AtUri<'a>, 43 + #[serde(borrow)] 44 + pub value: Follow<'a>, 45 + } 46 + 47 + /// Marker type for deserializing records from this collection. 48 + pub struct FollowRecord; 49 + impl jacquard_common::xrpc::XrpcResp for FollowRecord { 50 + const NSID: &'static str = "app.bsky.graph.follow"; 51 + const ENCODING: &'static str = "application/json"; 52 + type Output<'de> = FollowGetRecordOutput<'de>; 53 + type Err<'de> = jacquard_common::types::collection::RecordError<'de>; 54 + } 55 + 26 56 impl jacquard_common::types::collection::Collection for Follow<'_> { 27 57 const NSID: &'static str = "app.bsky.graph.follow"; 58 + type Record = FollowRecord; 59 + } 60 + 61 + impl From<FollowGetRecordOutput<'_>> for Follow<'static> { 62 + fn from(output: FollowGetRecordOutput<'_>) -> Self { 63 + use jacquard_common::IntoStatic; 64 + output.value.into_static() 65 + } 28 66 }
+38
crates/jacquard-api/src/app_bsky/graph/list.rs
··· 41 41 pub purpose: crate::app_bsky::graph::ListPurpose<'a>, 42 42 } 43 43 44 + /// Typed wrapper for GetRecord response with this collection's record type. 45 + #[derive( 46 + serde::Serialize, 47 + serde::Deserialize, 48 + Debug, 49 + Clone, 50 + PartialEq, 51 + Eq, 52 + jacquard_derive::IntoStatic 53 + )] 54 + #[serde(rename_all = "camelCase")] 55 + pub struct ListGetRecordOutput<'a> { 56 + #[serde(skip_serializing_if = "std::option::Option::is_none")] 57 + #[serde(borrow)] 58 + pub cid: std::option::Option<jacquard_common::types::string::Cid<'a>>, 59 + #[serde(borrow)] 60 + pub uri: jacquard_common::types::string::AtUri<'a>, 61 + #[serde(borrow)] 62 + pub value: List<'a>, 63 + } 64 + 65 + /// Marker type for deserializing records from this collection. 66 + pub struct ListRecord; 67 + impl jacquard_common::xrpc::XrpcResp for ListRecord { 68 + const NSID: &'static str = "app.bsky.graph.list"; 69 + const ENCODING: &'static str = "application/json"; 70 + type Output<'de> = ListGetRecordOutput<'de>; 71 + type Err<'de> = jacquard_common::types::collection::RecordError<'de>; 72 + } 73 + 44 74 impl jacquard_common::types::collection::Collection for List<'_> { 45 75 const NSID: &'static str = "app.bsky.graph.list"; 76 + type Record = ListRecord; 77 + } 78 + 79 + impl From<ListGetRecordOutput<'_>> for List<'static> { 80 + fn from(output: ListGetRecordOutput<'_>) -> Self { 81 + use jacquard_common::IntoStatic; 82 + output.value.into_static() 83 + } 46 84 }
+38
crates/jacquard-api/src/app_bsky/graph/listblock.rs
··· 24 24 pub subject: jacquard_common::types::string::AtUri<'a>, 25 25 } 26 26 27 + /// Typed wrapper for GetRecord response with this collection's record type. 28 + #[derive( 29 + serde::Serialize, 30 + serde::Deserialize, 31 + Debug, 32 + Clone, 33 + PartialEq, 34 + Eq, 35 + jacquard_derive::IntoStatic 36 + )] 37 + #[serde(rename_all = "camelCase")] 38 + pub struct ListblockGetRecordOutput<'a> { 39 + #[serde(skip_serializing_if = "std::option::Option::is_none")] 40 + #[serde(borrow)] 41 + pub cid: std::option::Option<jacquard_common::types::string::Cid<'a>>, 42 + #[serde(borrow)] 43 + pub uri: jacquard_common::types::string::AtUri<'a>, 44 + #[serde(borrow)] 45 + pub value: Listblock<'a>, 46 + } 47 + 48 + /// Marker type for deserializing records from this collection. 49 + pub struct ListblockRecord; 50 + impl jacquard_common::xrpc::XrpcResp for ListblockRecord { 51 + const NSID: &'static str = "app.bsky.graph.listblock"; 52 + const ENCODING: &'static str = "application/json"; 53 + type Output<'de> = ListblockGetRecordOutput<'de>; 54 + type Err<'de> = jacquard_common::types::collection::RecordError<'de>; 55 + } 56 + 27 57 impl jacquard_common::types::collection::Collection for Listblock<'_> { 28 58 const NSID: &'static str = "app.bsky.graph.listblock"; 59 + type Record = ListblockRecord; 60 + } 61 + 62 + impl From<ListblockGetRecordOutput<'_>> for Listblock<'static> { 63 + fn from(output: ListblockGetRecordOutput<'_>) -> Self { 64 + use jacquard_common::IntoStatic; 65 + output.value.into_static() 66 + } 29 67 }
+38
crates/jacquard-api/src/app_bsky/graph/listitem.rs
··· 27 27 pub subject: jacquard_common::types::string::Did<'a>, 28 28 } 29 29 30 + /// Typed wrapper for GetRecord response with this collection's record type. 31 + #[derive( 32 + serde::Serialize, 33 + serde::Deserialize, 34 + Debug, 35 + Clone, 36 + PartialEq, 37 + Eq, 38 + jacquard_derive::IntoStatic 39 + )] 40 + #[serde(rename_all = "camelCase")] 41 + pub struct ListitemGetRecordOutput<'a> { 42 + #[serde(skip_serializing_if = "std::option::Option::is_none")] 43 + #[serde(borrow)] 44 + pub cid: std::option::Option<jacquard_common::types::string::Cid<'a>>, 45 + #[serde(borrow)] 46 + pub uri: jacquard_common::types::string::AtUri<'a>, 47 + #[serde(borrow)] 48 + pub value: Listitem<'a>, 49 + } 50 + 51 + /// Marker type for deserializing records from this collection. 52 + pub struct ListitemRecord; 53 + impl jacquard_common::xrpc::XrpcResp for ListitemRecord { 54 + const NSID: &'static str = "app.bsky.graph.listitem"; 55 + const ENCODING: &'static str = "application/json"; 56 + type Output<'de> = ListitemGetRecordOutput<'de>; 57 + type Err<'de> = jacquard_common::types::collection::RecordError<'de>; 58 + } 59 + 30 60 impl jacquard_common::types::collection::Collection for Listitem<'_> { 31 61 const NSID: &'static str = "app.bsky.graph.listitem"; 62 + type Record = ListitemRecord; 63 + } 64 + 65 + impl From<ListitemGetRecordOutput<'_>> for Listitem<'static> { 66 + fn from(output: ListitemGetRecordOutput<'_>) -> Self { 67 + use jacquard_common::IntoStatic; 68 + output.value.into_static() 69 + } 32 70 }
+38
crates/jacquard-api/src/app_bsky/graph/starterpack.rs
··· 56 56 pub name: jacquard_common::CowStr<'a>, 57 57 } 58 58 59 + /// Typed wrapper for GetRecord response with this collection's record type. 60 + #[derive( 61 + serde::Serialize, 62 + serde::Deserialize, 63 + Debug, 64 + Clone, 65 + PartialEq, 66 + Eq, 67 + jacquard_derive::IntoStatic 68 + )] 69 + #[serde(rename_all = "camelCase")] 70 + pub struct StarterpackGetRecordOutput<'a> { 71 + #[serde(skip_serializing_if = "std::option::Option::is_none")] 72 + #[serde(borrow)] 73 + pub cid: std::option::Option<jacquard_common::types::string::Cid<'a>>, 74 + #[serde(borrow)] 75 + pub uri: jacquard_common::types::string::AtUri<'a>, 76 + #[serde(borrow)] 77 + pub value: Starterpack<'a>, 78 + } 79 + 80 + /// Marker type for deserializing records from this collection. 81 + pub struct StarterpackRecord; 82 + impl jacquard_common::xrpc::XrpcResp for StarterpackRecord { 83 + const NSID: &'static str = "app.bsky.graph.starterpack"; 84 + const ENCODING: &'static str = "application/json"; 85 + type Output<'de> = StarterpackGetRecordOutput<'de>; 86 + type Err<'de> = jacquard_common::types::collection::RecordError<'de>; 87 + } 88 + 59 89 impl jacquard_common::types::collection::Collection for Starterpack<'_> { 60 90 const NSID: &'static str = "app.bsky.graph.starterpack"; 91 + type Record = StarterpackRecord; 92 + } 93 + 94 + impl From<StarterpackGetRecordOutput<'_>> for Starterpack<'static> { 95 + fn from(output: StarterpackGetRecordOutput<'_>) -> Self { 96 + use jacquard_common::IntoStatic; 97 + output.value.into_static() 98 + } 61 99 }
+38
crates/jacquard-api/src/app_bsky/graph/verification.rs
··· 31 31 pub subject: jacquard_common::types::string::Did<'a>, 32 32 } 33 33 34 + /// Typed wrapper for GetRecord response with this collection's record type. 35 + #[derive( 36 + serde::Serialize, 37 + serde::Deserialize, 38 + Debug, 39 + Clone, 40 + PartialEq, 41 + Eq, 42 + jacquard_derive::IntoStatic 43 + )] 44 + #[serde(rename_all = "camelCase")] 45 + pub struct VerificationGetRecordOutput<'a> { 46 + #[serde(skip_serializing_if = "std::option::Option::is_none")] 47 + #[serde(borrow)] 48 + pub cid: std::option::Option<jacquard_common::types::string::Cid<'a>>, 49 + #[serde(borrow)] 50 + pub uri: jacquard_common::types::string::AtUri<'a>, 51 + #[serde(borrow)] 52 + pub value: Verification<'a>, 53 + } 54 + 55 + /// Marker type for deserializing records from this collection. 56 + pub struct VerificationRecord; 57 + impl jacquard_common::xrpc::XrpcResp for VerificationRecord { 58 + const NSID: &'static str = "app.bsky.graph.verification"; 59 + const ENCODING: &'static str = "application/json"; 60 + type Output<'de> = VerificationGetRecordOutput<'de>; 61 + type Err<'de> = jacquard_common::types::collection::RecordError<'de>; 62 + } 63 + 34 64 impl jacquard_common::types::collection::Collection for Verification<'_> { 35 65 const NSID: &'static str = "app.bsky.graph.verification"; 66 + type Record = VerificationRecord; 67 + } 68 + 69 + impl From<VerificationGetRecordOutput<'_>> for Verification<'static> { 70 + fn from(output: VerificationGetRecordOutput<'_>) -> Self { 71 + use jacquard_common::IntoStatic; 72 + output.value.into_static() 73 + } 36 74 }
+38
crates/jacquard-api/src/app_bsky/labeler/service.rs
··· 44 44 >, 45 45 } 46 46 47 + /// Typed wrapper for GetRecord response with this collection's record type. 48 + #[derive( 49 + serde::Serialize, 50 + serde::Deserialize, 51 + Debug, 52 + Clone, 53 + PartialEq, 54 + Eq, 55 + jacquard_derive::IntoStatic 56 + )] 57 + #[serde(rename_all = "camelCase")] 58 + pub struct ServiceGetRecordOutput<'a> { 59 + #[serde(skip_serializing_if = "std::option::Option::is_none")] 60 + #[serde(borrow)] 61 + pub cid: std::option::Option<jacquard_common::types::string::Cid<'a>>, 62 + #[serde(borrow)] 63 + pub uri: jacquard_common::types::string::AtUri<'a>, 64 + #[serde(borrow)] 65 + pub value: Service<'a>, 66 + } 67 + 68 + /// Marker type for deserializing records from this collection. 69 + pub struct ServiceRecord; 70 + impl jacquard_common::xrpc::XrpcResp for ServiceRecord { 71 + const NSID: &'static str = "app.bsky.labeler.service"; 72 + const ENCODING: &'static str = "application/json"; 73 + type Output<'de> = ServiceGetRecordOutput<'de>; 74 + type Err<'de> = jacquard_common::types::collection::RecordError<'de>; 75 + } 76 + 47 77 impl jacquard_common::types::collection::Collection for Service<'_> { 48 78 const NSID: &'static str = "app.bsky.labeler.service"; 79 + type Record = ServiceRecord; 80 + } 81 + 82 + impl From<ServiceGetRecordOutput<'_>> for Service<'static> { 83 + fn from(output: ServiceGetRecordOutput<'_>) -> Self { 84 + use jacquard_common::IntoStatic; 85 + output.value.into_static() 86 + } 49 87 }
+38
crates/jacquard-api/src/app_bsky/notification/declaration.rs
··· 23 23 pub allow_subscriptions: jacquard_common::CowStr<'a>, 24 24 } 25 25 26 + /// Typed wrapper for GetRecord response with this collection's record type. 27 + #[derive( 28 + serde::Serialize, 29 + serde::Deserialize, 30 + Debug, 31 + Clone, 32 + PartialEq, 33 + Eq, 34 + jacquard_derive::IntoStatic 35 + )] 36 + #[serde(rename_all = "camelCase")] 37 + pub struct DeclarationGetRecordOutput<'a> { 38 + #[serde(skip_serializing_if = "std::option::Option::is_none")] 39 + #[serde(borrow)] 40 + pub cid: std::option::Option<jacquard_common::types::string::Cid<'a>>, 41 + #[serde(borrow)] 42 + pub uri: jacquard_common::types::string::AtUri<'a>, 43 + #[serde(borrow)] 44 + pub value: Declaration<'a>, 45 + } 46 + 47 + /// Marker type for deserializing records from this collection. 48 + pub struct DeclarationRecord; 49 + impl jacquard_common::xrpc::XrpcResp for DeclarationRecord { 50 + const NSID: &'static str = "app.bsky.notification.declaration"; 51 + const ENCODING: &'static str = "application/json"; 52 + type Output<'de> = DeclarationGetRecordOutput<'de>; 53 + type Err<'de> = jacquard_common::types::collection::RecordError<'de>; 54 + } 55 + 26 56 impl jacquard_common::types::collection::Collection for Declaration<'_> { 27 57 const NSID: &'static str = "app.bsky.notification.declaration"; 58 + type Record = DeclarationRecord; 59 + } 60 + 61 + impl From<DeclarationGetRecordOutput<'_>> for Declaration<'static> { 62 + fn from(output: DeclarationGetRecordOutput<'_>) -> Self { 63 + use jacquard_common::IntoStatic; 64 + output.value.into_static() 65 + } 28 66 }
+38
crates/jacquard-api/src/app_ocho/edu/verification.rs
··· 28 28 pub subject: jacquard_common::types::string::Did<'a>, 29 29 } 30 30 31 + /// Typed wrapper for GetRecord response with this collection's record type. 32 + #[derive( 33 + serde::Serialize, 34 + serde::Deserialize, 35 + Debug, 36 + Clone, 37 + PartialEq, 38 + Eq, 39 + jacquard_derive::IntoStatic 40 + )] 41 + #[serde(rename_all = "camelCase")] 42 + pub struct VerificationGetRecordOutput<'a> { 43 + #[serde(skip_serializing_if = "std::option::Option::is_none")] 44 + #[serde(borrow)] 45 + pub cid: std::option::Option<jacquard_common::types::string::Cid<'a>>, 46 + #[serde(borrow)] 47 + pub uri: jacquard_common::types::string::AtUri<'a>, 48 + #[serde(borrow)] 49 + pub value: Verification<'a>, 50 + } 51 + 52 + /// Marker type for deserializing records from this collection. 53 + pub struct VerificationRecord; 54 + impl jacquard_common::xrpc::XrpcResp for VerificationRecord { 55 + const NSID: &'static str = "app.ocho.edu.verification"; 56 + const ENCODING: &'static str = "application/json"; 57 + type Output<'de> = VerificationGetRecordOutput<'de>; 58 + type Err<'de> = jacquard_common::types::collection::RecordError<'de>; 59 + } 60 + 31 61 impl jacquard_common::types::collection::Collection for Verification<'_> { 32 62 const NSID: &'static str = "app.ocho.edu.verification"; 63 + type Record = VerificationRecord; 64 + } 65 + 66 + impl From<VerificationGetRecordOutput<'_>> for Verification<'static> { 67 + fn from(output: VerificationGetRecordOutput<'_>) -> Self { 68 + use jacquard_common::IntoStatic; 69 + output.value.into_static() 70 + } 33 71 }
+38
crates/jacquard-api/src/app_ocho/plugin/service.rs
··· 26 26 pub permissions: Vec<jacquard_common::CowStr<'a>>, 27 27 } 28 28 29 + /// Typed wrapper for GetRecord response with this collection's record type. 30 + #[derive( 31 + serde::Serialize, 32 + serde::Deserialize, 33 + Debug, 34 + Clone, 35 + PartialEq, 36 + Eq, 37 + jacquard_derive::IntoStatic 38 + )] 39 + #[serde(rename_all = "camelCase")] 40 + pub struct ServiceGetRecordOutput<'a> { 41 + #[serde(skip_serializing_if = "std::option::Option::is_none")] 42 + #[serde(borrow)] 43 + pub cid: std::option::Option<jacquard_common::types::string::Cid<'a>>, 44 + #[serde(borrow)] 45 + pub uri: jacquard_common::types::string::AtUri<'a>, 46 + #[serde(borrow)] 47 + pub value: Service<'a>, 48 + } 49 + 50 + /// Marker type for deserializing records from this collection. 51 + pub struct ServiceRecord; 52 + impl jacquard_common::xrpc::XrpcResp for ServiceRecord { 53 + const NSID: &'static str = "app.ocho.plugin.service"; 54 + const ENCODING: &'static str = "application/json"; 55 + type Output<'de> = ServiceGetRecordOutput<'de>; 56 + type Err<'de> = jacquard_common::types::collection::RecordError<'de>; 57 + } 58 + 29 59 impl jacquard_common::types::collection::Collection for Service<'_> { 30 60 const NSID: &'static str = "app.ocho.plugin.service"; 61 + type Record = ServiceRecord; 62 + } 63 + 64 + impl From<ServiceGetRecordOutput<'_>> for Service<'static> { 65 + fn from(output: ServiceGetRecordOutput<'_>) -> Self { 66 + use jacquard_common::IntoStatic; 67 + output.value.into_static() 68 + } 31 69 }
+38
crates/jacquard-api/src/beauty_cybernetic/trustcow/review.rs
··· 39 39 pub transaction: jacquard_common::CowStr<'a>, 40 40 } 41 41 42 + /// Typed wrapper for GetRecord response with this collection's record type. 43 + #[derive( 44 + serde::Serialize, 45 + serde::Deserialize, 46 + Debug, 47 + Clone, 48 + PartialEq, 49 + Eq, 50 + jacquard_derive::IntoStatic 51 + )] 52 + #[serde(rename_all = "camelCase")] 53 + pub struct ReviewGetRecordOutput<'a> { 54 + #[serde(skip_serializing_if = "std::option::Option::is_none")] 55 + #[serde(borrow)] 56 + pub cid: std::option::Option<jacquard_common::types::string::Cid<'a>>, 57 + #[serde(borrow)] 58 + pub uri: jacquard_common::types::string::AtUri<'a>, 59 + #[serde(borrow)] 60 + pub value: Review<'a>, 61 + } 62 + 63 + /// Marker type for deserializing records from this collection. 64 + pub struct ReviewRecord; 65 + impl jacquard_common::xrpc::XrpcResp for ReviewRecord { 66 + const NSID: &'static str = "beauty.cybernetic.trustcow.review"; 67 + const ENCODING: &'static str = "application/json"; 68 + type Output<'de> = ReviewGetRecordOutput<'de>; 69 + type Err<'de> = jacquard_common::types::collection::RecordError<'de>; 70 + } 71 + 42 72 impl jacquard_common::types::collection::Collection for Review<'_> { 43 73 const NSID: &'static str = "beauty.cybernetic.trustcow.review"; 74 + type Record = ReviewRecord; 75 + } 76 + 77 + impl From<ReviewGetRecordOutput<'_>> for Review<'static> { 78 + fn from(output: ReviewGetRecordOutput<'_>) -> Self { 79 + use jacquard_common::IntoStatic; 80 + output.value.into_static() 81 + } 44 82 }
+38
crates/jacquard-api/src/beauty_cybernetic/trustcow/transaction.rs
··· 43 43 pub transaction_id: jacquard_common::CowStr<'a>, 44 44 } 45 45 46 + /// Typed wrapper for GetRecord response with this collection's record type. 47 + #[derive( 48 + serde::Serialize, 49 + serde::Deserialize, 50 + Debug, 51 + Clone, 52 + PartialEq, 53 + Eq, 54 + jacquard_derive::IntoStatic 55 + )] 56 + #[serde(rename_all = "camelCase")] 57 + pub struct TransactionGetRecordOutput<'a> { 58 + #[serde(skip_serializing_if = "std::option::Option::is_none")] 59 + #[serde(borrow)] 60 + pub cid: std::option::Option<jacquard_common::types::string::Cid<'a>>, 61 + #[serde(borrow)] 62 + pub uri: jacquard_common::types::string::AtUri<'a>, 63 + #[serde(borrow)] 64 + pub value: Transaction<'a>, 65 + } 66 + 67 + /// Marker type for deserializing records from this collection. 68 + pub struct TransactionRecord; 69 + impl jacquard_common::xrpc::XrpcResp for TransactionRecord { 70 + const NSID: &'static str = "beauty.cybernetic.trustcow.transaction"; 71 + const ENCODING: &'static str = "application/json"; 72 + type Output<'de> = TransactionGetRecordOutput<'de>; 73 + type Err<'de> = jacquard_common::types::collection::RecordError<'de>; 74 + } 75 + 46 76 impl jacquard_common::types::collection::Collection for Transaction<'_> { 47 77 const NSID: &'static str = "beauty.cybernetic.trustcow.transaction"; 78 + type Record = TransactionRecord; 79 + } 80 + 81 + impl From<TransactionGetRecordOutput<'_>> for Transaction<'static> { 82 + fn from(output: TransactionGetRecordOutput<'_>) -> Self { 83 + use jacquard_common::IntoStatic; 84 + output.value.into_static() 85 + } 48 86 }
+38
crates/jacquard-api/src/beauty_cybernetic/trustcow/warrant.rs
··· 40 40 pub warrant_type: std::option::Option<jacquard_common::CowStr<'a>>, 41 41 } 42 42 43 + /// Typed wrapper for GetRecord response with this collection's record type. 44 + #[derive( 45 + serde::Serialize, 46 + serde::Deserialize, 47 + Debug, 48 + Clone, 49 + PartialEq, 50 + Eq, 51 + jacquard_derive::IntoStatic 52 + )] 53 + #[serde(rename_all = "camelCase")] 54 + pub struct WarrantGetRecordOutput<'a> { 55 + #[serde(skip_serializing_if = "std::option::Option::is_none")] 56 + #[serde(borrow)] 57 + pub cid: std::option::Option<jacquard_common::types::string::Cid<'a>>, 58 + #[serde(borrow)] 59 + pub uri: jacquard_common::types::string::AtUri<'a>, 60 + #[serde(borrow)] 61 + pub value: Warrant<'a>, 62 + } 63 + 64 + /// Marker type for deserializing records from this collection. 65 + pub struct WarrantRecord; 66 + impl jacquard_common::xrpc::XrpcResp for WarrantRecord { 67 + const NSID: &'static str = "beauty.cybernetic.trustcow.warrant"; 68 + const ENCODING: &'static str = "application/json"; 69 + type Output<'de> = WarrantGetRecordOutput<'de>; 70 + type Err<'de> = jacquard_common::types::collection::RecordError<'de>; 71 + } 72 + 43 73 impl jacquard_common::types::collection::Collection for Warrant<'_> { 44 74 const NSID: &'static str = "beauty.cybernetic.trustcow.warrant"; 75 + type Record = WarrantRecord; 76 + } 77 + 78 + impl From<WarrantGetRecordOutput<'_>> for Warrant<'static> { 79 + fn from(output: WarrantGetRecordOutput<'_>) -> Self { 80 + use jacquard_common::IntoStatic; 81 + output.value.into_static() 82 + } 45 83 }
+38
crates/jacquard-api/src/blog_pckt/blog.rs
··· 38 38 pub url: std::option::Option<jacquard_common::types::string::Uri<'a>>, 39 39 } 40 40 41 + /// Typed wrapper for GetRecord response with this collection's record type. 42 + #[derive( 43 + serde::Serialize, 44 + serde::Deserialize, 45 + Debug, 46 + Clone, 47 + PartialEq, 48 + Eq, 49 + jacquard_derive::IntoStatic 50 + )] 51 + #[serde(rename_all = "camelCase")] 52 + pub struct BlogGetRecordOutput<'a> { 53 + #[serde(skip_serializing_if = "std::option::Option::is_none")] 54 + #[serde(borrow)] 55 + pub cid: std::option::Option<jacquard_common::types::string::Cid<'a>>, 56 + #[serde(borrow)] 57 + pub uri: jacquard_common::types::string::AtUri<'a>, 58 + #[serde(borrow)] 59 + pub value: Blog<'a>, 60 + } 61 + 62 + /// Marker type for deserializing records from this collection. 63 + pub struct BlogRecord; 64 + impl jacquard_common::xrpc::XrpcResp for BlogRecord { 65 + const NSID: &'static str = "blog.pckt.blog"; 66 + const ENCODING: &'static str = "application/json"; 67 + type Output<'de> = BlogGetRecordOutput<'de>; 68 + type Err<'de> = jacquard_common::types::collection::RecordError<'de>; 69 + } 70 + 41 71 impl jacquard_common::types::collection::Collection for Blog<'_> { 42 72 const NSID: &'static str = "blog.pckt.blog"; 73 + type Record = BlogRecord; 74 + } 75 + 76 + impl From<BlogGetRecordOutput<'_>> for Blog<'static> { 77 + fn from(output: BlogGetRecordOutput<'_>) -> Self { 78 + use jacquard_common::IntoStatic; 79 + output.value.into_static() 80 + } 43 81 } 44 82 45 83 #[jacquard_derive::lexicon]
+38
crates/jacquard-api/src/blog_pckt/post.rs
··· 43 43 pub url: jacquard_common::types::string::Uri<'a>, 44 44 } 45 45 46 + /// Typed wrapper for GetRecord response with this collection's record type. 47 + #[derive( 48 + serde::Serialize, 49 + serde::Deserialize, 50 + Debug, 51 + Clone, 52 + PartialEq, 53 + Eq, 54 + jacquard_derive::IntoStatic 55 + )] 56 + #[serde(rename_all = "camelCase")] 57 + pub struct PostGetRecordOutput<'a> { 58 + #[serde(skip_serializing_if = "std::option::Option::is_none")] 59 + #[serde(borrow)] 60 + pub cid: std::option::Option<jacquard_common::types::string::Cid<'a>>, 61 + #[serde(borrow)] 62 + pub uri: jacquard_common::types::string::AtUri<'a>, 63 + #[serde(borrow)] 64 + pub value: Post<'a>, 65 + } 66 + 67 + /// Marker type for deserializing records from this collection. 68 + pub struct PostRecord; 69 + impl jacquard_common::xrpc::XrpcResp for PostRecord { 70 + const NSID: &'static str = "blog.pckt.post"; 71 + const ENCODING: &'static str = "application/json"; 72 + type Output<'de> = PostGetRecordOutput<'de>; 73 + type Err<'de> = jacquard_common::types::collection::RecordError<'de>; 74 + } 75 + 46 76 impl jacquard_common::types::collection::Collection for Post<'_> { 47 77 const NSID: &'static str = "blog.pckt.post"; 78 + type Record = PostRecord; 79 + } 80 + 81 + impl From<PostGetRecordOutput<'_>> for Post<'static> { 82 + fn from(output: PostGetRecordOutput<'_>) -> Self { 83 + use jacquard_common::IntoStatic; 84 + output.value.into_static() 85 + } 48 86 }
+38
crates/jacquard-api/src/blog_pckt/publication.rs
··· 48 48 pub updated_at: std::option::Option<jacquard_common::types::string::Datetime>, 49 49 } 50 50 51 + /// Typed wrapper for GetRecord response with this collection's record type. 52 + #[derive( 53 + serde::Serialize, 54 + serde::Deserialize, 55 + Debug, 56 + Clone, 57 + PartialEq, 58 + Eq, 59 + jacquard_derive::IntoStatic 60 + )] 61 + #[serde(rename_all = "camelCase")] 62 + pub struct PublicationGetRecordOutput<'a> { 63 + #[serde(skip_serializing_if = "std::option::Option::is_none")] 64 + #[serde(borrow)] 65 + pub cid: std::option::Option<jacquard_common::types::string::Cid<'a>>, 66 + #[serde(borrow)] 67 + pub uri: jacquard_common::types::string::AtUri<'a>, 68 + #[serde(borrow)] 69 + pub value: Publication<'a>, 70 + } 71 + 72 + /// Marker type for deserializing records from this collection. 73 + pub struct PublicationRecord; 74 + impl jacquard_common::xrpc::XrpcResp for PublicationRecord { 75 + const NSID: &'static str = "blog.pckt.publication"; 76 + const ENCODING: &'static str = "application/json"; 77 + type Output<'de> = PublicationGetRecordOutput<'de>; 78 + type Err<'de> = jacquard_common::types::collection::RecordError<'de>; 79 + } 80 + 51 81 impl jacquard_common::types::collection::Collection for Publication<'_> { 52 82 const NSID: &'static str = "blog.pckt.publication"; 83 + type Record = PublicationRecord; 84 + } 85 + 86 + impl From<PublicationGetRecordOutput<'_>> for Publication<'static> { 87 + fn from(output: PublicationGetRecordOutput<'_>) -> Self { 88 + use jacquard_common::IntoStatic; 89 + output.value.into_static() 90 + } 53 91 }
+38
crates/jacquard-api/src/blog_pckt/theme.rs
··· 30 30 pub light: crate::blog_pckt::theme::Palette<'a>, 31 31 } 32 32 33 + /// Typed wrapper for GetRecord response with this collection's record type. 34 + #[derive( 35 + serde::Serialize, 36 + serde::Deserialize, 37 + Debug, 38 + Clone, 39 + PartialEq, 40 + Eq, 41 + jacquard_derive::IntoStatic 42 + )] 43 + #[serde(rename_all = "camelCase")] 44 + pub struct ThemeGetRecordOutput<'a> { 45 + #[serde(skip_serializing_if = "std::option::Option::is_none")] 46 + #[serde(borrow)] 47 + pub cid: std::option::Option<jacquard_common::types::string::Cid<'a>>, 48 + #[serde(borrow)] 49 + pub uri: jacquard_common::types::string::AtUri<'a>, 50 + #[serde(borrow)] 51 + pub value: Theme<'a>, 52 + } 53 + 54 + /// Marker type for deserializing records from this collection. 55 + pub struct ThemeRecord; 56 + impl jacquard_common::xrpc::XrpcResp for ThemeRecord { 57 + const NSID: &'static str = "blog.pckt.theme"; 58 + const ENCODING: &'static str = "application/json"; 59 + type Output<'de> = ThemeGetRecordOutput<'de>; 60 + type Err<'de> = jacquard_common::types::collection::RecordError<'de>; 61 + } 62 + 33 63 impl jacquard_common::types::collection::Collection for Theme<'_> { 34 64 const NSID: &'static str = "blog.pckt.theme"; 65 + type Record = ThemeRecord; 66 + } 67 + 68 + impl From<ThemeGetRecordOutput<'_>> for Theme<'static> { 69 + fn from(output: ThemeGetRecordOutput<'_>) -> Self { 70 + use jacquard_common::IntoStatic; 71 + output.value.into_static() 72 + } 35 73 } 36 74 37 75 ///Color palette with CSS hex values
+38
crates/jacquard-api/src/blue__2048/game.rs
··· 33 33 pub won: bool, 34 34 } 35 35 36 + /// Typed wrapper for GetRecord response with this collection's record type. 37 + #[derive( 38 + serde::Serialize, 39 + serde::Deserialize, 40 + Debug, 41 + Clone, 42 + PartialEq, 43 + Eq, 44 + jacquard_derive::IntoStatic 45 + )] 46 + #[serde(rename_all = "camelCase")] 47 + pub struct GameGetRecordOutput<'a> { 48 + #[serde(skip_serializing_if = "std::option::Option::is_none")] 49 + #[serde(borrow)] 50 + pub cid: std::option::Option<jacquard_common::types::string::Cid<'a>>, 51 + #[serde(borrow)] 52 + pub uri: jacquard_common::types::string::AtUri<'a>, 53 + #[serde(borrow)] 54 + pub value: Game<'a>, 55 + } 56 + 57 + /// Marker type for deserializing records from this collection. 58 + pub struct GameRecord; 59 + impl jacquard_common::xrpc::XrpcResp for GameRecord { 60 + const NSID: &'static str = "blue.2048.game"; 61 + const ENCODING: &'static str = "application/json"; 62 + type Output<'de> = GameGetRecordOutput<'de>; 63 + type Err<'de> = jacquard_common::types::collection::RecordError<'de>; 64 + } 65 + 36 66 impl jacquard_common::types::collection::Collection for Game<'_> { 37 67 const NSID: &'static str = "blue.2048.game"; 68 + type Record = GameRecord; 69 + } 70 + 71 + impl From<GameGetRecordOutput<'_>> for Game<'static> { 72 + fn from(output: GameGetRecordOutput<'_>) -> Self { 73 + use jacquard_common::IntoStatic; 74 + output.value.into_static() 75 + } 38 76 }
+38
crates/jacquard-api/src/blue__2048/key/game.rs
··· 24 24 pub key: crate::blue__2048::key::Key<'a>, 25 25 } 26 26 27 + /// Typed wrapper for GetRecord response with this collection's record type. 28 + #[derive( 29 + serde::Serialize, 30 + serde::Deserialize, 31 + Debug, 32 + Clone, 33 + PartialEq, 34 + Eq, 35 + jacquard_derive::IntoStatic 36 + )] 37 + #[serde(rename_all = "camelCase")] 38 + pub struct GameGetRecordOutput<'a> { 39 + #[serde(skip_serializing_if = "std::option::Option::is_none")] 40 + #[serde(borrow)] 41 + pub cid: std::option::Option<jacquard_common::types::string::Cid<'a>>, 42 + #[serde(borrow)] 43 + pub uri: jacquard_common::types::string::AtUri<'a>, 44 + #[serde(borrow)] 45 + pub value: Game<'a>, 46 + } 47 + 48 + /// Marker type for deserializing records from this collection. 49 + pub struct GameRecord; 50 + impl jacquard_common::xrpc::XrpcResp for GameRecord { 51 + const NSID: &'static str = "blue.2048.key.game"; 52 + const ENCODING: &'static str = "application/json"; 53 + type Output<'de> = GameGetRecordOutput<'de>; 54 + type Err<'de> = jacquard_common::types::collection::RecordError<'de>; 55 + } 56 + 27 57 impl jacquard_common::types::collection::Collection for Game<'_> { 28 58 const NSID: &'static str = "blue.2048.key.game"; 59 + type Record = GameRecord; 60 + } 61 + 62 + impl From<GameGetRecordOutput<'_>> for Game<'static> { 63 + fn from(output: GameGetRecordOutput<'_>) -> Self { 64 + use jacquard_common::IntoStatic; 65 + output.value.into_static() 66 + } 29 67 }
+38
crates/jacquard-api/src/blue__2048/key/player/stats.rs
··· 24 24 pub key: crate::blue__2048::key::Key<'a>, 25 25 } 26 26 27 + /// Typed wrapper for GetRecord response with this collection's record type. 28 + #[derive( 29 + serde::Serialize, 30 + serde::Deserialize, 31 + Debug, 32 + Clone, 33 + PartialEq, 34 + Eq, 35 + jacquard_derive::IntoStatic 36 + )] 37 + #[serde(rename_all = "camelCase")] 38 + pub struct StatsGetRecordOutput<'a> { 39 + #[serde(skip_serializing_if = "std::option::Option::is_none")] 40 + #[serde(borrow)] 41 + pub cid: std::option::Option<jacquard_common::types::string::Cid<'a>>, 42 + #[serde(borrow)] 43 + pub uri: jacquard_common::types::string::AtUri<'a>, 44 + #[serde(borrow)] 45 + pub value: Stats<'a>, 46 + } 47 + 48 + /// Marker type for deserializing records from this collection. 49 + pub struct StatsRecord; 50 + impl jacquard_common::xrpc::XrpcResp for StatsRecord { 51 + const NSID: &'static str = "blue.2048.key.player.stats"; 52 + const ENCODING: &'static str = "application/json"; 53 + type Output<'de> = StatsGetRecordOutput<'de>; 54 + type Err<'de> = jacquard_common::types::collection::RecordError<'de>; 55 + } 56 + 27 57 impl jacquard_common::types::collection::Collection for Stats<'_> { 28 58 const NSID: &'static str = "blue.2048.key.player.stats"; 59 + type Record = StatsRecord; 60 + } 61 + 62 + impl From<StatsGetRecordOutput<'_>> for Stats<'static> { 63 + fn from(output: StatsGetRecordOutput<'_>) -> Self { 64 + use jacquard_common::IntoStatic; 65 + output.value.into_static() 66 + } 29 67 }
+38
crates/jacquard-api/src/blue__2048/player/profile.rs
··· 26 26 pub sync_status: crate::blue__2048::SyncStatus<'a>, 27 27 } 28 28 29 + /// Typed wrapper for GetRecord response with this collection's record type. 30 + #[derive( 31 + serde::Serialize, 32 + serde::Deserialize, 33 + Debug, 34 + Clone, 35 + PartialEq, 36 + Eq, 37 + jacquard_derive::IntoStatic 38 + )] 39 + #[serde(rename_all = "camelCase")] 40 + pub struct ProfileGetRecordOutput<'a> { 41 + #[serde(skip_serializing_if = "std::option::Option::is_none")] 42 + #[serde(borrow)] 43 + pub cid: std::option::Option<jacquard_common::types::string::Cid<'a>>, 44 + #[serde(borrow)] 45 + pub uri: jacquard_common::types::string::AtUri<'a>, 46 + #[serde(borrow)] 47 + pub value: Profile<'a>, 48 + } 49 + 50 + /// Marker type for deserializing records from this collection. 51 + pub struct ProfileRecord; 52 + impl jacquard_common::xrpc::XrpcResp for ProfileRecord { 53 + const NSID: &'static str = "blue.2048.player.profile"; 54 + const ENCODING: &'static str = "application/json"; 55 + type Output<'de> = ProfileGetRecordOutput<'de>; 56 + type Err<'de> = jacquard_common::types::collection::RecordError<'de>; 57 + } 58 + 29 59 impl jacquard_common::types::collection::Collection for Profile<'_> { 30 60 const NSID: &'static str = "blue.2048.player.profile"; 61 + type Record = ProfileRecord; 62 + } 63 + 64 + impl From<ProfileGetRecordOutput<'_>> for Profile<'static> { 65 + fn from(output: ProfileGetRecordOutput<'_>) -> Self { 66 + use jacquard_common::IntoStatic; 67 + output.value.into_static() 68 + } 31 69 }
+38
crates/jacquard-api/src/blue__2048/player/stats.rs
··· 38 38 pub total_score: i64, 39 39 } 40 40 41 + /// Typed wrapper for GetRecord response with this collection's record type. 42 + #[derive( 43 + serde::Serialize, 44 + serde::Deserialize, 45 + Debug, 46 + Clone, 47 + PartialEq, 48 + Eq, 49 + jacquard_derive::IntoStatic 50 + )] 51 + #[serde(rename_all = "camelCase")] 52 + pub struct StatsGetRecordOutput<'a> { 53 + #[serde(skip_serializing_if = "std::option::Option::is_none")] 54 + #[serde(borrow)] 55 + pub cid: std::option::Option<jacquard_common::types::string::Cid<'a>>, 56 + #[serde(borrow)] 57 + pub uri: jacquard_common::types::string::AtUri<'a>, 58 + #[serde(borrow)] 59 + pub value: Stats<'a>, 60 + } 61 + 62 + /// Marker type for deserializing records from this collection. 63 + pub struct StatsRecord; 64 + impl jacquard_common::xrpc::XrpcResp for StatsRecord { 65 + const NSID: &'static str = "blue.2048.player.stats"; 66 + const ENCODING: &'static str = "application/json"; 67 + type Output<'de> = StatsGetRecordOutput<'de>; 68 + type Err<'de> = jacquard_common::types::collection::RecordError<'de>; 69 + } 70 + 41 71 impl jacquard_common::types::collection::Collection for Stats<'_> { 42 72 const NSID: &'static str = "blue.2048.player.stats"; 73 + type Record = StatsRecord; 74 + } 75 + 76 + impl From<StatsGetRecordOutput<'_>> for Stats<'static> { 77 + fn from(output: StatsGetRecordOutput<'_>) -> Self { 78 + use jacquard_common::IntoStatic; 79 + output.value.into_static() 80 + } 43 81 }
+38
crates/jacquard-api/src/blue__2048/verification/game.rs
··· 28 28 >, 29 29 } 30 30 31 + /// Typed wrapper for GetRecord response with this collection's record type. 32 + #[derive( 33 + serde::Serialize, 34 + serde::Deserialize, 35 + Debug, 36 + Clone, 37 + PartialEq, 38 + Eq, 39 + jacquard_derive::IntoStatic 40 + )] 41 + #[serde(rename_all = "camelCase")] 42 + pub struct GameGetRecordOutput<'a> { 43 + #[serde(skip_serializing_if = "std::option::Option::is_none")] 44 + #[serde(borrow)] 45 + pub cid: std::option::Option<jacquard_common::types::string::Cid<'a>>, 46 + #[serde(borrow)] 47 + pub uri: jacquard_common::types::string::AtUri<'a>, 48 + #[serde(borrow)] 49 + pub value: Game<'a>, 50 + } 51 + 52 + /// Marker type for deserializing records from this collection. 53 + pub struct GameRecord; 54 + impl jacquard_common::xrpc::XrpcResp for GameRecord { 55 + const NSID: &'static str = "blue.2048.verification.game"; 56 + const ENCODING: &'static str = "application/json"; 57 + type Output<'de> = GameGetRecordOutput<'de>; 58 + type Err<'de> = jacquard_common::types::collection::RecordError<'de>; 59 + } 60 + 31 61 impl jacquard_common::types::collection::Collection for Game<'_> { 32 62 const NSID: &'static str = "blue.2048.verification.game"; 63 + type Record = GameRecord; 64 + } 65 + 66 + impl From<GameGetRecordOutput<'_>> for Game<'static> { 67 + fn from(output: GameGetRecordOutput<'_>) -> Self { 68 + use jacquard_common::IntoStatic; 69 + output.value.into_static() 70 + } 33 71 }
+38
crates/jacquard-api/src/blue__2048/verification/stats.rs
··· 28 28 >, 29 29 } 30 30 31 + /// Typed wrapper for GetRecord response with this collection's record type. 32 + #[derive( 33 + serde::Serialize, 34 + serde::Deserialize, 35 + Debug, 36 + Clone, 37 + PartialEq, 38 + Eq, 39 + jacquard_derive::IntoStatic 40 + )] 41 + #[serde(rename_all = "camelCase")] 42 + pub struct StatsGetRecordOutput<'a> { 43 + #[serde(skip_serializing_if = "std::option::Option::is_none")] 44 + #[serde(borrow)] 45 + pub cid: std::option::Option<jacquard_common::types::string::Cid<'a>>, 46 + #[serde(borrow)] 47 + pub uri: jacquard_common::types::string::AtUri<'a>, 48 + #[serde(borrow)] 49 + pub value: Stats<'a>, 50 + } 51 + 52 + /// Marker type for deserializing records from this collection. 53 + pub struct StatsRecord; 54 + impl jacquard_common::xrpc::XrpcResp for StatsRecord { 55 + const NSID: &'static str = "blue.2048.verification.stats"; 56 + const ENCODING: &'static str = "application/json"; 57 + type Output<'de> = StatsGetRecordOutput<'de>; 58 + type Err<'de> = jacquard_common::types::collection::RecordError<'de>; 59 + } 60 + 31 61 impl jacquard_common::types::collection::Collection for Stats<'_> { 32 62 const NSID: &'static str = "blue.2048.verification.stats"; 63 + type Record = StatsRecord; 64 + } 65 + 66 + impl From<StatsGetRecordOutput<'_>> for Stats<'static> { 67 + fn from(output: StatsGetRecordOutput<'_>) -> Self { 68 + use jacquard_common::IntoStatic; 69 + output.value.into_static() 70 + } 33 71 }
+38
crates/jacquard-api/src/blue_atplane/fav_client.rs
··· 23 23 pub fav_client: jacquard_common::CowStr<'a>, 24 24 } 25 25 26 + /// Typed wrapper for GetRecord response with this collection's record type. 27 + #[derive( 28 + serde::Serialize, 29 + serde::Deserialize, 30 + Debug, 31 + Clone, 32 + PartialEq, 33 + Eq, 34 + jacquard_derive::IntoStatic 35 + )] 36 + #[serde(rename_all = "camelCase")] 37 + pub struct FavClientGetRecordOutput<'a> { 38 + #[serde(skip_serializing_if = "std::option::Option::is_none")] 39 + #[serde(borrow)] 40 + pub cid: std::option::Option<jacquard_common::types::string::Cid<'a>>, 41 + #[serde(borrow)] 42 + pub uri: jacquard_common::types::string::AtUri<'a>, 43 + #[serde(borrow)] 44 + pub value: FavClient<'a>, 45 + } 46 + 47 + /// Marker type for deserializing records from this collection. 48 + pub struct FavClientRecord; 49 + impl jacquard_common::xrpc::XrpcResp for FavClientRecord { 50 + const NSID: &'static str = "blue.atplane.favClient"; 51 + const ENCODING: &'static str = "application/json"; 52 + type Output<'de> = FavClientGetRecordOutput<'de>; 53 + type Err<'de> = jacquard_common::types::collection::RecordError<'de>; 54 + } 55 + 26 56 impl jacquard_common::types::collection::Collection for FavClient<'_> { 27 57 const NSID: &'static str = "blue.atplane.favClient"; 58 + type Record = FavClientRecord; 59 + } 60 + 61 + impl From<FavClientGetRecordOutput<'_>> for FavClient<'static> { 62 + fn from(output: FavClientGetRecordOutput<'_>) -> Self { 63 + use jacquard_common::IntoStatic; 64 + output.value.into_static() 65 + } 28 66 }
+38
crates/jacquard-api/src/blue_linkat/board.rs
··· 49 49 pub cards: Vec<crate::blue_linkat::board::Card<'a>>, 50 50 } 51 51 52 + /// Typed wrapper for GetRecord response with this collection's record type. 53 + #[derive( 54 + serde::Serialize, 55 + serde::Deserialize, 56 + Debug, 57 + Clone, 58 + PartialEq, 59 + Eq, 60 + jacquard_derive::IntoStatic 61 + )] 62 + #[serde(rename_all = "camelCase")] 63 + pub struct BoardGetRecordOutput<'a> { 64 + #[serde(skip_serializing_if = "std::option::Option::is_none")] 65 + #[serde(borrow)] 66 + pub cid: std::option::Option<jacquard_common::types::string::Cid<'a>>, 67 + #[serde(borrow)] 68 + pub uri: jacquard_common::types::string::AtUri<'a>, 69 + #[serde(borrow)] 70 + pub value: Board<'a>, 71 + } 72 + 73 + /// Marker type for deserializing records from this collection. 74 + pub struct BoardRecord; 75 + impl jacquard_common::xrpc::XrpcResp for BoardRecord { 76 + const NSID: &'static str = "blue.linkat.board"; 77 + const ENCODING: &'static str = "application/json"; 78 + type Output<'de> = BoardGetRecordOutput<'de>; 79 + type Err<'de> = jacquard_common::types::collection::RecordError<'de>; 80 + } 81 + 52 82 impl jacquard_common::types::collection::Collection for Board<'_> { 53 83 const NSID: &'static str = "blue.linkat.board"; 84 + type Record = BoardRecord; 85 + } 86 + 87 + impl From<BoardGetRecordOutput<'_>> for Board<'static> { 88 + fn from(output: BoardGetRecordOutput<'_>) -> Self { 89 + use jacquard_common::IntoStatic; 90 + output.value.into_static() 91 + } 54 92 }
+38
crates/jacquard-api/src/blue_zio/atfile/lock.rs
··· 22 22 pub lock: std::option::Option<bool>, 23 23 } 24 24 25 + /// Typed wrapper for GetRecord response with this collection's record type. 26 + #[derive( 27 + serde::Serialize, 28 + serde::Deserialize, 29 + Debug, 30 + Clone, 31 + PartialEq, 32 + Eq, 33 + jacquard_derive::IntoStatic 34 + )] 35 + #[serde(rename_all = "camelCase")] 36 + pub struct LockGetRecordOutput<'a> { 37 + #[serde(skip_serializing_if = "std::option::Option::is_none")] 38 + #[serde(borrow)] 39 + pub cid: std::option::Option<jacquard_common::types::string::Cid<'a>>, 40 + #[serde(borrow)] 41 + pub uri: jacquard_common::types::string::AtUri<'a>, 42 + #[serde(borrow)] 43 + pub value: Lock<'a>, 44 + } 45 + 46 + /// Marker type for deserializing records from this collection. 47 + pub struct LockRecord; 48 + impl jacquard_common::xrpc::XrpcResp for LockRecord { 49 + const NSID: &'static str = "blue.zio.atfile.lock"; 50 + const ENCODING: &'static str = "application/json"; 51 + type Output<'de> = LockGetRecordOutput<'de>; 52 + type Err<'de> = jacquard_common::types::collection::RecordError<'de>; 53 + } 54 + 25 55 impl jacquard_common::types::collection::Collection for Lock<'_> { 26 56 const NSID: &'static str = "blue.zio.atfile.lock"; 57 + type Record = LockRecord; 58 + } 59 + 60 + impl From<LockGetRecordOutput<'_>> for Lock<'static> { 61 + fn from(output: LockGetRecordOutput<'_>) -> Self { 62 + use jacquard_common::IntoStatic; 63 + output.value.into_static() 64 + } 27 65 }
+38
crates/jacquard-api/src/buzz_bookhive/book.rs
··· 50 50 pub title: jacquard_common::CowStr<'a>, 51 51 } 52 52 53 + /// Typed wrapper for GetRecord response with this collection's record type. 54 + #[derive( 55 + serde::Serialize, 56 + serde::Deserialize, 57 + Debug, 58 + Clone, 59 + PartialEq, 60 + Eq, 61 + jacquard_derive::IntoStatic 62 + )] 63 + #[serde(rename_all = "camelCase")] 64 + pub struct BookGetRecordOutput<'a> { 65 + #[serde(skip_serializing_if = "std::option::Option::is_none")] 66 + #[serde(borrow)] 67 + pub cid: std::option::Option<jacquard_common::types::string::Cid<'a>>, 68 + #[serde(borrow)] 69 + pub uri: jacquard_common::types::string::AtUri<'a>, 70 + #[serde(borrow)] 71 + pub value: Book<'a>, 72 + } 73 + 74 + /// Marker type for deserializing records from this collection. 75 + pub struct BookRecord; 76 + impl jacquard_common::xrpc::XrpcResp for BookRecord { 77 + const NSID: &'static str = "buzz.bookhive.book"; 78 + const ENCODING: &'static str = "application/json"; 79 + type Output<'de> = BookGetRecordOutput<'de>; 80 + type Err<'de> = jacquard_common::types::collection::RecordError<'de>; 81 + } 82 + 53 83 impl jacquard_common::types::collection::Collection for Book<'_> { 54 84 const NSID: &'static str = "buzz.bookhive.book"; 85 + type Record = BookRecord; 86 + } 87 + 88 + impl From<BookGetRecordOutput<'_>> for Book<'static> { 89 + fn from(output: BookGetRecordOutput<'_>) -> Self { 90 + use jacquard_common::IntoStatic; 91 + output.value.into_static() 92 + } 55 93 }
+38
crates/jacquard-api/src/buzz_bookhive/buzz.rs
··· 29 29 pub parent: crate::com_atproto::repo::strong_ref::StrongRef<'a>, 30 30 } 31 31 32 + /// Typed wrapper for GetRecord response with this collection's record type. 33 + #[derive( 34 + serde::Serialize, 35 + serde::Deserialize, 36 + Debug, 37 + Clone, 38 + PartialEq, 39 + Eq, 40 + jacquard_derive::IntoStatic 41 + )] 42 + #[serde(rename_all = "camelCase")] 43 + pub struct BuzzGetRecordOutput<'a> { 44 + #[serde(skip_serializing_if = "std::option::Option::is_none")] 45 + #[serde(borrow)] 46 + pub cid: std::option::Option<jacquard_common::types::string::Cid<'a>>, 47 + #[serde(borrow)] 48 + pub uri: jacquard_common::types::string::AtUri<'a>, 49 + #[serde(borrow)] 50 + pub value: Buzz<'a>, 51 + } 52 + 53 + /// Marker type for deserializing records from this collection. 54 + pub struct BuzzRecord; 55 + impl jacquard_common::xrpc::XrpcResp for BuzzRecord { 56 + const NSID: &'static str = "buzz.bookhive.buzz"; 57 + const ENCODING: &'static str = "application/json"; 58 + type Output<'de> = BuzzGetRecordOutput<'de>; 59 + type Err<'de> = jacquard_common::types::collection::RecordError<'de>; 60 + } 61 + 32 62 impl jacquard_common::types::collection::Collection for Buzz<'_> { 33 63 const NSID: &'static str = "buzz.bookhive.buzz"; 64 + type Record = BuzzRecord; 65 + } 66 + 67 + impl From<BuzzGetRecordOutput<'_>> for Buzz<'static> { 68 + fn from(output: BuzzGetRecordOutput<'_>) -> Self { 69 + use jacquard_common::IntoStatic; 70 + output.value.into_static() 71 + } 34 72 }
+38
crates/jacquard-api/src/buzz_bookhive/hive_book.rs
··· 60 60 pub updated_at: jacquard_common::types::string::Datetime, 61 61 } 62 62 63 + /// Typed wrapper for GetRecord response with this collection's record type. 64 + #[derive( 65 + serde::Serialize, 66 + serde::Deserialize, 67 + Debug, 68 + Clone, 69 + PartialEq, 70 + Eq, 71 + jacquard_derive::IntoStatic 72 + )] 73 + #[serde(rename_all = "camelCase")] 74 + pub struct HiveBookGetRecordOutput<'a> { 75 + #[serde(skip_serializing_if = "std::option::Option::is_none")] 76 + #[serde(borrow)] 77 + pub cid: std::option::Option<jacquard_common::types::string::Cid<'a>>, 78 + #[serde(borrow)] 79 + pub uri: jacquard_common::types::string::AtUri<'a>, 80 + #[serde(borrow)] 81 + pub value: HiveBook<'a>, 82 + } 83 + 84 + /// Marker type for deserializing records from this collection. 85 + pub struct HiveBookRecord; 86 + impl jacquard_common::xrpc::XrpcResp for HiveBookRecord { 87 + const NSID: &'static str = "buzz.bookhive.hiveBook"; 88 + const ENCODING: &'static str = "application/json"; 89 + type Output<'de> = HiveBookGetRecordOutput<'de>; 90 + type Err<'de> = jacquard_common::types::collection::RecordError<'de>; 91 + } 92 + 63 93 impl jacquard_common::types::collection::Collection for HiveBook<'_> { 64 94 const NSID: &'static str = "buzz.bookhive.hiveBook"; 95 + type Record = HiveBookRecord; 96 + } 97 + 98 + impl From<HiveBookGetRecordOutput<'_>> for HiveBook<'static> { 99 + fn from(output: HiveBookGetRecordOutput<'_>) -> Self { 100 + use jacquard_common::IntoStatic; 101 + output.value.into_static() 102 + } 65 103 }
+38
crates/jacquard-api/src/chat_bsky/actor/declaration.rs
··· 22 22 pub allow_incoming: jacquard_common::CowStr<'a>, 23 23 } 24 24 25 + /// Typed wrapper for GetRecord response with this collection's record type. 26 + #[derive( 27 + serde::Serialize, 28 + serde::Deserialize, 29 + Debug, 30 + Clone, 31 + PartialEq, 32 + Eq, 33 + jacquard_derive::IntoStatic 34 + )] 35 + #[serde(rename_all = "camelCase")] 36 + pub struct DeclarationGetRecordOutput<'a> { 37 + #[serde(skip_serializing_if = "std::option::Option::is_none")] 38 + #[serde(borrow)] 39 + pub cid: std::option::Option<jacquard_common::types::string::Cid<'a>>, 40 + #[serde(borrow)] 41 + pub uri: jacquard_common::types::string::AtUri<'a>, 42 + #[serde(borrow)] 43 + pub value: Declaration<'a>, 44 + } 45 + 46 + /// Marker type for deserializing records from this collection. 47 + pub struct DeclarationRecord; 48 + impl jacquard_common::xrpc::XrpcResp for DeclarationRecord { 49 + const NSID: &'static str = "chat.bsky.actor.declaration"; 50 + const ENCODING: &'static str = "application/json"; 51 + type Output<'de> = DeclarationGetRecordOutput<'de>; 52 + type Err<'de> = jacquard_common::types::collection::RecordError<'de>; 53 + } 54 + 25 55 impl jacquard_common::types::collection::Collection for Declaration<'_> { 26 56 const NSID: &'static str = "chat.bsky.actor.declaration"; 57 + type Record = DeclarationRecord; 58 + } 59 + 60 + impl From<DeclarationGetRecordOutput<'_>> for Declaration<'static> { 61 + fn from(output: DeclarationGetRecordOutput<'_>) -> Self { 62 + use jacquard_common::IntoStatic; 63 + output.value.into_static() 64 + } 27 65 }
+38
crates/jacquard-api/src/com_atproto/lexicon/schema.rs
··· 22 22 pub lexicon: i64, 23 23 } 24 24 25 + /// Typed wrapper for GetRecord response with this collection's record type. 26 + #[derive( 27 + serde::Serialize, 28 + serde::Deserialize, 29 + Debug, 30 + Clone, 31 + PartialEq, 32 + Eq, 33 + jacquard_derive::IntoStatic 34 + )] 35 + #[serde(rename_all = "camelCase")] 36 + pub struct SchemaGetRecordOutput<'a> { 37 + #[serde(skip_serializing_if = "std::option::Option::is_none")] 38 + #[serde(borrow)] 39 + pub cid: std::option::Option<jacquard_common::types::string::Cid<'a>>, 40 + #[serde(borrow)] 41 + pub uri: jacquard_common::types::string::AtUri<'a>, 42 + #[serde(borrow)] 43 + pub value: Schema<'a>, 44 + } 45 + 46 + /// Marker type for deserializing records from this collection. 47 + pub struct SchemaRecord; 48 + impl jacquard_common::xrpc::XrpcResp for SchemaRecord { 49 + const NSID: &'static str = "com.atproto.lexicon.schema"; 50 + const ENCODING: &'static str = "application/json"; 51 + type Output<'de> = SchemaGetRecordOutput<'de>; 52 + type Err<'de> = jacquard_common::types::collection::RecordError<'de>; 53 + } 54 + 25 55 impl jacquard_common::types::collection::Collection for Schema<'_> { 26 56 const NSID: &'static str = "com.atproto.lexicon.schema"; 57 + type Record = SchemaRecord; 58 + } 59 + 60 + impl From<SchemaGetRecordOutput<'_>> for Schema<'static> { 61 + fn from(output: SchemaGetRecordOutput<'_>) -> Self { 62 + use jacquard_common::IntoStatic; 63 + output.value.into_static() 64 + } 27 65 }
+38
crates/jacquard-api/src/com_crabdance/nandi/post.rs
··· 39 39 pub updated_at: std::option::Option<jacquard_common::types::string::Datetime>, 40 40 } 41 41 42 + /// Typed wrapper for GetRecord response with this collection's record type. 43 + #[derive( 44 + serde::Serialize, 45 + serde::Deserialize, 46 + Debug, 47 + Clone, 48 + PartialEq, 49 + Eq, 50 + jacquard_derive::IntoStatic 51 + )] 52 + #[serde(rename_all = "camelCase")] 53 + pub struct PostGetRecordOutput<'a> { 54 + #[serde(skip_serializing_if = "std::option::Option::is_none")] 55 + #[serde(borrow)] 56 + pub cid: std::option::Option<jacquard_common::types::string::Cid<'a>>, 57 + #[serde(borrow)] 58 + pub uri: jacquard_common::types::string::AtUri<'a>, 59 + #[serde(borrow)] 60 + pub value: Post<'a>, 61 + } 62 + 63 + /// Marker type for deserializing records from this collection. 64 + pub struct PostRecord; 65 + impl jacquard_common::xrpc::XrpcResp for PostRecord { 66 + const NSID: &'static str = "com.crabdance.nandi.post"; 67 + const ENCODING: &'static str = "application/json"; 68 + type Output<'de> = PostGetRecordOutput<'de>; 69 + type Err<'de> = jacquard_common::types::collection::RecordError<'de>; 70 + } 71 + 42 72 impl jacquard_common::types::collection::Collection for Post<'_> { 43 73 const NSID: &'static str = "com.crabdance.nandi.post"; 74 + type Record = PostRecord; 75 + } 76 + 77 + impl From<PostGetRecordOutput<'_>> for Post<'static> { 78 + fn from(output: PostGetRecordOutput<'_>) -> Self { 79 + use jacquard_common::IntoStatic; 80 + output.value.into_static() 81 + } 44 82 }
+38
crates/jacquard-api/src/com_shinolabs/pinksea/oekaki.rs
··· 75 75 pub tags: std::option::Option<Vec<jacquard_common::CowStr<'a>>>, 76 76 } 77 77 78 + /// Typed wrapper for GetRecord response with this collection's record type. 79 + #[derive( 80 + serde::Serialize, 81 + serde::Deserialize, 82 + Debug, 83 + Clone, 84 + PartialEq, 85 + Eq, 86 + jacquard_derive::IntoStatic 87 + )] 88 + #[serde(rename_all = "camelCase")] 89 + pub struct OekakiGetRecordOutput<'a> { 90 + #[serde(skip_serializing_if = "std::option::Option::is_none")] 91 + #[serde(borrow)] 92 + pub cid: std::option::Option<jacquard_common::types::string::Cid<'a>>, 93 + #[serde(borrow)] 94 + pub uri: jacquard_common::types::string::AtUri<'a>, 95 + #[serde(borrow)] 96 + pub value: Oekaki<'a>, 97 + } 98 + 99 + /// Marker type for deserializing records from this collection. 100 + pub struct OekakiRecord; 101 + impl jacquard_common::xrpc::XrpcResp for OekakiRecord { 102 + const NSID: &'static str = "com.shinolabs.pinksea.oekaki"; 103 + const ENCODING: &'static str = "application/json"; 104 + type Output<'de> = OekakiGetRecordOutput<'de>; 105 + type Err<'de> = jacquard_common::types::collection::RecordError<'de>; 106 + } 107 + 78 108 impl jacquard_common::types::collection::Collection for Oekaki<'_> { 79 109 const NSID: &'static str = "com.shinolabs.pinksea.oekaki"; 110 + type Record = OekakiRecord; 111 + } 112 + 113 + impl From<OekakiGetRecordOutput<'_>> for Oekaki<'static> { 114 + fn from(output: OekakiGetRecordOutput<'_>) -> Self { 115 + use jacquard_common::IntoStatic; 116 + output.value.into_static() 117 + } 80 118 }
+38
crates/jacquard-api/src/com_shinolabs/pinksea/profile.rs
··· 38 38 pub nickname: std::option::Option<jacquard_common::CowStr<'a>>, 39 39 } 40 40 41 + /// Typed wrapper for GetRecord response with this collection's record type. 42 + #[derive( 43 + serde::Serialize, 44 + serde::Deserialize, 45 + Debug, 46 + Clone, 47 + PartialEq, 48 + Eq, 49 + jacquard_derive::IntoStatic 50 + )] 51 + #[serde(rename_all = "camelCase")] 52 + pub struct ProfileGetRecordOutput<'a> { 53 + #[serde(skip_serializing_if = "std::option::Option::is_none")] 54 + #[serde(borrow)] 55 + pub cid: std::option::Option<jacquard_common::types::string::Cid<'a>>, 56 + #[serde(borrow)] 57 + pub uri: jacquard_common::types::string::AtUri<'a>, 58 + #[serde(borrow)] 59 + pub value: Profile<'a>, 60 + } 61 + 62 + /// Marker type for deserializing records from this collection. 63 + pub struct ProfileRecord; 64 + impl jacquard_common::xrpc::XrpcResp for ProfileRecord { 65 + const NSID: &'static str = "com.shinolabs.pinksea.profile"; 66 + const ENCODING: &'static str = "application/json"; 67 + type Output<'de> = ProfileGetRecordOutput<'de>; 68 + type Err<'de> = jacquard_common::types::collection::RecordError<'de>; 69 + } 70 + 41 71 impl jacquard_common::types::collection::Collection for Profile<'_> { 42 72 const NSID: &'static str = "com.shinolabs.pinksea.profile"; 73 + type Record = ProfileRecord; 74 + } 75 + 76 + impl From<ProfileGetRecordOutput<'_>> for Profile<'static> { 77 + fn from(output: ProfileGetRecordOutput<'_>) -> Self { 78 + use jacquard_common::IntoStatic; 79 + output.value.into_static() 80 + } 43 81 } 44 82 45 83 #[jacquard_derive::lexicon]
+38
crates/jacquard-api/src/com_whtwnd/blog/entry.rs
··· 46 46 pub visibility: std::option::Option<jacquard_common::CowStr<'a>>, 47 47 } 48 48 49 + /// Typed wrapper for GetRecord response with this collection's record type. 50 + #[derive( 51 + serde::Serialize, 52 + serde::Deserialize, 53 + Debug, 54 + Clone, 55 + PartialEq, 56 + Eq, 57 + jacquard_derive::IntoStatic 58 + )] 59 + #[serde(rename_all = "camelCase")] 60 + pub struct EntryGetRecordOutput<'a> { 61 + #[serde(skip_serializing_if = "std::option::Option::is_none")] 62 + #[serde(borrow)] 63 + pub cid: std::option::Option<jacquard_common::types::string::Cid<'a>>, 64 + #[serde(borrow)] 65 + pub uri: jacquard_common::types::string::AtUri<'a>, 66 + #[serde(borrow)] 67 + pub value: Entry<'a>, 68 + } 69 + 70 + /// Marker type for deserializing records from this collection. 71 + pub struct EntryRecord; 72 + impl jacquard_common::xrpc::XrpcResp for EntryRecord { 73 + const NSID: &'static str = "com.whtwnd.blog.entry"; 74 + const ENCODING: &'static str = "application/json"; 75 + type Output<'de> = EntryGetRecordOutput<'de>; 76 + type Err<'de> = jacquard_common::types::collection::RecordError<'de>; 77 + } 78 + 49 79 impl jacquard_common::types::collection::Collection for Entry<'_> { 50 80 const NSID: &'static str = "com.whtwnd.blog.entry"; 81 + type Record = EntryRecord; 82 + } 83 + 84 + impl From<EntryGetRecordOutput<'_>> for Entry<'static> { 85 + fn from(output: EntryGetRecordOutput<'_>) -> Self { 86 + use jacquard_common::IntoStatic; 87 + output.value.into_static() 88 + } 51 89 }
+38
crates/jacquard-api/src/community_lexicon/bookmarks/bookmark.rs
··· 27 27 pub tags: std::option::Option<Vec<jacquard_common::CowStr<'a>>>, 28 28 } 29 29 30 + /// Typed wrapper for GetRecord response with this collection's record type. 31 + #[derive( 32 + serde::Serialize, 33 + serde::Deserialize, 34 + Debug, 35 + Clone, 36 + PartialEq, 37 + Eq, 38 + jacquard_derive::IntoStatic 39 + )] 40 + #[serde(rename_all = "camelCase")] 41 + pub struct BookmarkGetRecordOutput<'a> { 42 + #[serde(skip_serializing_if = "std::option::Option::is_none")] 43 + #[serde(borrow)] 44 + pub cid: std::option::Option<jacquard_common::types::string::Cid<'a>>, 45 + #[serde(borrow)] 46 + pub uri: jacquard_common::types::string::AtUri<'a>, 47 + #[serde(borrow)] 48 + pub value: Bookmark<'a>, 49 + } 50 + 51 + /// Marker type for deserializing records from this collection. 52 + pub struct BookmarkRecord; 53 + impl jacquard_common::xrpc::XrpcResp for BookmarkRecord { 54 + const NSID: &'static str = "community.lexicon.bookmarks.bookmark"; 55 + const ENCODING: &'static str = "application/json"; 56 + type Output<'de> = BookmarkGetRecordOutput<'de>; 57 + type Err<'de> = jacquard_common::types::collection::RecordError<'de>; 58 + } 59 + 30 60 impl jacquard_common::types::collection::Collection for Bookmark<'_> { 31 61 const NSID: &'static str = "community.lexicon.bookmarks.bookmark"; 62 + type Record = BookmarkRecord; 63 + } 64 + 65 + impl From<BookmarkGetRecordOutput<'_>> for Bookmark<'static> { 66 + fn from(output: BookmarkGetRecordOutput<'_>) -> Self { 67 + use jacquard_common::IntoStatic; 68 + output.value.into_static() 69 + } 32 70 }
+38
crates/jacquard-api/src/community_lexicon/calendar/event.rs
··· 134 134 Hthree(Box<crate::community_lexicon::location::hthree::Hthree<'a>>), 135 135 } 136 136 137 + /// Typed wrapper for GetRecord response with this collection's record type. 138 + #[derive( 139 + serde::Serialize, 140 + serde::Deserialize, 141 + Debug, 142 + Clone, 143 + PartialEq, 144 + Eq, 145 + jacquard_derive::IntoStatic 146 + )] 147 + #[serde(rename_all = "camelCase")] 148 + pub struct EventGetRecordOutput<'a> { 149 + #[serde(skip_serializing_if = "std::option::Option::is_none")] 150 + #[serde(borrow)] 151 + pub cid: std::option::Option<jacquard_common::types::string::Cid<'a>>, 152 + #[serde(borrow)] 153 + pub uri: jacquard_common::types::string::AtUri<'a>, 154 + #[serde(borrow)] 155 + pub value: Event<'a>, 156 + } 157 + 158 + /// Marker type for deserializing records from this collection. 159 + pub struct EventRecord; 160 + impl jacquard_common::xrpc::XrpcResp for EventRecord { 161 + const NSID: &'static str = "community.lexicon.calendar.event"; 162 + const ENCODING: &'static str = "application/json"; 163 + type Output<'de> = EventGetRecordOutput<'de>; 164 + type Err<'de> = jacquard_common::types::collection::RecordError<'de>; 165 + } 166 + 137 167 impl jacquard_common::types::collection::Collection for Event<'_> { 138 168 const NSID: &'static str = "community.lexicon.calendar.event"; 169 + type Record = EventRecord; 170 + } 171 + 172 + impl From<EventGetRecordOutput<'_>> for Event<'static> { 173 + fn from(output: EventGetRecordOutput<'_>) -> Self { 174 + use jacquard_common::IntoStatic; 175 + output.value.into_static() 176 + } 139 177 } 140 178 141 179 ///The mode of the event.
+38
crates/jacquard-api/src/community_lexicon/calendar/rsvp.rs
··· 60 60 pub subject: crate::com_atproto::repo::strong_ref::StrongRef<'a>, 61 61 } 62 62 63 + /// Typed wrapper for GetRecord response with this collection's record type. 64 + #[derive( 65 + serde::Serialize, 66 + serde::Deserialize, 67 + Debug, 68 + Clone, 69 + PartialEq, 70 + Eq, 71 + jacquard_derive::IntoStatic 72 + )] 73 + #[serde(rename_all = "camelCase")] 74 + pub struct RsvpGetRecordOutput<'a> { 75 + #[serde(skip_serializing_if = "std::option::Option::is_none")] 76 + #[serde(borrow)] 77 + pub cid: std::option::Option<jacquard_common::types::string::Cid<'a>>, 78 + #[serde(borrow)] 79 + pub uri: jacquard_common::types::string::AtUri<'a>, 80 + #[serde(borrow)] 81 + pub value: Rsvp<'a>, 82 + } 83 + 84 + /// Marker type for deserializing records from this collection. 85 + pub struct RsvpRecord; 86 + impl jacquard_common::xrpc::XrpcResp for RsvpRecord { 87 + const NSID: &'static str = "community.lexicon.calendar.rsvp"; 88 + const ENCODING: &'static str = "application/json"; 89 + type Output<'de> = RsvpGetRecordOutput<'de>; 90 + type Err<'de> = jacquard_common::types::collection::RecordError<'de>; 91 + } 92 + 63 93 impl jacquard_common::types::collection::Collection for Rsvp<'_> { 64 94 const NSID: &'static str = "community.lexicon.calendar.rsvp"; 95 + type Record = RsvpRecord; 96 + } 97 + 98 + impl From<RsvpGetRecordOutput<'_>> for Rsvp<'static> { 99 + fn from(output: RsvpGetRecordOutput<'_>) -> Self { 100 + use jacquard_common::IntoStatic; 101 + output.value.into_static() 102 + } 65 103 } 66 104 67 105 ///Not going to the event
+38
crates/jacquard-api/src/community_lexicon/interaction/like.rs
··· 23 23 pub subject: crate::com_atproto::repo::strong_ref::StrongRef<'a>, 24 24 } 25 25 26 + /// Typed wrapper for GetRecord response with this collection's record type. 27 + #[derive( 28 + serde::Serialize, 29 + serde::Deserialize, 30 + Debug, 31 + Clone, 32 + PartialEq, 33 + Eq, 34 + jacquard_derive::IntoStatic 35 + )] 36 + #[serde(rename_all = "camelCase")] 37 + pub struct LikeGetRecordOutput<'a> { 38 + #[serde(skip_serializing_if = "std::option::Option::is_none")] 39 + #[serde(borrow)] 40 + pub cid: std::option::Option<jacquard_common::types::string::Cid<'a>>, 41 + #[serde(borrow)] 42 + pub uri: jacquard_common::types::string::AtUri<'a>, 43 + #[serde(borrow)] 44 + pub value: Like<'a>, 45 + } 46 + 47 + /// Marker type for deserializing records from this collection. 48 + pub struct LikeRecord; 49 + impl jacquard_common::xrpc::XrpcResp for LikeRecord { 50 + const NSID: &'static str = "community.lexicon.interaction.like"; 51 + const ENCODING: &'static str = "application/json"; 52 + type Output<'de> = LikeGetRecordOutput<'de>; 53 + type Err<'de> = jacquard_common::types::collection::RecordError<'de>; 54 + } 55 + 26 56 impl jacquard_common::types::collection::Collection for Like<'_> { 27 57 const NSID: &'static str = "community.lexicon.interaction.like"; 58 + type Record = LikeRecord; 59 + } 60 + 61 + impl From<LikeGetRecordOutput<'_>> for Like<'static> { 62 + fn from(output: LikeGetRecordOutput<'_>) -> Self { 63 + use jacquard_common::IntoStatic; 64 + output.value.into_static() 65 + } 28 66 }
+38
crates/jacquard-api/src/community_lexicon/payments/web_monetization.rs
··· 27 27 pub note: std::option::Option<jacquard_common::CowStr<'a>>, 28 28 } 29 29 30 + /// Typed wrapper for GetRecord response with this collection's record type. 31 + #[derive( 32 + serde::Serialize, 33 + serde::Deserialize, 34 + Debug, 35 + Clone, 36 + PartialEq, 37 + Eq, 38 + jacquard_derive::IntoStatic 39 + )] 40 + #[serde(rename_all = "camelCase")] 41 + pub struct WebMonetizationGetRecordOutput<'a> { 42 + #[serde(skip_serializing_if = "std::option::Option::is_none")] 43 + #[serde(borrow)] 44 + pub cid: std::option::Option<jacquard_common::types::string::Cid<'a>>, 45 + #[serde(borrow)] 46 + pub uri: jacquard_common::types::string::AtUri<'a>, 47 + #[serde(borrow)] 48 + pub value: WebMonetization<'a>, 49 + } 50 + 51 + /// Marker type for deserializing records from this collection. 52 + pub struct WebMonetizationRecord; 53 + impl jacquard_common::xrpc::XrpcResp for WebMonetizationRecord { 54 + const NSID: &'static str = "community.lexicon.payments.webMonetization"; 55 + const ENCODING: &'static str = "application/json"; 56 + type Output<'de> = WebMonetizationGetRecordOutput<'de>; 57 + type Err<'de> = jacquard_common::types::collection::RecordError<'de>; 58 + } 59 + 30 60 impl jacquard_common::types::collection::Collection for WebMonetization<'_> { 31 61 const NSID: &'static str = "community.lexicon.payments.webMonetization"; 62 + type Record = WebMonetizationRecord; 63 + } 64 + 65 + impl From<WebMonetizationGetRecordOutput<'_>> for WebMonetization<'static> { 66 + fn from(output: WebMonetizationGetRecordOutput<'_>) -> Self { 67 + use jacquard_common::IntoStatic; 68 + output.value.into_static() 69 + } 32 70 }
+38
crates/jacquard-api/src/dev_baileytownsend/health/calories.rs
··· 23 23 pub intake: i64, 24 24 } 25 25 26 + /// Typed wrapper for GetRecord response with this collection's record type. 27 + #[derive( 28 + serde::Serialize, 29 + serde::Deserialize, 30 + Debug, 31 + Clone, 32 + PartialEq, 33 + Eq, 34 + jacquard_derive::IntoStatic 35 + )] 36 + #[serde(rename_all = "camelCase")] 37 + pub struct CaloriesGetRecordOutput<'a> { 38 + #[serde(skip_serializing_if = "std::option::Option::is_none")] 39 + #[serde(borrow)] 40 + pub cid: std::option::Option<jacquard_common::types::string::Cid<'a>>, 41 + #[serde(borrow)] 42 + pub uri: jacquard_common::types::string::AtUri<'a>, 43 + #[serde(borrow)] 44 + pub value: Calories<'a>, 45 + } 46 + 47 + /// Marker type for deserializing records from this collection. 48 + pub struct CaloriesRecord; 49 + impl jacquard_common::xrpc::XrpcResp for CaloriesRecord { 50 + const NSID: &'static str = "dev.baileytownsend.health.calories"; 51 + const ENCODING: &'static str = "application/json"; 52 + type Output<'de> = CaloriesGetRecordOutput<'de>; 53 + type Err<'de> = jacquard_common::types::collection::RecordError<'de>; 54 + } 55 + 26 56 impl jacquard_common::types::collection::Collection for Calories<'_> { 27 57 const NSID: &'static str = "dev.baileytownsend.health.calories"; 58 + type Record = CaloriesRecord; 59 + } 60 + 61 + impl From<CaloriesGetRecordOutput<'_>> for Calories<'static> { 62 + fn from(output: CaloriesGetRecordOutput<'_>) -> Self { 63 + use jacquard_common::IntoStatic; 64 + output.value.into_static() 65 + } 28 66 }
+38
crates/jacquard-api/src/dev_baileytownsend/health/rings.rs
··· 33 33 pub stand_hours: i64, 34 34 } 35 35 36 + /// Typed wrapper for GetRecord response with this collection's record type. 37 + #[derive( 38 + serde::Serialize, 39 + serde::Deserialize, 40 + Debug, 41 + Clone, 42 + PartialEq, 43 + Eq, 44 + jacquard_derive::IntoStatic 45 + )] 46 + #[serde(rename_all = "camelCase")] 47 + pub struct RingsGetRecordOutput<'a> { 48 + #[serde(skip_serializing_if = "std::option::Option::is_none")] 49 + #[serde(borrow)] 50 + pub cid: std::option::Option<jacquard_common::types::string::Cid<'a>>, 51 + #[serde(borrow)] 52 + pub uri: jacquard_common::types::string::AtUri<'a>, 53 + #[serde(borrow)] 54 + pub value: Rings<'a>, 55 + } 56 + 57 + /// Marker type for deserializing records from this collection. 58 + pub struct RingsRecord; 59 + impl jacquard_common::xrpc::XrpcResp for RingsRecord { 60 + const NSID: &'static str = "dev.baileytownsend.health.rings"; 61 + const ENCODING: &'static str = "application/json"; 62 + type Output<'de> = RingsGetRecordOutput<'de>; 63 + type Err<'de> = jacquard_common::types::collection::RecordError<'de>; 64 + } 65 + 36 66 impl jacquard_common::types::collection::Collection for Rings<'_> { 37 67 const NSID: &'static str = "dev.baileytownsend.health.rings"; 68 + type Record = RingsRecord; 69 + } 70 + 71 + impl From<RingsGetRecordOutput<'_>> for Rings<'static> { 72 + fn from(output: RingsGetRecordOutput<'_>) -> Self { 73 + use jacquard_common::IntoStatic; 74 + output.value.into_static() 75 + } 38 76 }
+38
crates/jacquard-api/src/dev_baileytownsend/health/steps.rs
··· 21 21 pub steps: i64, 22 22 } 23 23 24 + /// Typed wrapper for GetRecord response with this collection's record type. 25 + #[derive( 26 + serde::Serialize, 27 + serde::Deserialize, 28 + Debug, 29 + Clone, 30 + PartialEq, 31 + Eq, 32 + jacquard_derive::IntoStatic 33 + )] 34 + #[serde(rename_all = "camelCase")] 35 + pub struct StepsGetRecordOutput<'a> { 36 + #[serde(skip_serializing_if = "std::option::Option::is_none")] 37 + #[serde(borrow)] 38 + pub cid: std::option::Option<jacquard_common::types::string::Cid<'a>>, 39 + #[serde(borrow)] 40 + pub uri: jacquard_common::types::string::AtUri<'a>, 41 + #[serde(borrow)] 42 + pub value: Steps<'a>, 43 + } 44 + 45 + /// Marker type for deserializing records from this collection. 46 + pub struct StepsRecord; 47 + impl jacquard_common::xrpc::XrpcResp for StepsRecord { 48 + const NSID: &'static str = "dev.baileytownsend.health.steps"; 49 + const ENCODING: &'static str = "application/json"; 50 + type Output<'de> = StepsGetRecordOutput<'de>; 51 + type Err<'de> = jacquard_common::types::collection::RecordError<'de>; 52 + } 53 + 24 54 impl jacquard_common::types::collection::Collection for Steps<'_> { 25 55 const NSID: &'static str = "dev.baileytownsend.health.steps"; 56 + type Record = StepsRecord; 57 + } 58 + 59 + impl From<StepsGetRecordOutput<'_>> for Steps<'static> { 60 + fn from(output: StepsGetRecordOutput<'_>) -> Self { 61 + use jacquard_common::IntoStatic; 62 + output.value.into_static() 63 + } 26 64 }
+38
crates/jacquard-api/src/dev_baileytownsend/health/workout.rs
··· 34 34 pub start_time: jacquard_common::types::string::Datetime, 35 35 } 36 36 37 + /// Typed wrapper for GetRecord response with this collection's record type. 38 + #[derive( 39 + serde::Serialize, 40 + serde::Deserialize, 41 + Debug, 42 + Clone, 43 + PartialEq, 44 + Eq, 45 + jacquard_derive::IntoStatic 46 + )] 47 + #[serde(rename_all = "camelCase")] 48 + pub struct WorkoutGetRecordOutput<'a> { 49 + #[serde(skip_serializing_if = "std::option::Option::is_none")] 50 + #[serde(borrow)] 51 + pub cid: std::option::Option<jacquard_common::types::string::Cid<'a>>, 52 + #[serde(borrow)] 53 + pub uri: jacquard_common::types::string::AtUri<'a>, 54 + #[serde(borrow)] 55 + pub value: Workout<'a>, 56 + } 57 + 58 + /// Marker type for deserializing records from this collection. 59 + pub struct WorkoutRecord; 60 + impl jacquard_common::xrpc::XrpcResp for WorkoutRecord { 61 + const NSID: &'static str = "dev.baileytownsend.health.workout"; 62 + const ENCODING: &'static str = "application/json"; 63 + type Output<'de> = WorkoutGetRecordOutput<'de>; 64 + type Err<'de> = jacquard_common::types::collection::RecordError<'de>; 65 + } 66 + 37 67 impl jacquard_common::types::collection::Collection for Workout<'_> { 38 68 const NSID: &'static str = "dev.baileytownsend.health.workout"; 69 + type Record = WorkoutRecord; 70 + } 71 + 72 + impl From<WorkoutGetRecordOutput<'_>> for Workout<'static> { 73 + fn from(output: WorkoutGetRecordOutput<'_>) -> Self { 74 + use jacquard_common::IntoStatic; 75 + output.value.into_static() 76 + } 39 77 }
+38
crates/jacquard-api/src/dev_fudgeu/experimental/atforumv1/feed/post.rs
··· 36 36 pub updated_at: std::option::Option<jacquard_common::types::string::Datetime>, 37 37 } 38 38 39 + /// Typed wrapper for GetRecord response with this collection's record type. 40 + #[derive( 41 + serde::Serialize, 42 + serde::Deserialize, 43 + Debug, 44 + Clone, 45 + PartialEq, 46 + Eq, 47 + jacquard_derive::IntoStatic 48 + )] 49 + #[serde(rename_all = "camelCase")] 50 + pub struct PostGetRecordOutput<'a> { 51 + #[serde(skip_serializing_if = "std::option::Option::is_none")] 52 + #[serde(borrow)] 53 + pub cid: std::option::Option<jacquard_common::types::string::Cid<'a>>, 54 + #[serde(borrow)] 55 + pub uri: jacquard_common::types::string::AtUri<'a>, 56 + #[serde(borrow)] 57 + pub value: Post<'a>, 58 + } 59 + 60 + /// Marker type for deserializing records from this collection. 61 + pub struct PostRecord; 62 + impl jacquard_common::xrpc::XrpcResp for PostRecord { 63 + const NSID: &'static str = "dev.fudgeu.experimental.atforumv1.feed.post"; 64 + const ENCODING: &'static str = "application/json"; 65 + type Output<'de> = PostGetRecordOutput<'de>; 66 + type Err<'de> = jacquard_common::types::collection::RecordError<'de>; 67 + } 68 + 39 69 impl jacquard_common::types::collection::Collection for Post<'_> { 40 70 const NSID: &'static str = "dev.fudgeu.experimental.atforumv1.feed.post"; 71 + type Record = PostRecord; 72 + } 73 + 74 + impl From<PostGetRecordOutput<'_>> for Post<'static> { 75 + fn from(output: PostGetRecordOutput<'_>) -> Self { 76 + use jacquard_common::IntoStatic; 77 + output.value.into_static() 78 + } 41 79 }
+38
crates/jacquard-api/src/dev_fudgeu/experimental/atforumv1/feed/reply.rs
··· 27 27 pub updated_at: std::option::Option<jacquard_common::types::string::Datetime>, 28 28 } 29 29 30 + /// Typed wrapper for GetRecord response with this collection's record type. 31 + #[derive( 32 + serde::Serialize, 33 + serde::Deserialize, 34 + Debug, 35 + Clone, 36 + PartialEq, 37 + Eq, 38 + jacquard_derive::IntoStatic 39 + )] 40 + #[serde(rename_all = "camelCase")] 41 + pub struct ReplyGetRecordOutput<'a> { 42 + #[serde(skip_serializing_if = "std::option::Option::is_none")] 43 + #[serde(borrow)] 44 + pub cid: std::option::Option<jacquard_common::types::string::Cid<'a>>, 45 + #[serde(borrow)] 46 + pub uri: jacquard_common::types::string::AtUri<'a>, 47 + #[serde(borrow)] 48 + pub value: Reply<'a>, 49 + } 50 + 51 + /// Marker type for deserializing records from this collection. 52 + pub struct ReplyRecord; 53 + impl jacquard_common::xrpc::XrpcResp for ReplyRecord { 54 + const NSID: &'static str = "dev.fudgeu.experimental.atforumv1.feed.reply"; 55 + const ENCODING: &'static str = "application/json"; 56 + type Output<'de> = ReplyGetRecordOutput<'de>; 57 + type Err<'de> = jacquard_common::types::collection::RecordError<'de>; 58 + } 59 + 30 60 impl jacquard_common::types::collection::Collection for Reply<'_> { 31 61 const NSID: &'static str = "dev.fudgeu.experimental.atforumv1.feed.reply"; 62 + type Record = ReplyRecord; 63 + } 64 + 65 + impl From<ReplyGetRecordOutput<'_>> for Reply<'static> { 66 + fn from(output: ReplyGetRecordOutput<'_>) -> Self { 67 + use jacquard_common::IntoStatic; 68 + output.value.into_static() 69 + } 32 70 }
+38
crates/jacquard-api/src/dev_fudgeu/experimental/atforumv1/forum/announcement.rs
··· 26 26 pub title: jacquard_common::CowStr<'a>, 27 27 } 28 28 29 + /// Typed wrapper for GetRecord response with this collection's record type. 30 + #[derive( 31 + serde::Serialize, 32 + serde::Deserialize, 33 + Debug, 34 + Clone, 35 + PartialEq, 36 + Eq, 37 + jacquard_derive::IntoStatic 38 + )] 39 + #[serde(rename_all = "camelCase")] 40 + pub struct AnnouncementGetRecordOutput<'a> { 41 + #[serde(skip_serializing_if = "std::option::Option::is_none")] 42 + #[serde(borrow)] 43 + pub cid: std::option::Option<jacquard_common::types::string::Cid<'a>>, 44 + #[serde(borrow)] 45 + pub uri: jacquard_common::types::string::AtUri<'a>, 46 + #[serde(borrow)] 47 + pub value: Announcement<'a>, 48 + } 49 + 50 + /// Marker type for deserializing records from this collection. 51 + pub struct AnnouncementRecord; 52 + impl jacquard_common::xrpc::XrpcResp for AnnouncementRecord { 53 + const NSID: &'static str = "dev.fudgeu.experimental.atforumv1.forum.announcement"; 54 + const ENCODING: &'static str = "application/json"; 55 + type Output<'de> = AnnouncementGetRecordOutput<'de>; 56 + type Err<'de> = jacquard_common::types::collection::RecordError<'de>; 57 + } 58 + 29 59 impl jacquard_common::types::collection::Collection for Announcement<'_> { 30 60 const NSID: &'static str = "dev.fudgeu.experimental.atforumv1.forum.announcement"; 61 + type Record = AnnouncementRecord; 62 + } 63 + 64 + impl From<AnnouncementGetRecordOutput<'_>> for Announcement<'static> { 65 + fn from(output: AnnouncementGetRecordOutput<'_>) -> Self { 66 + use jacquard_common::IntoStatic; 67 + output.value.into_static() 68 + } 31 69 }
+38
crates/jacquard-api/src/dev_fudgeu/experimental/atforumv1/forum/category.rs
··· 29 29 pub name: jacquard_common::CowStr<'a>, 30 30 } 31 31 32 + /// Typed wrapper for GetRecord response with this collection's record type. 33 + #[derive( 34 + serde::Serialize, 35 + serde::Deserialize, 36 + Debug, 37 + Clone, 38 + PartialEq, 39 + Eq, 40 + jacquard_derive::IntoStatic 41 + )] 42 + #[serde(rename_all = "camelCase")] 43 + pub struct CategoryGetRecordOutput<'a> { 44 + #[serde(skip_serializing_if = "std::option::Option::is_none")] 45 + #[serde(borrow)] 46 + pub cid: std::option::Option<jacquard_common::types::string::Cid<'a>>, 47 + #[serde(borrow)] 48 + pub uri: jacquard_common::types::string::AtUri<'a>, 49 + #[serde(borrow)] 50 + pub value: Category<'a>, 51 + } 52 + 53 + /// Marker type for deserializing records from this collection. 54 + pub struct CategoryRecord; 55 + impl jacquard_common::xrpc::XrpcResp for CategoryRecord { 56 + const NSID: &'static str = "dev.fudgeu.experimental.atforumv1.forum.category"; 57 + const ENCODING: &'static str = "application/json"; 58 + type Output<'de> = CategoryGetRecordOutput<'de>; 59 + type Err<'de> = jacquard_common::types::collection::RecordError<'de>; 60 + } 61 + 32 62 impl jacquard_common::types::collection::Collection for Category<'_> { 33 63 const NSID: &'static str = "dev.fudgeu.experimental.atforumv1.forum.category"; 64 + type Record = CategoryRecord; 65 + } 66 + 67 + impl From<CategoryGetRecordOutput<'_>> for Category<'static> { 68 + fn from(output: CategoryGetRecordOutput<'_>) -> Self { 69 + use jacquard_common::IntoStatic; 70 + output.value.into_static() 71 + } 34 72 }
+38
crates/jacquard-api/src/dev_fudgeu/experimental/atforumv1/forum/group.rs
··· 25 25 pub name: jacquard_common::CowStr<'a>, 26 26 } 27 27 28 + /// Typed wrapper for GetRecord response with this collection's record type. 29 + #[derive( 30 + serde::Serialize, 31 + serde::Deserialize, 32 + Debug, 33 + Clone, 34 + PartialEq, 35 + Eq, 36 + jacquard_derive::IntoStatic 37 + )] 38 + #[serde(rename_all = "camelCase")] 39 + pub struct GroupGetRecordOutput<'a> { 40 + #[serde(skip_serializing_if = "std::option::Option::is_none")] 41 + #[serde(borrow)] 42 + pub cid: std::option::Option<jacquard_common::types::string::Cid<'a>>, 43 + #[serde(borrow)] 44 + pub uri: jacquard_common::types::string::AtUri<'a>, 45 + #[serde(borrow)] 46 + pub value: Group<'a>, 47 + } 48 + 49 + /// Marker type for deserializing records from this collection. 50 + pub struct GroupRecord; 51 + impl jacquard_common::xrpc::XrpcResp for GroupRecord { 52 + const NSID: &'static str = "dev.fudgeu.experimental.atforumv1.forum.group"; 53 + const ENCODING: &'static str = "application/json"; 54 + type Output<'de> = GroupGetRecordOutput<'de>; 55 + type Err<'de> = jacquard_common::types::collection::RecordError<'de>; 56 + } 57 + 28 58 impl jacquard_common::types::collection::Collection for Group<'_> { 29 59 const NSID: &'static str = "dev.fudgeu.experimental.atforumv1.forum.group"; 60 + type Record = GroupRecord; 61 + } 62 + 63 + impl From<GroupGetRecordOutput<'_>> for Group<'static> { 64 + fn from(output: GroupGetRecordOutput<'_>) -> Self { 65 + use jacquard_common::IntoStatic; 66 + output.value.into_static() 67 + } 30 68 }
+38
crates/jacquard-api/src/dev_fudgeu/experimental/atforumv1/forum/identity.rs
··· 28 28 pub name: jacquard_common::CowStr<'a>, 29 29 } 30 30 31 + /// Typed wrapper for GetRecord response with this collection's record type. 32 + #[derive( 33 + serde::Serialize, 34 + serde::Deserialize, 35 + Debug, 36 + Clone, 37 + PartialEq, 38 + Eq, 39 + jacquard_derive::IntoStatic 40 + )] 41 + #[serde(rename_all = "camelCase")] 42 + pub struct IdentityGetRecordOutput<'a> { 43 + #[serde(skip_serializing_if = "std::option::Option::is_none")] 44 + #[serde(borrow)] 45 + pub cid: std::option::Option<jacquard_common::types::string::Cid<'a>>, 46 + #[serde(borrow)] 47 + pub uri: jacquard_common::types::string::AtUri<'a>, 48 + #[serde(borrow)] 49 + pub value: Identity<'a>, 50 + } 51 + 52 + /// Marker type for deserializing records from this collection. 53 + pub struct IdentityRecord; 54 + impl jacquard_common::xrpc::XrpcResp for IdentityRecord { 55 + const NSID: &'static str = "dev.fudgeu.experimental.atforumv1.forum.identity"; 56 + const ENCODING: &'static str = "application/json"; 57 + type Output<'de> = IdentityGetRecordOutput<'de>; 58 + type Err<'de> = jacquard_common::types::collection::RecordError<'de>; 59 + } 60 + 31 61 impl jacquard_common::types::collection::Collection for Identity<'_> { 32 62 const NSID: &'static str = "dev.fudgeu.experimental.atforumv1.forum.identity"; 63 + type Record = IdentityRecord; 64 + } 65 + 66 + impl From<IdentityGetRecordOutput<'_>> for Identity<'static> { 67 + fn from(output: IdentityGetRecordOutput<'_>) -> Self { 68 + use jacquard_common::IntoStatic; 69 + output.value.into_static() 70 + } 33 71 }
+38
crates/jacquard-api/src/dev_ocbwoy3/blueboard/board.rs
··· 29 29 pub title: jacquard_common::CowStr<'a>, 30 30 } 31 31 32 + /// Typed wrapper for GetRecord response with this collection's record type. 33 + #[derive( 34 + serde::Serialize, 35 + serde::Deserialize, 36 + Debug, 37 + Clone, 38 + PartialEq, 39 + Eq, 40 + jacquard_derive::IntoStatic 41 + )] 42 + #[serde(rename_all = "camelCase")] 43 + pub struct BoardGetRecordOutput<'a> { 44 + #[serde(skip_serializing_if = "std::option::Option::is_none")] 45 + #[serde(borrow)] 46 + pub cid: std::option::Option<jacquard_common::types::string::Cid<'a>>, 47 + #[serde(borrow)] 48 + pub uri: jacquard_common::types::string::AtUri<'a>, 49 + #[serde(borrow)] 50 + pub value: Board<'a>, 51 + } 52 + 53 + /// Marker type for deserializing records from this collection. 54 + pub struct BoardRecord; 55 + impl jacquard_common::xrpc::XrpcResp for BoardRecord { 56 + const NSID: &'static str = "dev.ocbwoy3.blueboard.board"; 57 + const ENCODING: &'static str = "application/json"; 58 + type Output<'de> = BoardGetRecordOutput<'de>; 59 + type Err<'de> = jacquard_common::types::collection::RecordError<'de>; 60 + } 61 + 32 62 impl jacquard_common::types::collection::Collection for Board<'_> { 33 63 const NSID: &'static str = "dev.ocbwoy3.blueboard.board"; 64 + type Record = BoardRecord; 65 + } 66 + 67 + impl From<BoardGetRecordOutput<'_>> for Board<'static> { 68 + fn from(output: BoardGetRecordOutput<'_>) -> Self { 69 + use jacquard_common::IntoStatic; 70 + output.value.into_static() 71 + } 34 72 }
+38
crates/jacquard-api/src/dev_ocbwoy3/blueboard/post.rs
··· 31 31 pub text: jacquard_common::CowStr<'a>, 32 32 } 33 33 34 + /// Typed wrapper for GetRecord response with this collection's record type. 35 + #[derive( 36 + serde::Serialize, 37 + serde::Deserialize, 38 + Debug, 39 + Clone, 40 + PartialEq, 41 + Eq, 42 + jacquard_derive::IntoStatic 43 + )] 44 + #[serde(rename_all = "camelCase")] 45 + pub struct PostGetRecordOutput<'a> { 46 + #[serde(skip_serializing_if = "std::option::Option::is_none")] 47 + #[serde(borrow)] 48 + pub cid: std::option::Option<jacquard_common::types::string::Cid<'a>>, 49 + #[serde(borrow)] 50 + pub uri: jacquard_common::types::string::AtUri<'a>, 51 + #[serde(borrow)] 52 + pub value: Post<'a>, 53 + } 54 + 55 + /// Marker type for deserializing records from this collection. 56 + pub struct PostRecord; 57 + impl jacquard_common::xrpc::XrpcResp for PostRecord { 58 + const NSID: &'static str = "dev.ocbwoy3.blueboard.post"; 59 + const ENCODING: &'static str = "application/json"; 60 + type Output<'de> = PostGetRecordOutput<'de>; 61 + type Err<'de> = jacquard_common::types::collection::RecordError<'de>; 62 + } 63 + 34 64 impl jacquard_common::types::collection::Collection for Post<'_> { 35 65 const NSID: &'static str = "dev.ocbwoy3.blueboard.post"; 66 + type Record = PostRecord; 67 + } 68 + 69 + impl From<PostGetRecordOutput<'_>> for Post<'static> { 70 + fn from(output: PostGetRecordOutput<'_>) -> Self { 71 + use jacquard_common::IntoStatic; 72 + output.value.into_static() 73 + } 36 74 }
+38
crates/jacquard-api/src/dev_regnault/webfishing/savefile.rs
··· 24 24 pub uri: jacquard_common::types::string::AtUri<'a>, 25 25 } 26 26 27 + /// Typed wrapper for GetRecord response with this collection's record type. 28 + #[derive( 29 + serde::Serialize, 30 + serde::Deserialize, 31 + Debug, 32 + Clone, 33 + PartialEq, 34 + Eq, 35 + jacquard_derive::IntoStatic 36 + )] 37 + #[serde(rename_all = "camelCase")] 38 + pub struct SavefileGetRecordOutput<'a> { 39 + #[serde(skip_serializing_if = "std::option::Option::is_none")] 40 + #[serde(borrow)] 41 + pub cid: std::option::Option<jacquard_common::types::string::Cid<'a>>, 42 + #[serde(borrow)] 43 + pub uri: jacquard_common::types::string::AtUri<'a>, 44 + #[serde(borrow)] 45 + pub value: Savefile<'a>, 46 + } 47 + 48 + /// Marker type for deserializing records from this collection. 49 + pub struct SavefileRecord; 50 + impl jacquard_common::xrpc::XrpcResp for SavefileRecord { 51 + const NSID: &'static str = "dev.regnault.webfishing.savefile"; 52 + const ENCODING: &'static str = "application/json"; 53 + type Output<'de> = SavefileGetRecordOutput<'de>; 54 + type Err<'de> = jacquard_common::types::collection::RecordError<'de>; 55 + } 56 + 27 57 impl jacquard_common::types::collection::Collection for Savefile<'_> { 28 58 const NSID: &'static str = "dev.regnault.webfishing.savefile"; 59 + type Record = SavefileRecord; 60 + } 61 + 62 + impl From<SavefileGetRecordOutput<'_>> for Savefile<'static> { 63 + fn from(output: SavefileGetRecordOutput<'_>) -> Self { 64 + use jacquard_common::IntoStatic; 65 + output.value.into_static() 66 + } 29 67 }
+38
crates/jacquard-api/src/fyi_unravel/frontpage/comment.rs
··· 30 30 pub post: crate::com_atproto::repo::strong_ref::StrongRef<'a>, 31 31 } 32 32 33 + /// Typed wrapper for GetRecord response with this collection's record type. 34 + #[derive( 35 + serde::Serialize, 36 + serde::Deserialize, 37 + Debug, 38 + Clone, 39 + PartialEq, 40 + Eq, 41 + jacquard_derive::IntoStatic 42 + )] 43 + #[serde(rename_all = "camelCase")] 44 + pub struct CommentGetRecordOutput<'a> { 45 + #[serde(skip_serializing_if = "std::option::Option::is_none")] 46 + #[serde(borrow)] 47 + pub cid: std::option::Option<jacquard_common::types::string::Cid<'a>>, 48 + #[serde(borrow)] 49 + pub uri: jacquard_common::types::string::AtUri<'a>, 50 + #[serde(borrow)] 51 + pub value: Comment<'a>, 52 + } 53 + 54 + /// Marker type for deserializing records from this collection. 55 + pub struct CommentRecord; 56 + impl jacquard_common::xrpc::XrpcResp for CommentRecord { 57 + const NSID: &'static str = "fyi.unravel.frontpage.comment"; 58 + const ENCODING: &'static str = "application/json"; 59 + type Output<'de> = CommentGetRecordOutput<'de>; 60 + type Err<'de> = jacquard_common::types::collection::RecordError<'de>; 61 + } 62 + 33 63 impl jacquard_common::types::collection::Collection for Comment<'_> { 34 64 const NSID: &'static str = "fyi.unravel.frontpage.comment"; 65 + type Record = CommentRecord; 66 + } 67 + 68 + impl From<CommentGetRecordOutput<'_>> for Comment<'static> { 69 + fn from(output: CommentGetRecordOutput<'_>) -> Self { 70 + use jacquard_common::IntoStatic; 71 + output.value.into_static() 72 + } 35 73 }
+38
crates/jacquard-api/src/fyi_unravel/frontpage/post.rs
··· 28 28 pub url: jacquard_common::types::string::Uri<'a>, 29 29 } 30 30 31 + /// Typed wrapper for GetRecord response with this collection's record type. 32 + #[derive( 33 + serde::Serialize, 34 + serde::Deserialize, 35 + Debug, 36 + Clone, 37 + PartialEq, 38 + Eq, 39 + jacquard_derive::IntoStatic 40 + )] 41 + #[serde(rename_all = "camelCase")] 42 + pub struct PostGetRecordOutput<'a> { 43 + #[serde(skip_serializing_if = "std::option::Option::is_none")] 44 + #[serde(borrow)] 45 + pub cid: std::option::Option<jacquard_common::types::string::Cid<'a>>, 46 + #[serde(borrow)] 47 + pub uri: jacquard_common::types::string::AtUri<'a>, 48 + #[serde(borrow)] 49 + pub value: Post<'a>, 50 + } 51 + 52 + /// Marker type for deserializing records from this collection. 53 + pub struct PostRecord; 54 + impl jacquard_common::xrpc::XrpcResp for PostRecord { 55 + const NSID: &'static str = "fyi.unravel.frontpage.post"; 56 + const ENCODING: &'static str = "application/json"; 57 + type Output<'de> = PostGetRecordOutput<'de>; 58 + type Err<'de> = jacquard_common::types::collection::RecordError<'de>; 59 + } 60 + 31 61 impl jacquard_common::types::collection::Collection for Post<'_> { 32 62 const NSID: &'static str = "fyi.unravel.frontpage.post"; 63 + type Record = PostRecord; 64 + } 65 + 66 + impl From<PostGetRecordOutput<'_>> for Post<'static> { 67 + fn from(output: PostGetRecordOutput<'_>) -> Self { 68 + use jacquard_common::IntoStatic; 69 + output.value.into_static() 70 + } 33 71 }
+38
crates/jacquard-api/src/fyi_unravel/frontpage/vote.rs
··· 24 24 pub subject: crate::com_atproto::repo::strong_ref::StrongRef<'a>, 25 25 } 26 26 27 + /// Typed wrapper for GetRecord response with this collection's record type. 28 + #[derive( 29 + serde::Serialize, 30 + serde::Deserialize, 31 + Debug, 32 + Clone, 33 + PartialEq, 34 + Eq, 35 + jacquard_derive::IntoStatic 36 + )] 37 + #[serde(rename_all = "camelCase")] 38 + pub struct VoteGetRecordOutput<'a> { 39 + #[serde(skip_serializing_if = "std::option::Option::is_none")] 40 + #[serde(borrow)] 41 + pub cid: std::option::Option<jacquard_common::types::string::Cid<'a>>, 42 + #[serde(borrow)] 43 + pub uri: jacquard_common::types::string::AtUri<'a>, 44 + #[serde(borrow)] 45 + pub value: Vote<'a>, 46 + } 47 + 48 + /// Marker type for deserializing records from this collection. 49 + pub struct VoteRecord; 50 + impl jacquard_common::xrpc::XrpcResp for VoteRecord { 51 + const NSID: &'static str = "fyi.unravel.frontpage.vote"; 52 + const ENCODING: &'static str = "application/json"; 53 + type Output<'de> = VoteGetRecordOutput<'de>; 54 + type Err<'de> = jacquard_common::types::collection::RecordError<'de>; 55 + } 56 + 27 57 impl jacquard_common::types::collection::Collection for Vote<'_> { 28 58 const NSID: &'static str = "fyi.unravel.frontpage.vote"; 59 + type Record = VoteRecord; 60 + } 61 + 62 + impl From<VoteGetRecordOutput<'_>> for Vote<'static> { 63 + fn from(output: VoteGetRecordOutput<'_>) -> Self { 64 + use jacquard_common::IntoStatic; 65 + output.value.into_static() 66 + } 29 67 }
+38
crates/jacquard-api/src/moe_karashiiro/kpaste/paste.rs
··· 35 35 pub updated_at: std::option::Option<jacquard_common::types::string::Datetime>, 36 36 } 37 37 38 + /// Typed wrapper for GetRecord response with this collection's record type. 39 + #[derive( 40 + serde::Serialize, 41 + serde::Deserialize, 42 + Debug, 43 + Clone, 44 + PartialEq, 45 + Eq, 46 + jacquard_derive::IntoStatic 47 + )] 48 + #[serde(rename_all = "camelCase")] 49 + pub struct PasteGetRecordOutput<'a> { 50 + #[serde(skip_serializing_if = "std::option::Option::is_none")] 51 + #[serde(borrow)] 52 + pub cid: std::option::Option<jacquard_common::types::string::Cid<'a>>, 53 + #[serde(borrow)] 54 + pub uri: jacquard_common::types::string::AtUri<'a>, 55 + #[serde(borrow)] 56 + pub value: Paste<'a>, 57 + } 58 + 59 + /// Marker type for deserializing records from this collection. 60 + pub struct PasteRecord; 61 + impl jacquard_common::xrpc::XrpcResp for PasteRecord { 62 + const NSID: &'static str = "moe.karashiiro.kpaste.paste"; 63 + const ENCODING: &'static str = "application/json"; 64 + type Output<'de> = PasteGetRecordOutput<'de>; 65 + type Err<'de> = jacquard_common::types::collection::RecordError<'de>; 66 + } 67 + 38 68 impl jacquard_common::types::collection::Collection for Paste<'_> { 39 69 const NSID: &'static str = "moe.karashiiro.kpaste.paste"; 70 + type Record = PasteRecord; 71 + } 72 + 73 + impl From<PasteGetRecordOutput<'_>> for Paste<'static> { 74 + fn from(output: PasteGetRecordOutput<'_>) -> Self { 75 + use jacquard_common::IntoStatic; 76 + output.value.into_static() 77 + } 40 78 }
+38
crates/jacquard-api/src/my_skylights/rel.rs
··· 29 29 pub rating: std::option::Option<crate::my_skylights::rel::Rating<'a>>, 30 30 } 31 31 32 + /// Typed wrapper for GetRecord response with this collection's record type. 33 + #[derive( 34 + serde::Serialize, 35 + serde::Deserialize, 36 + Debug, 37 + Clone, 38 + PartialEq, 39 + Eq, 40 + jacquard_derive::IntoStatic 41 + )] 42 + #[serde(rename_all = "camelCase")] 43 + pub struct RelGetRecordOutput<'a> { 44 + #[serde(skip_serializing_if = "std::option::Option::is_none")] 45 + #[serde(borrow)] 46 + pub cid: std::option::Option<jacquard_common::types::string::Cid<'a>>, 47 + #[serde(borrow)] 48 + pub uri: jacquard_common::types::string::AtUri<'a>, 49 + #[serde(borrow)] 50 + pub value: Rel<'a>, 51 + } 52 + 53 + /// Marker type for deserializing records from this collection. 54 + pub struct RelRecord; 55 + impl jacquard_common::xrpc::XrpcResp for RelRecord { 56 + const NSID: &'static str = "my.skylights.rel"; 57 + const ENCODING: &'static str = "application/json"; 58 + type Output<'de> = RelGetRecordOutput<'de>; 59 + type Err<'de> = jacquard_common::types::collection::RecordError<'de>; 60 + } 61 + 32 62 impl jacquard_common::types::collection::Collection for Rel<'_> { 33 63 const NSID: &'static str = "my.skylights.rel"; 64 + type Record = RelRecord; 65 + } 66 + 67 + impl From<RelGetRecordOutput<'_>> for Rel<'static> { 68 + fn from(output: RelGetRecordOutput<'_>) -> Self { 69 + use jacquard_common::IntoStatic; 70 + output.value.into_static() 71 + } 34 72 } 35 73 36 74 #[jacquard_derive::lexicon]
+38
crates/jacquard-api/src/net_aftertheinter/coolthingtwo.rs
··· 22 22 pub status: jacquard_common::CowStr<'a>, 23 23 } 24 24 25 + /// Typed wrapper for GetRecord response with this collection's record type. 26 + #[derive( 27 + serde::Serialize, 28 + serde::Deserialize, 29 + Debug, 30 + Clone, 31 + PartialEq, 32 + Eq, 33 + jacquard_derive::IntoStatic 34 + )] 35 + #[serde(rename_all = "camelCase")] 36 + pub struct CoolthingtwoGetRecordOutput<'a> { 37 + #[serde(skip_serializing_if = "std::option::Option::is_none")] 38 + #[serde(borrow)] 39 + pub cid: std::option::Option<jacquard_common::types::string::Cid<'a>>, 40 + #[serde(borrow)] 41 + pub uri: jacquard_common::types::string::AtUri<'a>, 42 + #[serde(borrow)] 43 + pub value: Coolthingtwo<'a>, 44 + } 45 + 46 + /// Marker type for deserializing records from this collection. 47 + pub struct CoolthingtwoRecord; 48 + impl jacquard_common::xrpc::XrpcResp for CoolthingtwoRecord { 49 + const NSID: &'static str = "net.aftertheinter.coolthingtwo"; 50 + const ENCODING: &'static str = "application/json"; 51 + type Output<'de> = CoolthingtwoGetRecordOutput<'de>; 52 + type Err<'de> = jacquard_common::types::collection::RecordError<'de>; 53 + } 54 + 25 55 impl jacquard_common::types::collection::Collection for Coolthingtwo<'_> { 26 56 const NSID: &'static str = "net.aftertheinter.coolthingtwo"; 57 + type Record = CoolthingtwoRecord; 58 + } 59 + 60 + impl From<CoolthingtwoGetRecordOutput<'_>> for Coolthingtwo<'static> { 61 + fn from(output: CoolthingtwoGetRecordOutput<'_>) -> Self { 62 + use jacquard_common::IntoStatic; 63 + output.value.into_static() 64 + } 27 65 }
+38
crates/jacquard-api/src/net_anisota/beta/game/collection.rs
··· 81 81 pub status: std::option::Option<jacquard_common::CowStr<'a>>, 82 82 } 83 83 84 + /// Typed wrapper for GetRecord response with this collection's record type. 85 + #[derive( 86 + serde::Serialize, 87 + serde::Deserialize, 88 + Debug, 89 + Clone, 90 + PartialEq, 91 + Eq, 92 + jacquard_derive::IntoStatic 93 + )] 94 + #[serde(rename_all = "camelCase")] 95 + pub struct CollectionGetRecordOutput<'a> { 96 + #[serde(skip_serializing_if = "std::option::Option::is_none")] 97 + #[serde(borrow)] 98 + pub cid: std::option::Option<jacquard_common::types::string::Cid<'a>>, 99 + #[serde(borrow)] 100 + pub uri: jacquard_common::types::string::AtUri<'a>, 101 + #[serde(borrow)] 102 + pub value: Collection<'a>, 103 + } 104 + 105 + /// Marker type for deserializing records from this collection. 106 + pub struct CollectionRecord; 107 + impl jacquard_common::xrpc::XrpcResp for CollectionRecord { 108 + const NSID: &'static str = "net.anisota.beta.game.collection"; 109 + const ENCODING: &'static str = "application/json"; 110 + type Output<'de> = CollectionGetRecordOutput<'de>; 111 + type Err<'de> = jacquard_common::types::collection::RecordError<'de>; 112 + } 113 + 84 114 impl jacquard_common::types::collection::Collection for Collection<'_> { 85 115 const NSID: &'static str = "net.anisota.beta.game.collection"; 116 + type Record = CollectionRecord; 117 + } 118 + 119 + impl From<CollectionGetRecordOutput<'_>> for Collection<'static> { 120 + fn from(output: CollectionGetRecordOutput<'_>) -> Self { 121 + use jacquard_common::IntoStatic; 122 + output.value.into_static() 123 + } 86 124 } 87 125 88 126 ///Additional details about how the specimen was acquired
+38
crates/jacquard-api/src/net_anisota/beta/game/inventory.rs
··· 70 70 pub stackable: std::option::Option<bool>, 71 71 } 72 72 73 + /// Typed wrapper for GetRecord response with this collection's record type. 74 + #[derive( 75 + serde::Serialize, 76 + serde::Deserialize, 77 + Debug, 78 + Clone, 79 + PartialEq, 80 + Eq, 81 + jacquard_derive::IntoStatic 82 + )] 83 + #[serde(rename_all = "camelCase")] 84 + pub struct InventoryGetRecordOutput<'a> { 85 + #[serde(skip_serializing_if = "std::option::Option::is_none")] 86 + #[serde(borrow)] 87 + pub cid: std::option::Option<jacquard_common::types::string::Cid<'a>>, 88 + #[serde(borrow)] 89 + pub uri: jacquard_common::types::string::AtUri<'a>, 90 + #[serde(borrow)] 91 + pub value: Inventory<'a>, 92 + } 93 + 94 + /// Marker type for deserializing records from this collection. 95 + pub struct InventoryRecord; 96 + impl jacquard_common::xrpc::XrpcResp for InventoryRecord { 97 + const NSID: &'static str = "net.anisota.beta.game.inventory"; 98 + const ENCODING: &'static str = "application/json"; 99 + type Output<'de> = InventoryGetRecordOutput<'de>; 100 + type Err<'de> = jacquard_common::types::collection::RecordError<'de>; 101 + } 102 + 73 103 impl jacquard_common::types::collection::Collection for Inventory<'_> { 74 104 const NSID: &'static str = "net.anisota.beta.game.inventory"; 105 + type Record = InventoryRecord; 106 + } 107 + 108 + impl From<InventoryGetRecordOutput<'_>> for Inventory<'static> { 109 + fn from(output: InventoryGetRecordOutput<'_>) -> Self { 110 + use jacquard_common::IntoStatic; 111 + output.value.into_static() 112 + } 75 113 } 76 114 77 115 ///Additional details about how the item was acquired
+38
crates/jacquard-api/src/net_anisota/beta/game/log.rs
··· 246 246 pub timestamp: jacquard_common::types::string::Datetime, 247 247 } 248 248 249 + /// Typed wrapper for GetRecord response with this collection's record type. 250 + #[derive( 251 + serde::Serialize, 252 + serde::Deserialize, 253 + Debug, 254 + Clone, 255 + PartialEq, 256 + Eq, 257 + jacquard_derive::IntoStatic 258 + )] 259 + #[serde(rename_all = "camelCase")] 260 + pub struct LogGetRecordOutput<'a> { 261 + #[serde(skip_serializing_if = "std::option::Option::is_none")] 262 + #[serde(borrow)] 263 + pub cid: std::option::Option<jacquard_common::types::string::Cid<'a>>, 264 + #[serde(borrow)] 265 + pub uri: jacquard_common::types::string::AtUri<'a>, 266 + #[serde(borrow)] 267 + pub value: Log<'a>, 268 + } 269 + 270 + /// Marker type for deserializing records from this collection. 271 + pub struct LogRecord; 272 + impl jacquard_common::xrpc::XrpcResp for LogRecord { 273 + const NSID: &'static str = "net.anisota.beta.game.log"; 274 + const ENCODING: &'static str = "application/json"; 275 + type Output<'de> = LogGetRecordOutput<'de>; 276 + type Err<'de> = jacquard_common::types::collection::RecordError<'de>; 277 + } 278 + 249 279 impl jacquard_common::types::collection::Collection for Log<'_> { 250 280 const NSID: &'static str = "net.anisota.beta.game.log"; 281 + type Record = LogRecord; 282 + } 283 + 284 + impl From<LogGetRecordOutput<'_>> for Log<'static> { 285 + fn from(output: LogGetRecordOutput<'_>) -> Self { 286 + use jacquard_common::IntoStatic; 287 + output.value.into_static() 288 + } 251 289 } 252 290 253 291 ///Additional event-specific metadata
+38
crates/jacquard-api/src/net_anisota/beta/game/pack.rs
··· 40 40 pub total_opens: i64, 41 41 } 42 42 43 + /// Typed wrapper for GetRecord response with this collection's record type. 44 + #[derive( 45 + serde::Serialize, 46 + serde::Deserialize, 47 + Debug, 48 + Clone, 49 + PartialEq, 50 + Eq, 51 + jacquard_derive::IntoStatic 52 + )] 53 + #[serde(rename_all = "camelCase")] 54 + pub struct PackGetRecordOutput<'a> { 55 + #[serde(skip_serializing_if = "std::option::Option::is_none")] 56 + #[serde(borrow)] 57 + pub cid: std::option::Option<jacquard_common::types::string::Cid<'a>>, 58 + #[serde(borrow)] 59 + pub uri: jacquard_common::types::string::AtUri<'a>, 60 + #[serde(borrow)] 61 + pub value: Pack<'a>, 62 + } 63 + 64 + /// Marker type for deserializing records from this collection. 65 + pub struct PackRecord; 66 + impl jacquard_common::xrpc::XrpcResp for PackRecord { 67 + const NSID: &'static str = "net.anisota.beta.game.pack"; 68 + const ENCODING: &'static str = "application/json"; 69 + type Output<'de> = PackGetRecordOutput<'de>; 70 + type Err<'de> = jacquard_common::types::collection::RecordError<'de>; 71 + } 72 + 43 73 impl jacquard_common::types::collection::Collection for Pack<'_> { 44 74 const NSID: &'static str = "net.anisota.beta.game.pack"; 75 + type Record = PackRecord; 76 + } 77 + 78 + impl From<PackGetRecordOutput<'_>> for Pack<'static> { 79 + fn from(output: PackGetRecordOutput<'_>) -> Self { 80 + use jacquard_common::IntoStatic; 81 + output.value.into_static() 82 + } 45 83 } 46 84 47 85 ///A single pack opening entry in the history
+38
crates/jacquard-api/src/net_anisota/beta/game/progress.rs
··· 69 69 pub xp_to_next_level: i64, 70 70 } 71 71 72 + /// Typed wrapper for GetRecord response with this collection's record type. 73 + #[derive( 74 + serde::Serialize, 75 + serde::Deserialize, 76 + Debug, 77 + Clone, 78 + PartialEq, 79 + Eq, 80 + jacquard_derive::IntoStatic 81 + )] 82 + #[serde(rename_all = "camelCase")] 83 + pub struct ProgressGetRecordOutput<'a> { 84 + #[serde(skip_serializing_if = "std::option::Option::is_none")] 85 + #[serde(borrow)] 86 + pub cid: std::option::Option<jacquard_common::types::string::Cid<'a>>, 87 + #[serde(borrow)] 88 + pub uri: jacquard_common::types::string::AtUri<'a>, 89 + #[serde(borrow)] 90 + pub value: Progress<'a>, 91 + } 92 + 93 + /// Marker type for deserializing records from this collection. 94 + pub struct ProgressRecord; 95 + impl jacquard_common::xrpc::XrpcResp for ProgressRecord { 96 + const NSID: &'static str = "net.anisota.beta.game.progress"; 97 + const ENCODING: &'static str = "application/json"; 98 + type Output<'de> = ProgressGetRecordOutput<'de>; 99 + type Err<'de> = jacquard_common::types::collection::RecordError<'de>; 100 + } 101 + 72 102 impl jacquard_common::types::collection::Collection for Progress<'_> { 73 103 const NSID: &'static str = "net.anisota.beta.game.progress"; 104 + type Record = ProgressRecord; 105 + } 106 + 107 + impl From<ProgressGetRecordOutput<'_>> for Progress<'static> { 108 + fn from(output: ProgressGetRecordOutput<'_>) -> Self { 109 + use jacquard_common::IntoStatic; 110 + output.value.into_static() 111 + } 74 112 } 75 113 76 114 ///Additional metadata about this progress update
+38
crates/jacquard-api/src/net_anisota/beta/game/session.rs
··· 144 144 pub updated_at: std::option::Option<jacquard_common::types::string::Datetime>, 145 145 } 146 146 147 + /// Typed wrapper for GetRecord response with this collection's record type. 148 + #[derive( 149 + serde::Serialize, 150 + serde::Deserialize, 151 + Debug, 152 + Clone, 153 + PartialEq, 154 + Eq, 155 + jacquard_derive::IntoStatic 156 + )] 157 + #[serde(rename_all = "camelCase")] 158 + pub struct SessionGetRecordOutput<'a> { 159 + #[serde(skip_serializing_if = "std::option::Option::is_none")] 160 + #[serde(borrow)] 161 + pub cid: std::option::Option<jacquard_common::types::string::Cid<'a>>, 162 + #[serde(borrow)] 163 + pub uri: jacquard_common::types::string::AtUri<'a>, 164 + #[serde(borrow)] 165 + pub value: Session<'a>, 166 + } 167 + 168 + /// Marker type for deserializing records from this collection. 169 + pub struct SessionRecord; 170 + impl jacquard_common::xrpc::XrpcResp for SessionRecord { 171 + const NSID: &'static str = "net.anisota.beta.game.session"; 172 + const ENCODING: &'static str = "application/json"; 173 + type Output<'de> = SessionGetRecordOutput<'de>; 174 + type Err<'de> = jacquard_common::types::collection::RecordError<'de>; 175 + } 176 + 147 177 impl jacquard_common::types::collection::Collection for Session<'_> { 148 178 const NSID: &'static str = "net.anisota.beta.game.session"; 179 + type Record = SessionRecord; 180 + } 181 + 182 + impl From<SessionGetRecordOutput<'_>> for Session<'static> { 183 + fn from(output: SessionGetRecordOutput<'_>) -> Self { 184 + use jacquard_common::IntoStatic; 185 + output.value.into_static() 186 + } 149 187 } 150 188 151 189 ///Additional session metadata
+38
crates/jacquard-api/src/net_anisota/feed/draft.rs
··· 74 74 RecordWithMedia(Box<crate::app_bsky::embed::record_with_media::RecordWithMedia<'a>>), 75 75 } 76 76 77 + /// Typed wrapper for GetRecord response with this collection's record type. 78 + #[derive( 79 + serde::Serialize, 80 + serde::Deserialize, 81 + Debug, 82 + Clone, 83 + PartialEq, 84 + Eq, 85 + jacquard_derive::IntoStatic 86 + )] 87 + #[serde(rename_all = "camelCase")] 88 + pub struct DraftGetRecordOutput<'a> { 89 + #[serde(skip_serializing_if = "std::option::Option::is_none")] 90 + #[serde(borrow)] 91 + pub cid: std::option::Option<jacquard_common::types::string::Cid<'a>>, 92 + #[serde(borrow)] 93 + pub uri: jacquard_common::types::string::AtUri<'a>, 94 + #[serde(borrow)] 95 + pub value: Draft<'a>, 96 + } 97 + 98 + /// Marker type for deserializing records from this collection. 99 + pub struct DraftRecord; 100 + impl jacquard_common::xrpc::XrpcResp for DraftRecord { 101 + const NSID: &'static str = "net.anisota.feed.draft"; 102 + const ENCODING: &'static str = "application/json"; 103 + type Output<'de> = DraftGetRecordOutput<'de>; 104 + type Err<'de> = jacquard_common::types::collection::RecordError<'de>; 105 + } 106 + 77 107 impl jacquard_common::types::collection::Collection for Draft<'_> { 78 108 const NSID: &'static str = "net.anisota.feed.draft"; 109 + type Record = DraftRecord; 110 + } 111 + 112 + impl From<DraftGetRecordOutput<'_>> for Draft<'static> { 113 + fn from(output: DraftGetRecordOutput<'_>) -> Self { 114 + use jacquard_common::IntoStatic; 115 + output.value.into_static() 116 + } 79 117 } 80 118 81 119 #[jacquard_derive::lexicon]
+38
crates/jacquard-api/src/net_anisota/feed/like.rs
··· 25 25 pub subject: crate::com_atproto::repo::strong_ref::StrongRef<'a>, 26 26 } 27 27 28 + /// Typed wrapper for GetRecord response with this collection's record type. 29 + #[derive( 30 + serde::Serialize, 31 + serde::Deserialize, 32 + Debug, 33 + Clone, 34 + PartialEq, 35 + Eq, 36 + jacquard_derive::IntoStatic 37 + )] 38 + #[serde(rename_all = "camelCase")] 39 + pub struct LikeGetRecordOutput<'a> { 40 + #[serde(skip_serializing_if = "std::option::Option::is_none")] 41 + #[serde(borrow)] 42 + pub cid: std::option::Option<jacquard_common::types::string::Cid<'a>>, 43 + #[serde(borrow)] 44 + pub uri: jacquard_common::types::string::AtUri<'a>, 45 + #[serde(borrow)] 46 + pub value: Like<'a>, 47 + } 48 + 49 + /// Marker type for deserializing records from this collection. 50 + pub struct LikeRecord; 51 + impl jacquard_common::xrpc::XrpcResp for LikeRecord { 52 + const NSID: &'static str = "net.anisota.feed.like"; 53 + const ENCODING: &'static str = "application/json"; 54 + type Output<'de> = LikeGetRecordOutput<'de>; 55 + type Err<'de> = jacquard_common::types::collection::RecordError<'de>; 56 + } 57 + 28 58 impl jacquard_common::types::collection::Collection for Like<'_> { 29 59 const NSID: &'static str = "net.anisota.feed.like"; 60 + type Record = LikeRecord; 61 + } 62 + 63 + impl From<LikeGetRecordOutput<'_>> for Like<'static> { 64 + fn from(output: LikeGetRecordOutput<'_>) -> Self { 65 + use jacquard_common::IntoStatic; 66 + output.value.into_static() 67 + } 30 68 }
+38
crates/jacquard-api/src/net_anisota/feed/list.rs
··· 37 37 pub tags: std::option::Option<Vec<jacquard_common::CowStr<'a>>>, 38 38 } 39 39 40 + /// Typed wrapper for GetRecord response with this collection's record type. 41 + #[derive( 42 + serde::Serialize, 43 + serde::Deserialize, 44 + Debug, 45 + Clone, 46 + PartialEq, 47 + Eq, 48 + jacquard_derive::IntoStatic 49 + )] 50 + #[serde(rename_all = "camelCase")] 51 + pub struct ListGetRecordOutput<'a> { 52 + #[serde(skip_serializing_if = "std::option::Option::is_none")] 53 + #[serde(borrow)] 54 + pub cid: std::option::Option<jacquard_common::types::string::Cid<'a>>, 55 + #[serde(borrow)] 56 + pub uri: jacquard_common::types::string::AtUri<'a>, 57 + #[serde(borrow)] 58 + pub value: List<'a>, 59 + } 60 + 61 + /// Marker type for deserializing records from this collection. 62 + pub struct ListRecord; 63 + impl jacquard_common::xrpc::XrpcResp for ListRecord { 64 + const NSID: &'static str = "net.anisota.feed.list"; 65 + const ENCODING: &'static str = "application/json"; 66 + type Output<'de> = ListGetRecordOutput<'de>; 67 + type Err<'de> = jacquard_common::types::collection::RecordError<'de>; 68 + } 69 + 40 70 impl jacquard_common::types::collection::Collection for List<'_> { 41 71 const NSID: &'static str = "net.anisota.feed.list"; 72 + type Record = ListRecord; 73 + } 74 + 75 + impl From<ListGetRecordOutput<'_>> for List<'static> { 76 + fn from(output: ListGetRecordOutput<'_>) -> Self { 77 + use jacquard_common::IntoStatic; 78 + output.value.into_static() 79 + } 42 80 }
+38
crates/jacquard-api/src/net_anisota/feed/list_item.rs
··· 28 28 pub subject: jacquard_common::types::string::AtUri<'a>, 29 29 } 30 30 31 + /// Typed wrapper for GetRecord response with this collection's record type. 32 + #[derive( 33 + serde::Serialize, 34 + serde::Deserialize, 35 + Debug, 36 + Clone, 37 + PartialEq, 38 + Eq, 39 + jacquard_derive::IntoStatic 40 + )] 41 + #[serde(rename_all = "camelCase")] 42 + pub struct ListItemGetRecordOutput<'a> { 43 + #[serde(skip_serializing_if = "std::option::Option::is_none")] 44 + #[serde(borrow)] 45 + pub cid: std::option::Option<jacquard_common::types::string::Cid<'a>>, 46 + #[serde(borrow)] 47 + pub uri: jacquard_common::types::string::AtUri<'a>, 48 + #[serde(borrow)] 49 + pub value: ListItem<'a>, 50 + } 51 + 52 + /// Marker type for deserializing records from this collection. 53 + pub struct ListItemRecord; 54 + impl jacquard_common::xrpc::XrpcResp for ListItemRecord { 55 + const NSID: &'static str = "net.anisota.feed.listItem"; 56 + const ENCODING: &'static str = "application/json"; 57 + type Output<'de> = ListItemGetRecordOutput<'de>; 58 + type Err<'de> = jacquard_common::types::collection::RecordError<'de>; 59 + } 60 + 31 61 impl jacquard_common::types::collection::Collection for ListItem<'_> { 32 62 const NSID: &'static str = "net.anisota.feed.listItem"; 63 + type Record = ListItemRecord; 64 + } 65 + 66 + impl From<ListItemGetRecordOutput<'_>> for ListItem<'static> { 67 + fn from(output: ListItemGetRecordOutput<'_>) -> Self { 68 + use jacquard_common::IntoStatic; 69 + output.value.into_static() 70 + } 33 71 }
+38
crates/jacquard-api/src/net_anisota/feed/post.rs
··· 71 71 RecordWithMedia(Box<crate::app_bsky::embed::record_with_media::RecordWithMedia<'a>>), 72 72 } 73 73 74 + /// Typed wrapper for GetRecord response with this collection's record type. 75 + #[derive( 76 + serde::Serialize, 77 + serde::Deserialize, 78 + Debug, 79 + Clone, 80 + PartialEq, 81 + Eq, 82 + jacquard_derive::IntoStatic 83 + )] 84 + #[serde(rename_all = "camelCase")] 85 + pub struct PostGetRecordOutput<'a> { 86 + #[serde(skip_serializing_if = "std::option::Option::is_none")] 87 + #[serde(borrow)] 88 + pub cid: std::option::Option<jacquard_common::types::string::Cid<'a>>, 89 + #[serde(borrow)] 90 + pub uri: jacquard_common::types::string::AtUri<'a>, 91 + #[serde(borrow)] 92 + pub value: Post<'a>, 93 + } 94 + 95 + /// Marker type for deserializing records from this collection. 96 + pub struct PostRecord; 97 + impl jacquard_common::xrpc::XrpcResp for PostRecord { 98 + const NSID: &'static str = "net.anisota.feed.post"; 99 + const ENCODING: &'static str = "application/json"; 100 + type Output<'de> = PostGetRecordOutput<'de>; 101 + type Err<'de> = jacquard_common::types::collection::RecordError<'de>; 102 + } 103 + 74 104 impl jacquard_common::types::collection::Collection for Post<'_> { 75 105 const NSID: &'static str = "net.anisota.feed.post"; 106 + type Record = PostRecord; 107 + } 108 + 109 + impl From<PostGetRecordOutput<'_>> for Post<'static> { 110 + fn from(output: PostGetRecordOutput<'_>) -> Self { 111 + use jacquard_common::IntoStatic; 112 + output.value.into_static() 113 + } 76 114 } 77 115 78 116 #[jacquard_derive::lexicon]
+38
crates/jacquard-api/src/net_anisota/feed/repost.rs
··· 25 25 pub subject: crate::com_atproto::repo::strong_ref::StrongRef<'a>, 26 26 } 27 27 28 + /// Typed wrapper for GetRecord response with this collection's record type. 29 + #[derive( 30 + serde::Serialize, 31 + serde::Deserialize, 32 + Debug, 33 + Clone, 34 + PartialEq, 35 + Eq, 36 + jacquard_derive::IntoStatic 37 + )] 38 + #[serde(rename_all = "camelCase")] 39 + pub struct RepostGetRecordOutput<'a> { 40 + #[serde(skip_serializing_if = "std::option::Option::is_none")] 41 + #[serde(borrow)] 42 + pub cid: std::option::Option<jacquard_common::types::string::Cid<'a>>, 43 + #[serde(borrow)] 44 + pub uri: jacquard_common::types::string::AtUri<'a>, 45 + #[serde(borrow)] 46 + pub value: Repost<'a>, 47 + } 48 + 49 + /// Marker type for deserializing records from this collection. 50 + pub struct RepostRecord; 51 + impl jacquard_common::xrpc::XrpcResp for RepostRecord { 52 + const NSID: &'static str = "net.anisota.feed.repost"; 53 + const ENCODING: &'static str = "application/json"; 54 + type Output<'de> = RepostGetRecordOutput<'de>; 55 + type Err<'de> = jacquard_common::types::collection::RecordError<'de>; 56 + } 57 + 28 58 impl jacquard_common::types::collection::Collection for Repost<'_> { 29 59 const NSID: &'static str = "net.anisota.feed.repost"; 60 + type Record = RepostRecord; 61 + } 62 + 63 + impl From<RepostGetRecordOutput<'_>> for Repost<'static> { 64 + fn from(output: RepostGetRecordOutput<'_>) -> Self { 65 + use jacquard_common::IntoStatic; 66 + output.value.into_static() 67 + } 30 68 }
+38
crates/jacquard-api/src/net_anisota/graph/list_mute.rs
··· 71 71 >, 72 72 } 73 73 74 + /// Typed wrapper for GetRecord response with this collection's record type. 75 + #[derive( 76 + serde::Serialize, 77 + serde::Deserialize, 78 + Debug, 79 + Clone, 80 + PartialEq, 81 + Eq, 82 + jacquard_derive::IntoStatic 83 + )] 84 + #[serde(rename_all = "camelCase")] 85 + pub struct ListMuteGetRecordOutput<'a> { 86 + #[serde(skip_serializing_if = "std::option::Option::is_none")] 87 + #[serde(borrow)] 88 + pub cid: std::option::Option<jacquard_common::types::string::Cid<'a>>, 89 + #[serde(borrow)] 90 + pub uri: jacquard_common::types::string::AtUri<'a>, 91 + #[serde(borrow)] 92 + pub value: ListMute<'a>, 93 + } 94 + 95 + /// Marker type for deserializing records from this collection. 96 + pub struct ListMuteRecord; 97 + impl jacquard_common::xrpc::XrpcResp for ListMuteRecord { 98 + const NSID: &'static str = "net.anisota.graph.listMute"; 99 + const ENCODING: &'static str = "application/json"; 100 + type Output<'de> = ListMuteGetRecordOutput<'de>; 101 + type Err<'de> = jacquard_common::types::collection::RecordError<'de>; 102 + } 103 + 74 104 impl jacquard_common::types::collection::Collection for ListMute<'_> { 75 105 const NSID: &'static str = "net.anisota.graph.listMute"; 106 + type Record = ListMuteRecord; 107 + } 108 + 109 + impl From<ListMuteGetRecordOutput<'_>> for ListMute<'static> { 110 + fn from(output: ListMuteGetRecordOutput<'_>) -> Self { 111 + use jacquard_common::IntoStatic; 112 + output.value.into_static() 113 + } 76 114 }
+38
crates/jacquard-api/src/net_anisota/graph/mute.rs
··· 71 71 >, 72 72 } 73 73 74 + /// Typed wrapper for GetRecord response with this collection's record type. 75 + #[derive( 76 + serde::Serialize, 77 + serde::Deserialize, 78 + Debug, 79 + Clone, 80 + PartialEq, 81 + Eq, 82 + jacquard_derive::IntoStatic 83 + )] 84 + #[serde(rename_all = "camelCase")] 85 + pub struct MuteGetRecordOutput<'a> { 86 + #[serde(skip_serializing_if = "std::option::Option::is_none")] 87 + #[serde(borrow)] 88 + pub cid: std::option::Option<jacquard_common::types::string::Cid<'a>>, 89 + #[serde(borrow)] 90 + pub uri: jacquard_common::types::string::AtUri<'a>, 91 + #[serde(borrow)] 92 + pub value: Mute<'a>, 93 + } 94 + 95 + /// Marker type for deserializing records from this collection. 96 + pub struct MuteRecord; 97 + impl jacquard_common::xrpc::XrpcResp for MuteRecord { 98 + const NSID: &'static str = "net.anisota.graph.mute"; 99 + const ENCODING: &'static str = "application/json"; 100 + type Output<'de> = MuteGetRecordOutput<'de>; 101 + type Err<'de> = jacquard_common::types::collection::RecordError<'de>; 102 + } 103 + 74 104 impl jacquard_common::types::collection::Collection for Mute<'_> { 75 105 const NSID: &'static str = "net.anisota.graph.mute"; 106 + type Record = MuteRecord; 107 + } 108 + 109 + impl From<MuteGetRecordOutput<'_>> for Mute<'static> { 110 + fn from(output: MuteGetRecordOutput<'_>) -> Self { 111 + use jacquard_common::IntoStatic; 112 + output.value.into_static() 113 + } 76 114 }
+38
crates/jacquard-api/src/net_bnewbold/demo/mushies.rs
··· 27 27 pub species: std::option::Option<jacquard_common::CowStr<'a>>, 28 28 } 29 29 30 + /// Typed wrapper for GetRecord response with this collection's record type. 31 + #[derive( 32 + serde::Serialize, 33 + serde::Deserialize, 34 + Debug, 35 + Clone, 36 + PartialEq, 37 + Eq, 38 + jacquard_derive::IntoStatic 39 + )] 40 + #[serde(rename_all = "camelCase")] 41 + pub struct MushiesGetRecordOutput<'a> { 42 + #[serde(skip_serializing_if = "std::option::Option::is_none")] 43 + #[serde(borrow)] 44 + pub cid: std::option::Option<jacquard_common::types::string::Cid<'a>>, 45 + #[serde(borrow)] 46 + pub uri: jacquard_common::types::string::AtUri<'a>, 47 + #[serde(borrow)] 48 + pub value: Mushies<'a>, 49 + } 50 + 51 + /// Marker type for deserializing records from this collection. 52 + pub struct MushiesRecord; 53 + impl jacquard_common::xrpc::XrpcResp for MushiesRecord { 54 + const NSID: &'static str = "net.bnewbold.demo.mushies"; 55 + const ENCODING: &'static str = "application/json"; 56 + type Output<'de> = MushiesGetRecordOutput<'de>; 57 + type Err<'de> = jacquard_common::types::collection::RecordError<'de>; 58 + } 59 + 30 60 impl jacquard_common::types::collection::Collection for Mushies<'_> { 31 61 const NSID: &'static str = "net.bnewbold.demo.mushies"; 62 + type Record = MushiesRecord; 63 + } 64 + 65 + impl From<MushiesGetRecordOutput<'_>> for Mushies<'static> { 66 + fn from(output: MushiesGetRecordOutput<'_>) -> Self { 67 + use jacquard_common::IntoStatic; 68 + output.value.into_static() 69 + } 32 70 }
+38
crates/jacquard-api/src/net_bnewbold/demo/mushroom.rs
··· 27 27 pub species: std::option::Option<jacquard_common::CowStr<'a>>, 28 28 } 29 29 30 + /// Typed wrapper for GetRecord response with this collection's record type. 31 + #[derive( 32 + serde::Serialize, 33 + serde::Deserialize, 34 + Debug, 35 + Clone, 36 + PartialEq, 37 + Eq, 38 + jacquard_derive::IntoStatic 39 + )] 40 + #[serde(rename_all = "camelCase")] 41 + pub struct MushroomGetRecordOutput<'a> { 42 + #[serde(skip_serializing_if = "std::option::Option::is_none")] 43 + #[serde(borrow)] 44 + pub cid: std::option::Option<jacquard_common::types::string::Cid<'a>>, 45 + #[serde(borrow)] 46 + pub uri: jacquard_common::types::string::AtUri<'a>, 47 + #[serde(borrow)] 48 + pub value: Mushroom<'a>, 49 + } 50 + 51 + /// Marker type for deserializing records from this collection. 52 + pub struct MushroomRecord; 53 + impl jacquard_common::xrpc::XrpcResp for MushroomRecord { 54 + const NSID: &'static str = "net.bnewbold.demo.mushroom"; 55 + const ENCODING: &'static str = "application/json"; 56 + type Output<'de> = MushroomGetRecordOutput<'de>; 57 + type Err<'de> = jacquard_common::types::collection::RecordError<'de>; 58 + } 59 + 30 60 impl jacquard_common::types::collection::Collection for Mushroom<'_> { 31 61 const NSID: &'static str = "net.bnewbold.demo.mushroom"; 62 + type Record = MushroomRecord; 63 + } 64 + 65 + impl From<MushroomGetRecordOutput<'_>> for Mushroom<'static> { 66 + fn from(output: MushroomGetRecordOutput<'_>) -> Self { 67 + use jacquard_common::IntoStatic; 68 + output.value.into_static() 69 + } 32 70 }
+38
crates/jacquard-api/src/net_bnewbold/m.rs
··· 27 27 pub species: std::option::Option<jacquard_common::CowStr<'a>>, 28 28 } 29 29 30 + /// Typed wrapper for GetRecord response with this collection's record type. 31 + #[derive( 32 + serde::Serialize, 33 + serde::Deserialize, 34 + Debug, 35 + Clone, 36 + PartialEq, 37 + Eq, 38 + jacquard_derive::IntoStatic 39 + )] 40 + #[serde(rename_all = "camelCase")] 41 + pub struct MGetRecordOutput<'a> { 42 + #[serde(skip_serializing_if = "std::option::Option::is_none")] 43 + #[serde(borrow)] 44 + pub cid: std::option::Option<jacquard_common::types::string::Cid<'a>>, 45 + #[serde(borrow)] 46 + pub uri: jacquard_common::types::string::AtUri<'a>, 47 + #[serde(borrow)] 48 + pub value: M<'a>, 49 + } 50 + 51 + /// Marker type for deserializing records from this collection. 52 + pub struct MRecord; 53 + impl jacquard_common::xrpc::XrpcResp for MRecord { 54 + const NSID: &'static str = "net.bnewbold.m"; 55 + const ENCODING: &'static str = "application/json"; 56 + type Output<'de> = MGetRecordOutput<'de>; 57 + type Err<'de> = jacquard_common::types::collection::RecordError<'de>; 58 + } 59 + 30 60 impl jacquard_common::types::collection::Collection for M<'_> { 31 61 const NSID: &'static str = "net.bnewbold.m"; 62 + type Record = MRecord; 63 + } 64 + 65 + impl From<MGetRecordOutput<'_>> for M<'static> { 66 + fn from(output: MGetRecordOutput<'_>) -> Self { 67 + use jacquard_common::IntoStatic; 68 + output.value.into_static() 69 + } 32 70 }
+38
crates/jacquard-api/src/net_mmatt/right/now.rs
··· 29 29 pub text: jacquard_common::CowStr<'a>, 30 30 } 31 31 32 + /// Typed wrapper for GetRecord response with this collection's record type. 33 + #[derive( 34 + serde::Serialize, 35 + serde::Deserialize, 36 + Debug, 37 + Clone, 38 + PartialEq, 39 + Eq, 40 + jacquard_derive::IntoStatic 41 + )] 42 + #[serde(rename_all = "camelCase")] 43 + pub struct NowGetRecordOutput<'a> { 44 + #[serde(skip_serializing_if = "std::option::Option::is_none")] 45 + #[serde(borrow)] 46 + pub cid: std::option::Option<jacquard_common::types::string::Cid<'a>>, 47 + #[serde(borrow)] 48 + pub uri: jacquard_common::types::string::AtUri<'a>, 49 + #[serde(borrow)] 50 + pub value: Now<'a>, 51 + } 52 + 53 + /// Marker type for deserializing records from this collection. 54 + pub struct NowRecord; 55 + impl jacquard_common::xrpc::XrpcResp for NowRecord { 56 + const NSID: &'static str = "net.mmatt.right.now"; 57 + const ENCODING: &'static str = "application/json"; 58 + type Output<'de> = NowGetRecordOutput<'de>; 59 + type Err<'de> = jacquard_common::types::collection::RecordError<'de>; 60 + } 61 + 32 62 impl jacquard_common::types::collection::Collection for Now<'_> { 33 63 const NSID: &'static str = "net.mmatt.right.now"; 64 + type Record = NowRecord; 65 + } 66 + 67 + impl From<NowGetRecordOutput<'_>> for Now<'static> { 68 + fn from(output: NowGetRecordOutput<'_>) -> Self { 69 + use jacquard_common::IntoStatic; 70 + output.value.into_static() 71 + } 34 72 }
+38
crates/jacquard-api/src/net_mmatt/vitals/car.rs
··· 42 42 pub created_at: jacquard_common::types::string::Datetime, 43 43 } 44 44 45 + /// Typed wrapper for GetRecord response with this collection's record type. 46 + #[derive( 47 + serde::Serialize, 48 + serde::Deserialize, 49 + Debug, 50 + Clone, 51 + PartialEq, 52 + Eq, 53 + jacquard_derive::IntoStatic 54 + )] 55 + #[serde(rename_all = "camelCase")] 56 + pub struct CarGetRecordOutput<'a> { 57 + #[serde(skip_serializing_if = "std::option::Option::is_none")] 58 + #[serde(borrow)] 59 + pub cid: std::option::Option<jacquard_common::types::string::Cid<'a>>, 60 + #[serde(borrow)] 61 + pub uri: jacquard_common::types::string::AtUri<'a>, 62 + #[serde(borrow)] 63 + pub value: Car<'a>, 64 + } 65 + 66 + /// Marker type for deserializing records from this collection. 67 + pub struct CarRecord; 68 + impl jacquard_common::xrpc::XrpcResp for CarRecord { 69 + const NSID: &'static str = "net.mmatt.vitals.car"; 70 + const ENCODING: &'static str = "application/json"; 71 + type Output<'de> = CarGetRecordOutput<'de>; 72 + type Err<'de> = jacquard_common::types::collection::RecordError<'de>; 73 + } 74 + 45 75 impl jacquard_common::types::collection::Collection for Car<'_> { 46 76 const NSID: &'static str = "net.mmatt.vitals.car"; 77 + type Record = CarRecord; 78 + } 79 + 80 + impl From<CarGetRecordOutput<'_>> for Car<'static> { 81 + fn from(output: CarGetRecordOutput<'_>) -> Self { 82 + use jacquard_common::IntoStatic; 83 + output.value.into_static() 84 + } 47 85 }
+38
crates/jacquard-api/src/network_slices/actor/profile.rs
··· 33 33 pub display_name: std::option::Option<jacquard_common::CowStr<'a>>, 34 34 } 35 35 36 + /// Typed wrapper for GetRecord response with this collection's record type. 37 + #[derive( 38 + serde::Serialize, 39 + serde::Deserialize, 40 + Debug, 41 + Clone, 42 + PartialEq, 43 + Eq, 44 + jacquard_derive::IntoStatic 45 + )] 46 + #[serde(rename_all = "camelCase")] 47 + pub struct ProfileGetRecordOutput<'a> { 48 + #[serde(skip_serializing_if = "std::option::Option::is_none")] 49 + #[serde(borrow)] 50 + pub cid: std::option::Option<jacquard_common::types::string::Cid<'a>>, 51 + #[serde(borrow)] 52 + pub uri: jacquard_common::types::string::AtUri<'a>, 53 + #[serde(borrow)] 54 + pub value: Profile<'a>, 55 + } 56 + 57 + /// Marker type for deserializing records from this collection. 58 + pub struct ProfileRecord; 59 + impl jacquard_common::xrpc::XrpcResp for ProfileRecord { 60 + const NSID: &'static str = "network.slices.actor.profile"; 61 + const ENCODING: &'static str = "application/json"; 62 + type Output<'de> = ProfileGetRecordOutput<'de>; 63 + type Err<'de> = jacquard_common::types::collection::RecordError<'de>; 64 + } 65 + 36 66 impl jacquard_common::types::collection::Collection for Profile<'_> { 37 67 const NSID: &'static str = "network.slices.actor.profile"; 68 + type Record = ProfileRecord; 69 + } 70 + 71 + impl From<ProfileGetRecordOutput<'_>> for Profile<'static> { 72 + fn from(output: ProfileGetRecordOutput<'_>) -> Self { 73 + use jacquard_common::IntoStatic; 74 + output.value.into_static() 75 + } 38 76 }
+38
crates/jacquard-api/src/network_slices/lexicon.rs
··· 40 40 pub updated_at: std::option::Option<jacquard_common::types::string::Datetime>, 41 41 } 42 42 43 + /// Typed wrapper for GetRecord response with this collection's record type. 44 + #[derive( 45 + serde::Serialize, 46 + serde::Deserialize, 47 + Debug, 48 + Clone, 49 + PartialEq, 50 + Eq, 51 + jacquard_derive::IntoStatic 52 + )] 53 + #[serde(rename_all = "camelCase")] 54 + pub struct LexiconGetRecordOutput<'a> { 55 + #[serde(skip_serializing_if = "std::option::Option::is_none")] 56 + #[serde(borrow)] 57 + pub cid: std::option::Option<jacquard_common::types::string::Cid<'a>>, 58 + #[serde(borrow)] 59 + pub uri: jacquard_common::types::string::AtUri<'a>, 60 + #[serde(borrow)] 61 + pub value: Lexicon<'a>, 62 + } 63 + 64 + /// Marker type for deserializing records from this collection. 65 + pub struct LexiconRecord; 66 + impl jacquard_common::xrpc::XrpcResp for LexiconRecord { 67 + const NSID: &'static str = "network.slices.lexicon"; 68 + const ENCODING: &'static str = "application/json"; 69 + type Output<'de> = LexiconGetRecordOutput<'de>; 70 + type Err<'de> = jacquard_common::types::collection::RecordError<'de>; 71 + } 72 + 43 73 impl jacquard_common::types::collection::Collection for Lexicon<'_> { 44 74 const NSID: &'static str = "network.slices.lexicon"; 75 + type Record = LexiconRecord; 76 + } 77 + 78 + impl From<LexiconGetRecordOutput<'_>> for Lexicon<'static> { 79 + fn from(output: LexiconGetRecordOutput<'_>) -> Self { 80 + use jacquard_common::IntoStatic; 81 + output.value.into_static() 82 + } 45 83 }
+38
crates/jacquard-api/src/network_slices/slice.rs
··· 44 44 pub name: jacquard_common::CowStr<'a>, 45 45 } 46 46 47 + /// Typed wrapper for GetRecord response with this collection's record type. 48 + #[derive( 49 + serde::Serialize, 50 + serde::Deserialize, 51 + Debug, 52 + Clone, 53 + PartialEq, 54 + Eq, 55 + jacquard_derive::IntoStatic 56 + )] 57 + #[serde(rename_all = "camelCase")] 58 + pub struct SliceGetRecordOutput<'a> { 59 + #[serde(skip_serializing_if = "std::option::Option::is_none")] 60 + #[serde(borrow)] 61 + pub cid: std::option::Option<jacquard_common::types::string::Cid<'a>>, 62 + #[serde(borrow)] 63 + pub uri: jacquard_common::types::string::AtUri<'a>, 64 + #[serde(borrow)] 65 + pub value: Slice<'a>, 66 + } 67 + 68 + /// Marker type for deserializing records from this collection. 69 + pub struct SliceRecord; 70 + impl jacquard_common::xrpc::XrpcResp for SliceRecord { 71 + const NSID: &'static str = "network.slices.slice"; 72 + const ENCODING: &'static str = "application/json"; 73 + type Output<'de> = SliceGetRecordOutput<'de>; 74 + type Err<'de> = jacquard_common::types::collection::RecordError<'de>; 75 + } 76 + 47 77 impl jacquard_common::types::collection::Collection for Slice<'_> { 48 78 const NSID: &'static str = "network.slices.slice"; 79 + type Record = SliceRecord; 80 + } 81 + 82 + impl From<SliceGetRecordOutput<'_>> for Slice<'static> { 83 + fn from(output: SliceGetRecordOutput<'_>) -> Self { 84 + use jacquard_common::IntoStatic; 85 + output.value.into_static() 86 + } 49 87 } 50 88 51 89 #[jacquard_derive::lexicon]
+38
crates/jacquard-api/src/network_slices/waitlist/invite.rs
··· 31 31 pub slice: jacquard_common::types::string::AtUri<'a>, 32 32 } 33 33 34 + /// Typed wrapper for GetRecord response with this collection's record type. 35 + #[derive( 36 + serde::Serialize, 37 + serde::Deserialize, 38 + Debug, 39 + Clone, 40 + PartialEq, 41 + Eq, 42 + jacquard_derive::IntoStatic 43 + )] 44 + #[serde(rename_all = "camelCase")] 45 + pub struct InviteGetRecordOutput<'a> { 46 + #[serde(skip_serializing_if = "std::option::Option::is_none")] 47 + #[serde(borrow)] 48 + pub cid: std::option::Option<jacquard_common::types::string::Cid<'a>>, 49 + #[serde(borrow)] 50 + pub uri: jacquard_common::types::string::AtUri<'a>, 51 + #[serde(borrow)] 52 + pub value: Invite<'a>, 53 + } 54 + 55 + /// Marker type for deserializing records from this collection. 56 + pub struct InviteRecord; 57 + impl jacquard_common::xrpc::XrpcResp for InviteRecord { 58 + const NSID: &'static str = "network.slices.waitlist.invite"; 59 + const ENCODING: &'static str = "application/json"; 60 + type Output<'de> = InviteGetRecordOutput<'de>; 61 + type Err<'de> = jacquard_common::types::collection::RecordError<'de>; 62 + } 63 + 34 64 impl jacquard_common::types::collection::Collection for Invite<'_> { 35 65 const NSID: &'static str = "network.slices.waitlist.invite"; 66 + type Record = InviteRecord; 67 + } 68 + 69 + impl From<InviteGetRecordOutput<'_>> for Invite<'static> { 70 + fn from(output: InviteGetRecordOutput<'_>) -> Self { 71 + use jacquard_common::IntoStatic; 72 + output.value.into_static() 73 + } 36 74 }
+38
crates/jacquard-api/src/network_slices/waitlist/request.rs
··· 25 25 pub slice: jacquard_common::types::string::AtUri<'a>, 26 26 } 27 27 28 + /// Typed wrapper for GetRecord response with this collection's record type. 29 + #[derive( 30 + serde::Serialize, 31 + serde::Deserialize, 32 + Debug, 33 + Clone, 34 + PartialEq, 35 + Eq, 36 + jacquard_derive::IntoStatic 37 + )] 38 + #[serde(rename_all = "camelCase")] 39 + pub struct RequestGetRecordOutput<'a> { 40 + #[serde(skip_serializing_if = "std::option::Option::is_none")] 41 + #[serde(borrow)] 42 + pub cid: std::option::Option<jacquard_common::types::string::Cid<'a>>, 43 + #[serde(borrow)] 44 + pub uri: jacquard_common::types::string::AtUri<'a>, 45 + #[serde(borrow)] 46 + pub value: Request<'a>, 47 + } 48 + 49 + /// Marker type for deserializing records from this collection. 50 + pub struct RequestRecord; 51 + impl jacquard_common::xrpc::XrpcResp for RequestRecord { 52 + const NSID: &'static str = "network.slices.waitlist.request"; 53 + const ENCODING: &'static str = "application/json"; 54 + type Output<'de> = RequestGetRecordOutput<'de>; 55 + type Err<'de> = jacquard_common::types::collection::RecordError<'de>; 56 + } 57 + 28 58 impl jacquard_common::types::collection::Collection for Request<'_> { 29 59 const NSID: &'static str = "network.slices.waitlist.request"; 60 + type Record = RequestRecord; 61 + } 62 + 63 + impl From<RequestGetRecordOutput<'_>> for Request<'static> { 64 + fn from(output: RequestGetRecordOutput<'_>) -> Self { 65 + use jacquard_common::IntoStatic; 66 + output.value.into_static() 67 + } 30 68 }
+38
crates/jacquard-api/src/org_devcon/event/test.rs
··· 40 40 pub url: std::option::Option<jacquard_common::CowStr<'a>>, 41 41 } 42 42 43 + /// Typed wrapper for GetRecord response with this collection's record type. 44 + #[derive( 45 + serde::Serialize, 46 + serde::Deserialize, 47 + Debug, 48 + Clone, 49 + PartialEq, 50 + Eq, 51 + jacquard_derive::IntoStatic 52 + )] 53 + #[serde(rename_all = "camelCase")] 54 + pub struct TestGetRecordOutput<'a> { 55 + #[serde(skip_serializing_if = "std::option::Option::is_none")] 56 + #[serde(borrow)] 57 + pub cid: std::option::Option<jacquard_common::types::string::Cid<'a>>, 58 + #[serde(borrow)] 59 + pub uri: jacquard_common::types::string::AtUri<'a>, 60 + #[serde(borrow)] 61 + pub value: Test<'a>, 62 + } 63 + 64 + /// Marker type for deserializing records from this collection. 65 + pub struct TestRecord; 66 + impl jacquard_common::xrpc::XrpcResp for TestRecord { 67 + const NSID: &'static str = "org.devcon.event.test"; 68 + const ENCODING: &'static str = "application/json"; 69 + type Output<'de> = TestGetRecordOutput<'de>; 70 + type Err<'de> = jacquard_common::types::collection::RecordError<'de>; 71 + } 72 + 43 73 impl jacquard_common::types::collection::Collection for Test<'_> { 44 74 const NSID: &'static str = "org.devcon.event.test"; 75 + type Record = TestRecord; 76 + } 77 + 78 + impl From<TestGetRecordOutput<'_>> for Test<'static> { 79 + fn from(output: TestGetRecordOutput<'_>) -> Self { 80 + use jacquard_common::IntoStatic; 81 + output.value.into_static() 82 + } 45 83 }
+38
crates/jacquard-api/src/org_robocracy/demo/fungus.rs
··· 27 27 pub species: std::option::Option<jacquard_common::CowStr<'a>>, 28 28 } 29 29 30 + /// Typed wrapper for GetRecord response with this collection's record type. 31 + #[derive( 32 + serde::Serialize, 33 + serde::Deserialize, 34 + Debug, 35 + Clone, 36 + PartialEq, 37 + Eq, 38 + jacquard_derive::IntoStatic 39 + )] 40 + #[serde(rename_all = "camelCase")] 41 + pub struct FungusGetRecordOutput<'a> { 42 + #[serde(skip_serializing_if = "std::option::Option::is_none")] 43 + #[serde(borrow)] 44 + pub cid: std::option::Option<jacquard_common::types::string::Cid<'a>>, 45 + #[serde(borrow)] 46 + pub uri: jacquard_common::types::string::AtUri<'a>, 47 + #[serde(borrow)] 48 + pub value: Fungus<'a>, 49 + } 50 + 51 + /// Marker type for deserializing records from this collection. 52 + pub struct FungusRecord; 53 + impl jacquard_common::xrpc::XrpcResp for FungusRecord { 54 + const NSID: &'static str = "org.robocracy.demo.fungus"; 55 + const ENCODING: &'static str = "application/json"; 56 + type Output<'de> = FungusGetRecordOutput<'de>; 57 + type Err<'de> = jacquard_common::types::collection::RecordError<'de>; 58 + } 59 + 30 60 impl jacquard_common::types::collection::Collection for Fungus<'_> { 31 61 const NSID: &'static str = "org.robocracy.demo.fungus"; 62 + type Record = FungusRecord; 63 + } 64 + 65 + impl From<FungusGetRecordOutput<'_>> for Fungus<'static> { 66 + fn from(output: FungusGetRecordOutput<'_>) -> Self { 67 + use jacquard_common::IntoStatic; 68 + output.value.into_static() 69 + } 32 70 }
+38
crates/jacquard-api/src/org_robocracy/demo/mushies.rs
··· 27 27 pub species: std::option::Option<jacquard_common::CowStr<'a>>, 28 28 } 29 29 30 + /// Typed wrapper for GetRecord response with this collection's record type. 31 + #[derive( 32 + serde::Serialize, 33 + serde::Deserialize, 34 + Debug, 35 + Clone, 36 + PartialEq, 37 + Eq, 38 + jacquard_derive::IntoStatic 39 + )] 40 + #[serde(rename_all = "camelCase")] 41 + pub struct MushiesGetRecordOutput<'a> { 42 + #[serde(skip_serializing_if = "std::option::Option::is_none")] 43 + #[serde(borrow)] 44 + pub cid: std::option::Option<jacquard_common::types::string::Cid<'a>>, 45 + #[serde(borrow)] 46 + pub uri: jacquard_common::types::string::AtUri<'a>, 47 + #[serde(borrow)] 48 + pub value: Mushies<'a>, 49 + } 50 + 51 + /// Marker type for deserializing records from this collection. 52 + pub struct MushiesRecord; 53 + impl jacquard_common::xrpc::XrpcResp for MushiesRecord { 54 + const NSID: &'static str = "org.robocracy.demo.mushies"; 55 + const ENCODING: &'static str = "application/json"; 56 + type Output<'de> = MushiesGetRecordOutput<'de>; 57 + type Err<'de> = jacquard_common::types::collection::RecordError<'de>; 58 + } 59 + 30 60 impl jacquard_common::types::collection::Collection for Mushies<'_> { 31 61 const NSID: &'static str = "org.robocracy.demo.mushies"; 62 + type Record = MushiesRecord; 63 + } 64 + 65 + impl From<MushiesGetRecordOutput<'_>> for Mushies<'static> { 66 + fn from(output: MushiesGetRecordOutput<'_>) -> Self { 67 + use jacquard_common::IntoStatic; 68 + output.value.into_static() 69 + } 32 70 }
+38
crates/jacquard-api/src/place_atwork/endorsement.rs
··· 37 37 pub text: jacquard_common::CowStr<'a>, 38 38 } 39 39 40 + /// Typed wrapper for GetRecord response with this collection's record type. 41 + #[derive( 42 + serde::Serialize, 43 + serde::Deserialize, 44 + Debug, 45 + Clone, 46 + PartialEq, 47 + Eq, 48 + jacquard_derive::IntoStatic 49 + )] 50 + #[serde(rename_all = "camelCase")] 51 + pub struct EndorsementGetRecordOutput<'a> { 52 + #[serde(skip_serializing_if = "std::option::Option::is_none")] 53 + #[serde(borrow)] 54 + pub cid: std::option::Option<jacquard_common::types::string::Cid<'a>>, 55 + #[serde(borrow)] 56 + pub uri: jacquard_common::types::string::AtUri<'a>, 57 + #[serde(borrow)] 58 + pub value: Endorsement<'a>, 59 + } 60 + 61 + /// Marker type for deserializing records from this collection. 62 + pub struct EndorsementRecord; 63 + impl jacquard_common::xrpc::XrpcResp for EndorsementRecord { 64 + const NSID: &'static str = "place.atwork.endorsement"; 65 + const ENCODING: &'static str = "application/json"; 66 + type Output<'de> = EndorsementGetRecordOutput<'de>; 67 + type Err<'de> = jacquard_common::types::collection::RecordError<'de>; 68 + } 69 + 40 70 impl jacquard_common::types::collection::Collection for Endorsement<'_> { 41 71 const NSID: &'static str = "place.atwork.endorsement"; 72 + type Record = EndorsementRecord; 73 + } 74 + 75 + impl From<EndorsementGetRecordOutput<'_>> for Endorsement<'static> { 76 + fn from(output: EndorsementGetRecordOutput<'_>) -> Self { 77 + use jacquard_common::IntoStatic; 78 + output.value.into_static() 79 + } 42 80 }
+38
crates/jacquard-api/src/place_atwork/endorsement_proof.rs
··· 23 23 pub cid: jacquard_common::types::string::Cid<'a>, 24 24 } 25 25 26 + /// Typed wrapper for GetRecord response with this collection's record type. 27 + #[derive( 28 + serde::Serialize, 29 + serde::Deserialize, 30 + Debug, 31 + Clone, 32 + PartialEq, 33 + Eq, 34 + jacquard_derive::IntoStatic 35 + )] 36 + #[serde(rename_all = "camelCase")] 37 + pub struct EndorsementProofGetRecordOutput<'a> { 38 + #[serde(skip_serializing_if = "std::option::Option::is_none")] 39 + #[serde(borrow)] 40 + pub cid: std::option::Option<jacquard_common::types::string::Cid<'a>>, 41 + #[serde(borrow)] 42 + pub uri: jacquard_common::types::string::AtUri<'a>, 43 + #[serde(borrow)] 44 + pub value: EndorsementProof<'a>, 45 + } 46 + 47 + /// Marker type for deserializing records from this collection. 48 + pub struct EndorsementProofRecord; 49 + impl jacquard_common::xrpc::XrpcResp for EndorsementProofRecord { 50 + const NSID: &'static str = "place.atwork.endorsementProof"; 51 + const ENCODING: &'static str = "application/json"; 52 + type Output<'de> = EndorsementProofGetRecordOutput<'de>; 53 + type Err<'de> = jacquard_common::types::collection::RecordError<'de>; 54 + } 55 + 26 56 impl jacquard_common::types::collection::Collection for EndorsementProof<'_> { 27 57 const NSID: &'static str = "place.atwork.endorsementProof"; 58 + type Record = EndorsementProofRecord; 59 + } 60 + 61 + impl From<EndorsementProofGetRecordOutput<'_>> for EndorsementProof<'static> { 62 + fn from(output: EndorsementProofGetRecordOutput<'_>) -> Self { 63 + use jacquard_common::IntoStatic; 64 + output.value.into_static() 65 + } 28 66 }
+38
crates/jacquard-api/src/place_atwork/listing.rs
··· 48 48 pub title: jacquard_common::CowStr<'a>, 49 49 } 50 50 51 + /// Typed wrapper for GetRecord response with this collection's record type. 52 + #[derive( 53 + serde::Serialize, 54 + serde::Deserialize, 55 + Debug, 56 + Clone, 57 + PartialEq, 58 + Eq, 59 + jacquard_derive::IntoStatic 60 + )] 61 + #[serde(rename_all = "camelCase")] 62 + pub struct ListingGetRecordOutput<'a> { 63 + #[serde(skip_serializing_if = "std::option::Option::is_none")] 64 + #[serde(borrow)] 65 + pub cid: std::option::Option<jacquard_common::types::string::Cid<'a>>, 66 + #[serde(borrow)] 67 + pub uri: jacquard_common::types::string::AtUri<'a>, 68 + #[serde(borrow)] 69 + pub value: Listing<'a>, 70 + } 71 + 72 + /// Marker type for deserializing records from this collection. 73 + pub struct ListingRecord; 74 + impl jacquard_common::xrpc::XrpcResp for ListingRecord { 75 + const NSID: &'static str = "place.atwork.listing"; 76 + const ENCODING: &'static str = "application/json"; 77 + type Output<'de> = ListingGetRecordOutput<'de>; 78 + type Err<'de> = jacquard_common::types::collection::RecordError<'de>; 79 + } 80 + 51 81 impl jacquard_common::types::collection::Collection for Listing<'_> { 52 82 const NSID: &'static str = "place.atwork.listing"; 83 + type Record = ListingRecord; 84 + } 85 + 86 + impl From<ListingGetRecordOutput<'_>> for Listing<'static> { 87 + fn from(output: ListingGetRecordOutput<'_>) -> Self { 88 + use jacquard_common::IntoStatic; 89 + output.value.into_static() 90 + } 53 91 }
+38
crates/jacquard-api/src/place_atwork/profile.rs
··· 88 88 pub status: std::option::Option<jacquard_common::CowStr<'a>>, 89 89 } 90 90 91 + /// Typed wrapper for GetRecord response with this collection's record type. 92 + #[derive( 93 + serde::Serialize, 94 + serde::Deserialize, 95 + Debug, 96 + Clone, 97 + PartialEq, 98 + Eq, 99 + jacquard_derive::IntoStatic 100 + )] 101 + #[serde(rename_all = "camelCase")] 102 + pub struct ProfileGetRecordOutput<'a> { 103 + #[serde(skip_serializing_if = "std::option::Option::is_none")] 104 + #[serde(borrow)] 105 + pub cid: std::option::Option<jacquard_common::types::string::Cid<'a>>, 106 + #[serde(borrow)] 107 + pub uri: jacquard_common::types::string::AtUri<'a>, 108 + #[serde(borrow)] 109 + pub value: Profile<'a>, 110 + } 111 + 112 + /// Marker type for deserializing records from this collection. 113 + pub struct ProfileRecord; 114 + impl jacquard_common::xrpc::XrpcResp for ProfileRecord { 115 + const NSID: &'static str = "place.atwork.profile"; 116 + const ENCODING: &'static str = "application/json"; 117 + type Output<'de> = ProfileGetRecordOutput<'de>; 118 + type Err<'de> = jacquard_common::types::collection::RecordError<'de>; 119 + } 120 + 91 121 impl jacquard_common::types::collection::Collection for Profile<'_> { 92 122 const NSID: &'static str = "place.atwork.profile"; 123 + type Record = ProfileRecord; 124 + } 125 + 126 + impl From<ProfileGetRecordOutput<'_>> for Profile<'static> { 127 + fn from(output: ProfileGetRecordOutput<'_>) -> Self { 128 + use jacquard_common::IntoStatic; 129 + output.value.into_static() 130 + } 93 131 }
+38
crates/jacquard-api/src/place_stream/chat/gate.rs
··· 23 23 pub hidden_message: jacquard_common::types::string::AtUri<'a>, 24 24 } 25 25 26 + /// Typed wrapper for GetRecord response with this collection's record type. 27 + #[derive( 28 + serde::Serialize, 29 + serde::Deserialize, 30 + Debug, 31 + Clone, 32 + PartialEq, 33 + Eq, 34 + jacquard_derive::IntoStatic 35 + )] 36 + #[serde(rename_all = "camelCase")] 37 + pub struct GateGetRecordOutput<'a> { 38 + #[serde(skip_serializing_if = "std::option::Option::is_none")] 39 + #[serde(borrow)] 40 + pub cid: std::option::Option<jacquard_common::types::string::Cid<'a>>, 41 + #[serde(borrow)] 42 + pub uri: jacquard_common::types::string::AtUri<'a>, 43 + #[serde(borrow)] 44 + pub value: Gate<'a>, 45 + } 46 + 47 + /// Marker type for deserializing records from this collection. 48 + pub struct GateRecord; 49 + impl jacquard_common::xrpc::XrpcResp for GateRecord { 50 + const NSID: &'static str = "place.stream.chat.gate"; 51 + const ENCODING: &'static str = "application/json"; 52 + type Output<'de> = GateGetRecordOutput<'de>; 53 + type Err<'de> = jacquard_common::types::collection::RecordError<'de>; 54 + } 55 + 26 56 impl jacquard_common::types::collection::Collection for Gate<'_> { 27 57 const NSID: &'static str = "place.stream.chat.gate"; 58 + type Record = GateRecord; 59 + } 60 + 61 + impl From<GateGetRecordOutput<'_>> for Gate<'static> { 62 + fn from(output: GateGetRecordOutput<'_>) -> Self { 63 + use jacquard_common::IntoStatic; 64 + output.value.into_static() 65 + } 28 66 }
+38
crates/jacquard-api/src/place_stream/chat/message.rs
··· 37 37 pub text: jacquard_common::CowStr<'a>, 38 38 } 39 39 40 + /// Typed wrapper for GetRecord response with this collection's record type. 41 + #[derive( 42 + serde::Serialize, 43 + serde::Deserialize, 44 + Debug, 45 + Clone, 46 + PartialEq, 47 + Eq, 48 + jacquard_derive::IntoStatic 49 + )] 50 + #[serde(rename_all = "camelCase")] 51 + pub struct MessageGetRecordOutput<'a> { 52 + #[serde(skip_serializing_if = "std::option::Option::is_none")] 53 + #[serde(borrow)] 54 + pub cid: std::option::Option<jacquard_common::types::string::Cid<'a>>, 55 + #[serde(borrow)] 56 + pub uri: jacquard_common::types::string::AtUri<'a>, 57 + #[serde(borrow)] 58 + pub value: Message<'a>, 59 + } 60 + 61 + /// Marker type for deserializing records from this collection. 62 + pub struct MessageRecord; 63 + impl jacquard_common::xrpc::XrpcResp for MessageRecord { 64 + const NSID: &'static str = "place.stream.chat.message"; 65 + const ENCODING: &'static str = "application/json"; 66 + type Output<'de> = MessageGetRecordOutput<'de>; 67 + type Err<'de> = jacquard_common::types::collection::RecordError<'de>; 68 + } 69 + 40 70 impl jacquard_common::types::collection::Collection for Message<'_> { 41 71 const NSID: &'static str = "place.stream.chat.message"; 72 + type Record = MessageRecord; 73 + } 74 + 75 + impl From<MessageGetRecordOutput<'_>> for Message<'static> { 76 + fn from(output: MessageGetRecordOutput<'_>) -> Self { 77 + use jacquard_common::IntoStatic; 78 + output.value.into_static() 79 + } 42 80 } 43 81 44 82 #[jacquard_derive::lexicon]
+38
crates/jacquard-api/src/place_stream/chat/profile.rs
··· 41 41 pub color: std::option::Option<crate::place_stream::chat::profile::Color<'a>>, 42 42 } 43 43 44 + /// Typed wrapper for GetRecord response with this collection's record type. 45 + #[derive( 46 + serde::Serialize, 47 + serde::Deserialize, 48 + Debug, 49 + Clone, 50 + PartialEq, 51 + Eq, 52 + jacquard_derive::IntoStatic 53 + )] 54 + #[serde(rename_all = "camelCase")] 55 + pub struct ProfileGetRecordOutput<'a> { 56 + #[serde(skip_serializing_if = "std::option::Option::is_none")] 57 + #[serde(borrow)] 58 + pub cid: std::option::Option<jacquard_common::types::string::Cid<'a>>, 59 + #[serde(borrow)] 60 + pub uri: jacquard_common::types::string::AtUri<'a>, 61 + #[serde(borrow)] 62 + pub value: Profile<'a>, 63 + } 64 + 65 + /// Marker type for deserializing records from this collection. 66 + pub struct ProfileRecord; 67 + impl jacquard_common::xrpc::XrpcResp for ProfileRecord { 68 + const NSID: &'static str = "place.stream.chat.profile"; 69 + const ENCODING: &'static str = "application/json"; 70 + type Output<'de> = ProfileGetRecordOutput<'de>; 71 + type Err<'de> = jacquard_common::types::collection::RecordError<'de>; 72 + } 73 + 44 74 impl jacquard_common::types::collection::Collection for Profile<'_> { 45 75 const NSID: &'static str = "place.stream.chat.profile"; 76 + type Record = ProfileRecord; 77 + } 78 + 79 + impl From<ProfileGetRecordOutput<'_>> for Profile<'static> { 80 + fn from(output: ProfileGetRecordOutput<'_>) -> Self { 81 + use jacquard_common::IntoStatic; 82 + output.value.into_static() 83 + } 46 84 }
+38
crates/jacquard-api/src/place_stream/key.rs
··· 29 29 pub signing_key: jacquard_common::CowStr<'a>, 30 30 } 31 31 32 + /// Typed wrapper for GetRecord response with this collection's record type. 33 + #[derive( 34 + serde::Serialize, 35 + serde::Deserialize, 36 + Debug, 37 + Clone, 38 + PartialEq, 39 + Eq, 40 + jacquard_derive::IntoStatic 41 + )] 42 + #[serde(rename_all = "camelCase")] 43 + pub struct KeyGetRecordOutput<'a> { 44 + #[serde(skip_serializing_if = "std::option::Option::is_none")] 45 + #[serde(borrow)] 46 + pub cid: std::option::Option<jacquard_common::types::string::Cid<'a>>, 47 + #[serde(borrow)] 48 + pub uri: jacquard_common::types::string::AtUri<'a>, 49 + #[serde(borrow)] 50 + pub value: Key<'a>, 51 + } 52 + 53 + /// Marker type for deserializing records from this collection. 54 + pub struct KeyRecord; 55 + impl jacquard_common::xrpc::XrpcResp for KeyRecord { 56 + const NSID: &'static str = "place.stream.key"; 57 + const ENCODING: &'static str = "application/json"; 58 + type Output<'de> = KeyGetRecordOutput<'de>; 59 + type Err<'de> = jacquard_common::types::collection::RecordError<'de>; 60 + } 61 + 32 62 impl jacquard_common::types::collection::Collection for Key<'_> { 33 63 const NSID: &'static str = "place.stream.key"; 64 + type Record = KeyRecord; 65 + } 66 + 67 + impl From<KeyGetRecordOutput<'_>> for Key<'static> { 68 + fn from(output: KeyGetRecordOutput<'_>) -> Self { 69 + use jacquard_common::IntoStatic; 70 + output.value.into_static() 71 + } 34 72 }
+38
crates/jacquard-api/src/place_stream/livestream.rs
··· 73 73 pub url: std::option::Option<jacquard_common::types::string::Uri<'a>>, 74 74 } 75 75 76 + /// Typed wrapper for GetRecord response with this collection's record type. 77 + #[derive( 78 + serde::Serialize, 79 + serde::Deserialize, 80 + Debug, 81 + Clone, 82 + PartialEq, 83 + Eq, 84 + jacquard_derive::IntoStatic 85 + )] 86 + #[serde(rename_all = "camelCase")] 87 + pub struct LivestreamGetRecordOutput<'a> { 88 + #[serde(skip_serializing_if = "std::option::Option::is_none")] 89 + #[serde(borrow)] 90 + pub cid: std::option::Option<jacquard_common::types::string::Cid<'a>>, 91 + #[serde(borrow)] 92 + pub uri: jacquard_common::types::string::AtUri<'a>, 93 + #[serde(borrow)] 94 + pub value: Livestream<'a>, 95 + } 96 + 97 + /// Marker type for deserializing records from this collection. 98 + pub struct LivestreamRecord; 99 + impl jacquard_common::xrpc::XrpcResp for LivestreamRecord { 100 + const NSID: &'static str = "place.stream.livestream"; 101 + const ENCODING: &'static str = "application/json"; 102 + type Output<'de> = LivestreamGetRecordOutput<'de>; 103 + type Err<'de> = jacquard_common::types::collection::RecordError<'de>; 104 + } 105 + 76 106 impl jacquard_common::types::collection::Collection for Livestream<'_> { 77 107 const NSID: &'static str = "place.stream.livestream"; 108 + type Record = LivestreamRecord; 109 + } 110 + 111 + impl From<LivestreamGetRecordOutput<'_>> for Livestream<'static> { 112 + fn from(output: LivestreamGetRecordOutput<'_>) -> Self { 113 + use jacquard_common::IntoStatic; 114 + output.value.into_static() 115 + } 78 116 } 79 117 80 118 #[jacquard_derive::lexicon]
+38
crates/jacquard-api/src/place_stream/segment.rs
··· 76 76 pub video: std::option::Option<Vec<crate::place_stream::segment::Video<'a>>>, 77 77 } 78 78 79 + /// Typed wrapper for GetRecord response with this collection's record type. 80 + #[derive( 81 + serde::Serialize, 82 + serde::Deserialize, 83 + Debug, 84 + Clone, 85 + PartialEq, 86 + Eq, 87 + jacquard_derive::IntoStatic 88 + )] 89 + #[serde(rename_all = "camelCase")] 90 + pub struct SegmentGetRecordOutput<'a> { 91 + #[serde(skip_serializing_if = "std::option::Option::is_none")] 92 + #[serde(borrow)] 93 + pub cid: std::option::Option<jacquard_common::types::string::Cid<'a>>, 94 + #[serde(borrow)] 95 + pub uri: jacquard_common::types::string::AtUri<'a>, 96 + #[serde(borrow)] 97 + pub value: Segment<'a>, 98 + } 99 + 100 + /// Marker type for deserializing records from this collection. 101 + pub struct SegmentRecord; 102 + impl jacquard_common::xrpc::XrpcResp for SegmentRecord { 103 + const NSID: &'static str = "place.stream.segment"; 104 + const ENCODING: &'static str = "application/json"; 105 + type Output<'de> = SegmentGetRecordOutput<'de>; 106 + type Err<'de> = jacquard_common::types::collection::RecordError<'de>; 107 + } 108 + 79 109 impl jacquard_common::types::collection::Collection for Segment<'_> { 80 110 const NSID: &'static str = "place.stream.segment"; 111 + type Record = SegmentRecord; 112 + } 113 + 114 + impl From<SegmentGetRecordOutput<'_>> for Segment<'static> { 115 + fn from(output: SegmentGetRecordOutput<'_>) -> Self { 116 + use jacquard_common::IntoStatic; 117 + output.value.into_static() 118 + } 81 119 } 82 120 83 121 #[jacquard_derive::lexicon]
+38
crates/jacquard-api/src/place_stream/server/settings.rs
··· 23 23 pub debug_recording: std::option::Option<bool>, 24 24 } 25 25 26 + /// Typed wrapper for GetRecord response with this collection's record type. 27 + #[derive( 28 + serde::Serialize, 29 + serde::Deserialize, 30 + Debug, 31 + Clone, 32 + PartialEq, 33 + Eq, 34 + jacquard_derive::IntoStatic 35 + )] 36 + #[serde(rename_all = "camelCase")] 37 + pub struct SettingsGetRecordOutput<'a> { 38 + #[serde(skip_serializing_if = "std::option::Option::is_none")] 39 + #[serde(borrow)] 40 + pub cid: std::option::Option<jacquard_common::types::string::Cid<'a>>, 41 + #[serde(borrow)] 42 + pub uri: jacquard_common::types::string::AtUri<'a>, 43 + #[serde(borrow)] 44 + pub value: Settings<'a>, 45 + } 46 + 47 + /// Marker type for deserializing records from this collection. 48 + pub struct SettingsRecord; 49 + impl jacquard_common::xrpc::XrpcResp for SettingsRecord { 50 + const NSID: &'static str = "place.stream.server.settings"; 51 + const ENCODING: &'static str = "application/json"; 52 + type Output<'de> = SettingsGetRecordOutput<'de>; 53 + type Err<'de> = jacquard_common::types::collection::RecordError<'de>; 54 + } 55 + 26 56 impl jacquard_common::types::collection::Collection for Settings<'_> { 27 57 const NSID: &'static str = "place.stream.server.settings"; 58 + type Record = SettingsRecord; 59 + } 60 + 61 + impl From<SettingsGetRecordOutput<'_>> for Settings<'static> { 62 + fn from(output: SettingsGetRecordOutput<'_>) -> Self { 63 + use jacquard_common::IntoStatic; 64 + output.value.into_static() 65 + } 28 66 }
+38
crates/jacquard-api/src/pub_leaflet/comment.rs
··· 54 54 pub subject: jacquard_common::types::string::AtUri<'a>, 55 55 } 56 56 57 + /// Typed wrapper for GetRecord response with this collection's record type. 58 + #[derive( 59 + serde::Serialize, 60 + serde::Deserialize, 61 + Debug, 62 + Clone, 63 + PartialEq, 64 + Eq, 65 + jacquard_derive::IntoStatic 66 + )] 67 + #[serde(rename_all = "camelCase")] 68 + pub struct CommentGetRecordOutput<'a> { 69 + #[serde(skip_serializing_if = "std::option::Option::is_none")] 70 + #[serde(borrow)] 71 + pub cid: std::option::Option<jacquard_common::types::string::Cid<'a>>, 72 + #[serde(borrow)] 73 + pub uri: jacquard_common::types::string::AtUri<'a>, 74 + #[serde(borrow)] 75 + pub value: Comment<'a>, 76 + } 77 + 78 + /// Marker type for deserializing records from this collection. 79 + pub struct CommentRecord; 80 + impl jacquard_common::xrpc::XrpcResp for CommentRecord { 81 + const NSID: &'static str = "pub.leaflet.comment"; 82 + const ENCODING: &'static str = "application/json"; 83 + type Output<'de> = CommentGetRecordOutput<'de>; 84 + type Err<'de> = jacquard_common::types::collection::RecordError<'de>; 85 + } 86 + 57 87 impl jacquard_common::types::collection::Collection for Comment<'_> { 58 88 const NSID: &'static str = "pub.leaflet.comment"; 89 + type Record = CommentRecord; 90 + } 91 + 92 + impl From<CommentGetRecordOutput<'_>> for Comment<'static> { 93 + fn from(output: CommentGetRecordOutput<'_>) -> Self { 94 + use jacquard_common::IntoStatic; 95 + output.value.into_static() 96 + } 59 97 } 60 98 61 99 #[jacquard_derive::lexicon]
+38
crates/jacquard-api/src/pub_leaflet/document.rs
··· 38 38 pub title: jacquard_common::CowStr<'a>, 39 39 } 40 40 41 + /// Typed wrapper for GetRecord response with this collection's record type. 42 + #[derive( 43 + serde::Serialize, 44 + serde::Deserialize, 45 + Debug, 46 + Clone, 47 + PartialEq, 48 + Eq, 49 + jacquard_derive::IntoStatic 50 + )] 51 + #[serde(rename_all = "camelCase")] 52 + pub struct DocumentGetRecordOutput<'a> { 53 + #[serde(skip_serializing_if = "std::option::Option::is_none")] 54 + #[serde(borrow)] 55 + pub cid: std::option::Option<jacquard_common::types::string::Cid<'a>>, 56 + #[serde(borrow)] 57 + pub uri: jacquard_common::types::string::AtUri<'a>, 58 + #[serde(borrow)] 59 + pub value: Document<'a>, 60 + } 61 + 62 + /// Marker type for deserializing records from this collection. 63 + pub struct DocumentRecord; 64 + impl jacquard_common::xrpc::XrpcResp for DocumentRecord { 65 + const NSID: &'static str = "pub.leaflet.document"; 66 + const ENCODING: &'static str = "application/json"; 67 + type Output<'de> = DocumentGetRecordOutput<'de>; 68 + type Err<'de> = jacquard_common::types::collection::RecordError<'de>; 69 + } 70 + 41 71 impl jacquard_common::types::collection::Collection for Document<'_> { 42 72 const NSID: &'static str = "pub.leaflet.document"; 73 + type Record = DocumentRecord; 74 + } 75 + 76 + impl From<DocumentGetRecordOutput<'_>> for Document<'static> { 77 + fn from(output: DocumentGetRecordOutput<'_>) -> Self { 78 + use jacquard_common::IntoStatic; 79 + output.value.into_static() 80 + } 43 81 }
+38
crates/jacquard-api/src/pub_leaflet/graph/subscription.rs
··· 22 22 pub publication: jacquard_common::types::string::AtUri<'a>, 23 23 } 24 24 25 + /// Typed wrapper for GetRecord response with this collection's record type. 26 + #[derive( 27 + serde::Serialize, 28 + serde::Deserialize, 29 + Debug, 30 + Clone, 31 + PartialEq, 32 + Eq, 33 + jacquard_derive::IntoStatic 34 + )] 35 + #[serde(rename_all = "camelCase")] 36 + pub struct SubscriptionGetRecordOutput<'a> { 37 + #[serde(skip_serializing_if = "std::option::Option::is_none")] 38 + #[serde(borrow)] 39 + pub cid: std::option::Option<jacquard_common::types::string::Cid<'a>>, 40 + #[serde(borrow)] 41 + pub uri: jacquard_common::types::string::AtUri<'a>, 42 + #[serde(borrow)] 43 + pub value: Subscription<'a>, 44 + } 45 + 46 + /// Marker type for deserializing records from this collection. 47 + pub struct SubscriptionRecord; 48 + impl jacquard_common::xrpc::XrpcResp for SubscriptionRecord { 49 + const NSID: &'static str = "pub.leaflet.graph.subscription"; 50 + const ENCODING: &'static str = "application/json"; 51 + type Output<'de> = SubscriptionGetRecordOutput<'de>; 52 + type Err<'de> = jacquard_common::types::collection::RecordError<'de>; 53 + } 54 + 25 55 impl jacquard_common::types::collection::Collection for Subscription<'_> { 26 56 const NSID: &'static str = "pub.leaflet.graph.subscription"; 57 + type Record = SubscriptionRecord; 58 + } 59 + 60 + impl From<SubscriptionGetRecordOutput<'_>> for Subscription<'static> { 61 + fn from(output: SubscriptionGetRecordOutput<'_>) -> Self { 62 + use jacquard_common::IntoStatic; 63 + output.value.into_static() 64 + } 27 65 }
+38
crates/jacquard-api/src/pub_leaflet/publication.rs
··· 39 39 pub theme: std::option::Option<crate::pub_leaflet::publication::Theme<'a>>, 40 40 } 41 41 42 + /// Typed wrapper for GetRecord response with this collection's record type. 43 + #[derive( 44 + serde::Serialize, 45 + serde::Deserialize, 46 + Debug, 47 + Clone, 48 + PartialEq, 49 + Eq, 50 + jacquard_derive::IntoStatic 51 + )] 52 + #[serde(rename_all = "camelCase")] 53 + pub struct PublicationGetRecordOutput<'a> { 54 + #[serde(skip_serializing_if = "std::option::Option::is_none")] 55 + #[serde(borrow)] 56 + pub cid: std::option::Option<jacquard_common::types::string::Cid<'a>>, 57 + #[serde(borrow)] 58 + pub uri: jacquard_common::types::string::AtUri<'a>, 59 + #[serde(borrow)] 60 + pub value: Publication<'a>, 61 + } 62 + 63 + /// Marker type for deserializing records from this collection. 64 + pub struct PublicationRecord; 65 + impl jacquard_common::xrpc::XrpcResp for PublicationRecord { 66 + const NSID: &'static str = "pub.leaflet.publication"; 67 + const ENCODING: &'static str = "application/json"; 68 + type Output<'de> = PublicationGetRecordOutput<'de>; 69 + type Err<'de> = jacquard_common::types::collection::RecordError<'de>; 70 + } 71 + 42 72 impl jacquard_common::types::collection::Collection for Publication<'_> { 43 73 const NSID: &'static str = "pub.leaflet.publication"; 74 + type Record = PublicationRecord; 75 + } 76 + 77 + impl From<PublicationGetRecordOutput<'_>> for Publication<'static> { 78 + fn from(output: PublicationGetRecordOutput<'_>) -> Self { 79 + use jacquard_common::IntoStatic; 80 + output.value.into_static() 81 + } 44 82 } 45 83 46 84 #[jacquard_derive::lexicon]
+38
crates/jacquard-api/src/sh_tangled/actor/profile.rs
··· 42 42 pub stats: std::option::Option<Vec<jacquard_common::CowStr<'a>>>, 43 43 } 44 44 45 + /// Typed wrapper for GetRecord response with this collection's record type. 46 + #[derive( 47 + serde::Serialize, 48 + serde::Deserialize, 49 + Debug, 50 + Clone, 51 + PartialEq, 52 + Eq, 53 + jacquard_derive::IntoStatic 54 + )] 55 + #[serde(rename_all = "camelCase")] 56 + pub struct ProfileGetRecordOutput<'a> { 57 + #[serde(skip_serializing_if = "std::option::Option::is_none")] 58 + #[serde(borrow)] 59 + pub cid: std::option::Option<jacquard_common::types::string::Cid<'a>>, 60 + #[serde(borrow)] 61 + pub uri: jacquard_common::types::string::AtUri<'a>, 62 + #[serde(borrow)] 63 + pub value: Profile<'a>, 64 + } 65 + 66 + /// Marker type for deserializing records from this collection. 67 + pub struct ProfileRecord; 68 + impl jacquard_common::xrpc::XrpcResp for ProfileRecord { 69 + const NSID: &'static str = "sh.tangled.actor.profile"; 70 + const ENCODING: &'static str = "application/json"; 71 + type Output<'de> = ProfileGetRecordOutput<'de>; 72 + type Err<'de> = jacquard_common::types::collection::RecordError<'de>; 73 + } 74 + 45 75 impl jacquard_common::types::collection::Collection for Profile<'_> { 46 76 const NSID: &'static str = "sh.tangled.actor.profile"; 77 + type Record = ProfileRecord; 78 + } 79 + 80 + impl From<ProfileGetRecordOutput<'_>> for Profile<'static> { 81 + fn from(output: ProfileGetRecordOutput<'_>) -> Self { 82 + use jacquard_common::IntoStatic; 83 + output.value.into_static() 84 + } 47 85 }
+38
crates/jacquard-api/src/sh_tangled/feed/reaction.rs
··· 24 24 pub subject: jacquard_common::types::string::AtUri<'a>, 25 25 } 26 26 27 + /// Typed wrapper for GetRecord response with this collection's record type. 28 + #[derive( 29 + serde::Serialize, 30 + serde::Deserialize, 31 + Debug, 32 + Clone, 33 + PartialEq, 34 + Eq, 35 + jacquard_derive::IntoStatic 36 + )] 37 + #[serde(rename_all = "camelCase")] 38 + pub struct ReactionGetRecordOutput<'a> { 39 + #[serde(skip_serializing_if = "std::option::Option::is_none")] 40 + #[serde(borrow)] 41 + pub cid: std::option::Option<jacquard_common::types::string::Cid<'a>>, 42 + #[serde(borrow)] 43 + pub uri: jacquard_common::types::string::AtUri<'a>, 44 + #[serde(borrow)] 45 + pub value: Reaction<'a>, 46 + } 47 + 48 + /// Marker type for deserializing records from this collection. 49 + pub struct ReactionRecord; 50 + impl jacquard_common::xrpc::XrpcResp for ReactionRecord { 51 + const NSID: &'static str = "sh.tangled.feed.reaction"; 52 + const ENCODING: &'static str = "application/json"; 53 + type Output<'de> = ReactionGetRecordOutput<'de>; 54 + type Err<'de> = jacquard_common::types::collection::RecordError<'de>; 55 + } 56 + 27 57 impl jacquard_common::types::collection::Collection for Reaction<'_> { 28 58 const NSID: &'static str = "sh.tangled.feed.reaction"; 59 + type Record = ReactionRecord; 60 + } 61 + 62 + impl From<ReactionGetRecordOutput<'_>> for Reaction<'static> { 63 + fn from(output: ReactionGetRecordOutput<'_>) -> Self { 64 + use jacquard_common::IntoStatic; 65 + output.value.into_static() 66 + } 29 67 }
+38
crates/jacquard-api/src/sh_tangled/feed/star.rs
··· 22 22 pub subject: jacquard_common::types::string::AtUri<'a>, 23 23 } 24 24 25 + /// Typed wrapper for GetRecord response with this collection's record type. 26 + #[derive( 27 + serde::Serialize, 28 + serde::Deserialize, 29 + Debug, 30 + Clone, 31 + PartialEq, 32 + Eq, 33 + jacquard_derive::IntoStatic 34 + )] 35 + #[serde(rename_all = "camelCase")] 36 + pub struct StarGetRecordOutput<'a> { 37 + #[serde(skip_serializing_if = "std::option::Option::is_none")] 38 + #[serde(borrow)] 39 + pub cid: std::option::Option<jacquard_common::types::string::Cid<'a>>, 40 + #[serde(borrow)] 41 + pub uri: jacquard_common::types::string::AtUri<'a>, 42 + #[serde(borrow)] 43 + pub value: Star<'a>, 44 + } 45 + 46 + /// Marker type for deserializing records from this collection. 47 + pub struct StarRecord; 48 + impl jacquard_common::xrpc::XrpcResp for StarRecord { 49 + const NSID: &'static str = "sh.tangled.feed.star"; 50 + const ENCODING: &'static str = "application/json"; 51 + type Output<'de> = StarGetRecordOutput<'de>; 52 + type Err<'de> = jacquard_common::types::collection::RecordError<'de>; 53 + } 54 + 25 55 impl jacquard_common::types::collection::Collection for Star<'_> { 26 56 const NSID: &'static str = "sh.tangled.feed.star"; 57 + type Record = StarRecord; 58 + } 59 + 60 + impl From<StarGetRecordOutput<'_>> for Star<'static> { 61 + fn from(output: StarGetRecordOutput<'_>) -> Self { 62 + use jacquard_common::IntoStatic; 63 + output.value.into_static() 64 + } 27 65 }
+38
crates/jacquard-api/src/sh_tangled/git/ref_update.rs
··· 112 112 pub repo_name: jacquard_common::CowStr<'a>, 113 113 } 114 114 115 + /// Typed wrapper for GetRecord response with this collection's record type. 116 + #[derive( 117 + serde::Serialize, 118 + serde::Deserialize, 119 + Debug, 120 + Clone, 121 + PartialEq, 122 + Eq, 123 + jacquard_derive::IntoStatic 124 + )] 125 + #[serde(rename_all = "camelCase")] 126 + pub struct RefUpdateGetRecordOutput<'a> { 127 + #[serde(skip_serializing_if = "std::option::Option::is_none")] 128 + #[serde(borrow)] 129 + pub cid: std::option::Option<jacquard_common::types::string::Cid<'a>>, 130 + #[serde(borrow)] 131 + pub uri: jacquard_common::types::string::AtUri<'a>, 132 + #[serde(borrow)] 133 + pub value: RefUpdate<'a>, 134 + } 135 + 136 + /// Marker type for deserializing records from this collection. 137 + pub struct RefUpdateRecord; 138 + impl jacquard_common::xrpc::XrpcResp for RefUpdateRecord { 139 + const NSID: &'static str = "sh.tangled.git.refUpdate"; 140 + const ENCODING: &'static str = "application/json"; 141 + type Output<'de> = RefUpdateGetRecordOutput<'de>; 142 + type Err<'de> = jacquard_common::types::collection::RecordError<'de>; 143 + } 144 + 115 145 impl jacquard_common::types::collection::Collection for RefUpdate<'_> { 116 146 const NSID: &'static str = "sh.tangled.git.refUpdate"; 147 + type Record = RefUpdateRecord; 148 + } 149 + 150 + impl From<RefUpdateGetRecordOutput<'_>> for RefUpdate<'static> { 151 + fn from(output: RefUpdateGetRecordOutput<'_>) -> Self { 152 + use jacquard_common::IntoStatic; 153 + output.value.into_static() 154 + } 117 155 } 118 156 119 157 #[jacquard_derive::lexicon]
+38
crates/jacquard-api/src/sh_tangled/graph/follow.rs
··· 22 22 pub subject: jacquard_common::types::string::Did<'a>, 23 23 } 24 24 25 + /// Typed wrapper for GetRecord response with this collection's record type. 26 + #[derive( 27 + serde::Serialize, 28 + serde::Deserialize, 29 + Debug, 30 + Clone, 31 + PartialEq, 32 + Eq, 33 + jacquard_derive::IntoStatic 34 + )] 35 + #[serde(rename_all = "camelCase")] 36 + pub struct FollowGetRecordOutput<'a> { 37 + #[serde(skip_serializing_if = "std::option::Option::is_none")] 38 + #[serde(borrow)] 39 + pub cid: std::option::Option<jacquard_common::types::string::Cid<'a>>, 40 + #[serde(borrow)] 41 + pub uri: jacquard_common::types::string::AtUri<'a>, 42 + #[serde(borrow)] 43 + pub value: Follow<'a>, 44 + } 45 + 46 + /// Marker type for deserializing records from this collection. 47 + pub struct FollowRecord; 48 + impl jacquard_common::xrpc::XrpcResp for FollowRecord { 49 + const NSID: &'static str = "sh.tangled.graph.follow"; 50 + const ENCODING: &'static str = "application/json"; 51 + type Output<'de> = FollowGetRecordOutput<'de>; 52 + type Err<'de> = jacquard_common::types::collection::RecordError<'de>; 53 + } 54 + 25 55 impl jacquard_common::types::collection::Collection for Follow<'_> { 26 56 const NSID: &'static str = "sh.tangled.graph.follow"; 57 + type Record = FollowRecord; 58 + } 59 + 60 + impl From<FollowGetRecordOutput<'_>> for Follow<'static> { 61 + fn from(output: FollowGetRecordOutput<'_>) -> Self { 62 + use jacquard_common::IntoStatic; 63 + output.value.into_static() 64 + } 27 65 }
+38
crates/jacquard-api/src/sh_tangled/knot.rs
··· 24 24 pub created_at: jacquard_common::types::string::Datetime, 25 25 } 26 26 27 + /// Typed wrapper for GetRecord response with this collection's record type. 28 + #[derive( 29 + serde::Serialize, 30 + serde::Deserialize, 31 + Debug, 32 + Clone, 33 + PartialEq, 34 + Eq, 35 + jacquard_derive::IntoStatic 36 + )] 37 + #[serde(rename_all = "camelCase")] 38 + pub struct KnotGetRecordOutput<'a> { 39 + #[serde(skip_serializing_if = "std::option::Option::is_none")] 40 + #[serde(borrow)] 41 + pub cid: std::option::Option<jacquard_common::types::string::Cid<'a>>, 42 + #[serde(borrow)] 43 + pub uri: jacquard_common::types::string::AtUri<'a>, 44 + #[serde(borrow)] 45 + pub value: Knot<'a>, 46 + } 47 + 48 + /// Marker type for deserializing records from this collection. 49 + pub struct KnotRecord; 50 + impl jacquard_common::xrpc::XrpcResp for KnotRecord { 51 + const NSID: &'static str = "sh.tangled.knot"; 52 + const ENCODING: &'static str = "application/json"; 53 + type Output<'de> = KnotGetRecordOutput<'de>; 54 + type Err<'de> = jacquard_common::types::collection::RecordError<'de>; 55 + } 56 + 27 57 impl jacquard_common::types::collection::Collection for Knot<'_> { 28 58 const NSID: &'static str = "sh.tangled.knot"; 59 + type Record = KnotRecord; 60 + } 61 + 62 + impl From<KnotGetRecordOutput<'_>> for Knot<'static> { 63 + fn from(output: KnotGetRecordOutput<'_>) -> Self { 64 + use jacquard_common::IntoStatic; 65 + output.value.into_static() 66 + } 29 67 }
+38
crates/jacquard-api/src/sh_tangled/knot/member.rs
··· 25 25 pub subject: jacquard_common::types::string::Did<'a>, 26 26 } 27 27 28 + /// Typed wrapper for GetRecord response with this collection's record type. 29 + #[derive( 30 + serde::Serialize, 31 + serde::Deserialize, 32 + Debug, 33 + Clone, 34 + PartialEq, 35 + Eq, 36 + jacquard_derive::IntoStatic 37 + )] 38 + #[serde(rename_all = "camelCase")] 39 + pub struct MemberGetRecordOutput<'a> { 40 + #[serde(skip_serializing_if = "std::option::Option::is_none")] 41 + #[serde(borrow)] 42 + pub cid: std::option::Option<jacquard_common::types::string::Cid<'a>>, 43 + #[serde(borrow)] 44 + pub uri: jacquard_common::types::string::AtUri<'a>, 45 + #[serde(borrow)] 46 + pub value: Member<'a>, 47 + } 48 + 49 + /// Marker type for deserializing records from this collection. 50 + pub struct MemberRecord; 51 + impl jacquard_common::xrpc::XrpcResp for MemberRecord { 52 + const NSID: &'static str = "sh.tangled.knot.member"; 53 + const ENCODING: &'static str = "application/json"; 54 + type Output<'de> = MemberGetRecordOutput<'de>; 55 + type Err<'de> = jacquard_common::types::collection::RecordError<'de>; 56 + } 57 + 28 58 impl jacquard_common::types::collection::Collection for Member<'_> { 29 59 const NSID: &'static str = "sh.tangled.knot.member"; 60 + type Record = MemberRecord; 61 + } 62 + 63 + impl From<MemberGetRecordOutput<'_>> for Member<'static> { 64 + fn from(output: MemberGetRecordOutput<'_>) -> Self { 65 + use jacquard_common::IntoStatic; 66 + output.value.into_static() 67 + } 30 68 }
+38
crates/jacquard-api/src/sh_tangled/label/definition.rs
··· 36 36 pub value_type: crate::sh_tangled::label::definition::ValueType<'a>, 37 37 } 38 38 39 + /// Typed wrapper for GetRecord response with this collection's record type. 40 + #[derive( 41 + serde::Serialize, 42 + serde::Deserialize, 43 + Debug, 44 + Clone, 45 + PartialEq, 46 + Eq, 47 + jacquard_derive::IntoStatic 48 + )] 49 + #[serde(rename_all = "camelCase")] 50 + pub struct DefinitionGetRecordOutput<'a> { 51 + #[serde(skip_serializing_if = "std::option::Option::is_none")] 52 + #[serde(borrow)] 53 + pub cid: std::option::Option<jacquard_common::types::string::Cid<'a>>, 54 + #[serde(borrow)] 55 + pub uri: jacquard_common::types::string::AtUri<'a>, 56 + #[serde(borrow)] 57 + pub value: Definition<'a>, 58 + } 59 + 60 + /// Marker type for deserializing records from this collection. 61 + pub struct DefinitionRecord; 62 + impl jacquard_common::xrpc::XrpcResp for DefinitionRecord { 63 + const NSID: &'static str = "sh.tangled.label.definition"; 64 + const ENCODING: &'static str = "application/json"; 65 + type Output<'de> = DefinitionGetRecordOutput<'de>; 66 + type Err<'de> = jacquard_common::types::collection::RecordError<'de>; 67 + } 68 + 39 69 impl jacquard_common::types::collection::Collection for Definition<'_> { 40 70 const NSID: &'static str = "sh.tangled.label.definition"; 71 + type Record = DefinitionRecord; 72 + } 73 + 74 + impl From<DefinitionGetRecordOutput<'_>> for Definition<'static> { 75 + fn from(output: DefinitionGetRecordOutput<'_>) -> Self { 76 + use jacquard_common::IntoStatic; 77 + output.value.into_static() 78 + } 41 79 } 42 80 43 81 #[jacquard_derive::lexicon]
+38
crates/jacquard-api/src/sh_tangled/label/op.rs
··· 27 27 pub subject: jacquard_common::types::string::AtUri<'a>, 28 28 } 29 29 30 + /// Typed wrapper for GetRecord response with this collection's record type. 31 + #[derive( 32 + serde::Serialize, 33 + serde::Deserialize, 34 + Debug, 35 + Clone, 36 + PartialEq, 37 + Eq, 38 + jacquard_derive::IntoStatic 39 + )] 40 + #[serde(rename_all = "camelCase")] 41 + pub struct OpGetRecordOutput<'a> { 42 + #[serde(skip_serializing_if = "std::option::Option::is_none")] 43 + #[serde(borrow)] 44 + pub cid: std::option::Option<jacquard_common::types::string::Cid<'a>>, 45 + #[serde(borrow)] 46 + pub uri: jacquard_common::types::string::AtUri<'a>, 47 + #[serde(borrow)] 48 + pub value: Op<'a>, 49 + } 50 + 51 + /// Marker type for deserializing records from this collection. 52 + pub struct OpRecord; 53 + impl jacquard_common::xrpc::XrpcResp for OpRecord { 54 + const NSID: &'static str = "sh.tangled.label.op"; 55 + const ENCODING: &'static str = "application/json"; 56 + type Output<'de> = OpGetRecordOutput<'de>; 57 + type Err<'de> = jacquard_common::types::collection::RecordError<'de>; 58 + } 59 + 30 60 impl jacquard_common::types::collection::Collection for Op<'_> { 31 61 const NSID: &'static str = "sh.tangled.label.op"; 62 + type Record = OpRecord; 63 + } 64 + 65 + impl From<OpGetRecordOutput<'_>> for Op<'static> { 66 + fn from(output: OpGetRecordOutput<'_>) -> Self { 67 + use jacquard_common::IntoStatic; 68 + output.value.into_static() 69 + } 32 70 } 33 71 34 72 #[jacquard_derive::lexicon]
+38
crates/jacquard-api/src/sh_tangled/pipeline.rs
··· 42 42 pub workflows: Vec<crate::sh_tangled::pipeline::Workflow<'a>>, 43 43 } 44 44 45 + /// Typed wrapper for GetRecord response with this collection's record type. 46 + #[derive( 47 + serde::Serialize, 48 + serde::Deserialize, 49 + Debug, 50 + Clone, 51 + PartialEq, 52 + Eq, 53 + jacquard_derive::IntoStatic 54 + )] 55 + #[serde(rename_all = "camelCase")] 56 + pub struct PipelineGetRecordOutput<'a> { 57 + #[serde(skip_serializing_if = "std::option::Option::is_none")] 58 + #[serde(borrow)] 59 + pub cid: std::option::Option<jacquard_common::types::string::Cid<'a>>, 60 + #[serde(borrow)] 61 + pub uri: jacquard_common::types::string::AtUri<'a>, 62 + #[serde(borrow)] 63 + pub value: Pipeline<'a>, 64 + } 65 + 66 + /// Marker type for deserializing records from this collection. 67 + pub struct PipelineRecord; 68 + impl jacquard_common::xrpc::XrpcResp for PipelineRecord { 69 + const NSID: &'static str = "sh.tangled.pipeline"; 70 + const ENCODING: &'static str = "application/json"; 71 + type Output<'de> = PipelineGetRecordOutput<'de>; 72 + type Err<'de> = jacquard_common::types::collection::RecordError<'de>; 73 + } 74 + 45 75 impl jacquard_common::types::collection::Collection for Pipeline<'_> { 46 76 const NSID: &'static str = "sh.tangled.pipeline"; 77 + type Record = PipelineRecord; 78 + } 79 + 80 + impl From<PipelineGetRecordOutput<'_>> for Pipeline<'static> { 81 + fn from(output: PipelineGetRecordOutput<'_>) -> Self { 82 + use jacquard_common::IntoStatic; 83 + output.value.into_static() 84 + } 47 85 } 48 86 49 87 #[jacquard_derive::lexicon]
+38
crates/jacquard-api/src/sh_tangled/pipeline/status.rs
··· 37 37 pub workflow: jacquard_common::types::string::AtUri<'a>, 38 38 } 39 39 40 + /// Typed wrapper for GetRecord response with this collection's record type. 41 + #[derive( 42 + serde::Serialize, 43 + serde::Deserialize, 44 + Debug, 45 + Clone, 46 + PartialEq, 47 + Eq, 48 + jacquard_derive::IntoStatic 49 + )] 50 + #[serde(rename_all = "camelCase")] 51 + pub struct StatusGetRecordOutput<'a> { 52 + #[serde(skip_serializing_if = "std::option::Option::is_none")] 53 + #[serde(borrow)] 54 + pub cid: std::option::Option<jacquard_common::types::string::Cid<'a>>, 55 + #[serde(borrow)] 56 + pub uri: jacquard_common::types::string::AtUri<'a>, 57 + #[serde(borrow)] 58 + pub value: Status<'a>, 59 + } 60 + 61 + /// Marker type for deserializing records from this collection. 62 + pub struct StatusRecord; 63 + impl jacquard_common::xrpc::XrpcResp for StatusRecord { 64 + const NSID: &'static str = "sh.tangled.pipeline.status"; 65 + const ENCODING: &'static str = "application/json"; 66 + type Output<'de> = StatusGetRecordOutput<'de>; 67 + type Err<'de> = jacquard_common::types::collection::RecordError<'de>; 68 + } 69 + 40 70 impl jacquard_common::types::collection::Collection for Status<'_> { 41 71 const NSID: &'static str = "sh.tangled.pipeline.status"; 72 + type Record = StatusRecord; 73 + } 74 + 75 + impl From<StatusGetRecordOutput<'_>> for Status<'static> { 76 + fn from(output: StatusGetRecordOutput<'_>) -> Self { 77 + use jacquard_common::IntoStatic; 78 + output.value.into_static() 79 + } 42 80 }
+38
crates/jacquard-api/src/sh_tangled/public_key.rs
··· 27 27 pub name: jacquard_common::CowStr<'a>, 28 28 } 29 29 30 + /// Typed wrapper for GetRecord response with this collection's record type. 31 + #[derive( 32 + serde::Serialize, 33 + serde::Deserialize, 34 + Debug, 35 + Clone, 36 + PartialEq, 37 + Eq, 38 + jacquard_derive::IntoStatic 39 + )] 40 + #[serde(rename_all = "camelCase")] 41 + pub struct PublicKeyGetRecordOutput<'a> { 42 + #[serde(skip_serializing_if = "std::option::Option::is_none")] 43 + #[serde(borrow)] 44 + pub cid: std::option::Option<jacquard_common::types::string::Cid<'a>>, 45 + #[serde(borrow)] 46 + pub uri: jacquard_common::types::string::AtUri<'a>, 47 + #[serde(borrow)] 48 + pub value: PublicKey<'a>, 49 + } 50 + 51 + /// Marker type for deserializing records from this collection. 52 + pub struct PublicKeyRecord; 53 + impl jacquard_common::xrpc::XrpcResp for PublicKeyRecord { 54 + const NSID: &'static str = "sh.tangled.publicKey"; 55 + const ENCODING: &'static str = "application/json"; 56 + type Output<'de> = PublicKeyGetRecordOutput<'de>; 57 + type Err<'de> = jacquard_common::types::collection::RecordError<'de>; 58 + } 59 + 30 60 impl jacquard_common::types::collection::Collection for PublicKey<'_> { 31 61 const NSID: &'static str = "sh.tangled.publicKey"; 62 + type Record = PublicKeyRecord; 63 + } 64 + 65 + impl From<PublicKeyGetRecordOutput<'_>> for PublicKey<'static> { 66 + fn from(output: PublicKeyGetRecordOutput<'_>) -> Self { 67 + use jacquard_common::IntoStatic; 68 + output.value.into_static() 69 + } 32 70 }
+38
crates/jacquard-api/src/sh_tangled/repo.rs
··· 69 69 pub spindle: std::option::Option<jacquard_common::CowStr<'a>>, 70 70 } 71 71 72 + /// Typed wrapper for GetRecord response with this collection's record type. 73 + #[derive( 74 + serde::Serialize, 75 + serde::Deserialize, 76 + Debug, 77 + Clone, 78 + PartialEq, 79 + Eq, 80 + jacquard_derive::IntoStatic 81 + )] 82 + #[serde(rename_all = "camelCase")] 83 + pub struct RepoGetRecordOutput<'a> { 84 + #[serde(skip_serializing_if = "std::option::Option::is_none")] 85 + #[serde(borrow)] 86 + pub cid: std::option::Option<jacquard_common::types::string::Cid<'a>>, 87 + #[serde(borrow)] 88 + pub uri: jacquard_common::types::string::AtUri<'a>, 89 + #[serde(borrow)] 90 + pub value: Repo<'a>, 91 + } 92 + 93 + /// Marker type for deserializing records from this collection. 94 + pub struct RepoRecord; 95 + impl jacquard_common::xrpc::XrpcResp for RepoRecord { 96 + const NSID: &'static str = "sh.tangled.repo"; 97 + const ENCODING: &'static str = "application/json"; 98 + type Output<'de> = RepoGetRecordOutput<'de>; 99 + type Err<'de> = jacquard_common::types::collection::RecordError<'de>; 100 + } 101 + 72 102 impl jacquard_common::types::collection::Collection for Repo<'_> { 73 103 const NSID: &'static str = "sh.tangled.repo"; 104 + type Record = RepoRecord; 105 + } 106 + 107 + impl From<RepoGetRecordOutput<'_>> for Repo<'static> { 108 + fn from(output: RepoGetRecordOutput<'_>) -> Self { 109 + use jacquard_common::IntoStatic; 110 + output.value.into_static() 111 + } 74 112 }
+38
crates/jacquard-api/src/sh_tangled/repo/artifact.rs
··· 32 32 pub tag: bytes::Bytes, 33 33 } 34 34 35 + /// Typed wrapper for GetRecord response with this collection's record type. 36 + #[derive( 37 + serde::Serialize, 38 + serde::Deserialize, 39 + Debug, 40 + Clone, 41 + PartialEq, 42 + Eq, 43 + jacquard_derive::IntoStatic 44 + )] 45 + #[serde(rename_all = "camelCase")] 46 + pub struct ArtifactGetRecordOutput<'a> { 47 + #[serde(skip_serializing_if = "std::option::Option::is_none")] 48 + #[serde(borrow)] 49 + pub cid: std::option::Option<jacquard_common::types::string::Cid<'a>>, 50 + #[serde(borrow)] 51 + pub uri: jacquard_common::types::string::AtUri<'a>, 52 + #[serde(borrow)] 53 + pub value: Artifact<'a>, 54 + } 55 + 56 + /// Marker type for deserializing records from this collection. 57 + pub struct ArtifactRecord; 58 + impl jacquard_common::xrpc::XrpcResp for ArtifactRecord { 59 + const NSID: &'static str = "sh.tangled.repo.artifact"; 60 + const ENCODING: &'static str = "application/json"; 61 + type Output<'de> = ArtifactGetRecordOutput<'de>; 62 + type Err<'de> = jacquard_common::types::collection::RecordError<'de>; 63 + } 64 + 35 65 impl jacquard_common::types::collection::Collection for Artifact<'_> { 36 66 const NSID: &'static str = "sh.tangled.repo.artifact"; 67 + type Record = ArtifactRecord; 68 + } 69 + 70 + impl From<ArtifactGetRecordOutput<'_>> for Artifact<'static> { 71 + fn from(output: ArtifactGetRecordOutput<'_>) -> Self { 72 + use jacquard_common::IntoStatic; 73 + output.value.into_static() 74 + } 37 75 }
+38
crates/jacquard-api/src/sh_tangled/repo/collaborator.rs
··· 25 25 pub subject: jacquard_common::types::string::Did<'a>, 26 26 } 27 27 28 + /// Typed wrapper for GetRecord response with this collection's record type. 29 + #[derive( 30 + serde::Serialize, 31 + serde::Deserialize, 32 + Debug, 33 + Clone, 34 + PartialEq, 35 + Eq, 36 + jacquard_derive::IntoStatic 37 + )] 38 + #[serde(rename_all = "camelCase")] 39 + pub struct CollaboratorGetRecordOutput<'a> { 40 + #[serde(skip_serializing_if = "std::option::Option::is_none")] 41 + #[serde(borrow)] 42 + pub cid: std::option::Option<jacquard_common::types::string::Cid<'a>>, 43 + #[serde(borrow)] 44 + pub uri: jacquard_common::types::string::AtUri<'a>, 45 + #[serde(borrow)] 46 + pub value: Collaborator<'a>, 47 + } 48 + 49 + /// Marker type for deserializing records from this collection. 50 + pub struct CollaboratorRecord; 51 + impl jacquard_common::xrpc::XrpcResp for CollaboratorRecord { 52 + const NSID: &'static str = "sh.tangled.repo.collaborator"; 53 + const ENCODING: &'static str = "application/json"; 54 + type Output<'de> = CollaboratorGetRecordOutput<'de>; 55 + type Err<'de> = jacquard_common::types::collection::RecordError<'de>; 56 + } 57 + 28 58 impl jacquard_common::types::collection::Collection for Collaborator<'_> { 29 59 const NSID: &'static str = "sh.tangled.repo.collaborator"; 60 + type Record = CollaboratorRecord; 61 + } 62 + 63 + impl From<CollaboratorGetRecordOutput<'_>> for Collaborator<'static> { 64 + fn from(output: CollaboratorGetRecordOutput<'_>) -> Self { 65 + use jacquard_common::IntoStatic; 66 + output.value.into_static() 67 + } 30 68 }
+38
crates/jacquard-api/src/sh_tangled/repo/issue.rs
··· 30 30 pub title: jacquard_common::CowStr<'a>, 31 31 } 32 32 33 + /// Typed wrapper for GetRecord response with this collection's record type. 34 + #[derive( 35 + serde::Serialize, 36 + serde::Deserialize, 37 + Debug, 38 + Clone, 39 + PartialEq, 40 + Eq, 41 + jacquard_derive::IntoStatic 42 + )] 43 + #[serde(rename_all = "camelCase")] 44 + pub struct IssueGetRecordOutput<'a> { 45 + #[serde(skip_serializing_if = "std::option::Option::is_none")] 46 + #[serde(borrow)] 47 + pub cid: std::option::Option<jacquard_common::types::string::Cid<'a>>, 48 + #[serde(borrow)] 49 + pub uri: jacquard_common::types::string::AtUri<'a>, 50 + #[serde(borrow)] 51 + pub value: Issue<'a>, 52 + } 53 + 54 + /// Marker type for deserializing records from this collection. 55 + pub struct IssueRecord; 56 + impl jacquard_common::xrpc::XrpcResp for IssueRecord { 57 + const NSID: &'static str = "sh.tangled.repo.issue"; 58 + const ENCODING: &'static str = "application/json"; 59 + type Output<'de> = IssueGetRecordOutput<'de>; 60 + type Err<'de> = jacquard_common::types::collection::RecordError<'de>; 61 + } 62 + 33 63 impl jacquard_common::types::collection::Collection for Issue<'_> { 34 64 const NSID: &'static str = "sh.tangled.repo.issue"; 65 + type Record = IssueRecord; 66 + } 67 + 68 + impl From<IssueGetRecordOutput<'_>> for Issue<'static> { 69 + fn from(output: IssueGetRecordOutput<'_>) -> Self { 70 + use jacquard_common::IntoStatic; 71 + output.value.into_static() 72 + } 35 73 }
+38
crates/jacquard-api/src/sh_tangled/repo/issue/comment.rs
··· 27 27 pub reply_to: std::option::Option<jacquard_common::types::string::AtUri<'a>>, 28 28 } 29 29 30 + /// Typed wrapper for GetRecord response with this collection's record type. 31 + #[derive( 32 + serde::Serialize, 33 + serde::Deserialize, 34 + Debug, 35 + Clone, 36 + PartialEq, 37 + Eq, 38 + jacquard_derive::IntoStatic 39 + )] 40 + #[serde(rename_all = "camelCase")] 41 + pub struct CommentGetRecordOutput<'a> { 42 + #[serde(skip_serializing_if = "std::option::Option::is_none")] 43 + #[serde(borrow)] 44 + pub cid: std::option::Option<jacquard_common::types::string::Cid<'a>>, 45 + #[serde(borrow)] 46 + pub uri: jacquard_common::types::string::AtUri<'a>, 47 + #[serde(borrow)] 48 + pub value: Comment<'a>, 49 + } 50 + 51 + /// Marker type for deserializing records from this collection. 52 + pub struct CommentRecord; 53 + impl jacquard_common::xrpc::XrpcResp for CommentRecord { 54 + const NSID: &'static str = "sh.tangled.repo.issue.comment"; 55 + const ENCODING: &'static str = "application/json"; 56 + type Output<'de> = CommentGetRecordOutput<'de>; 57 + type Err<'de> = jacquard_common::types::collection::RecordError<'de>; 58 + } 59 + 30 60 impl jacquard_common::types::collection::Collection for Comment<'_> { 31 61 const NSID: &'static str = "sh.tangled.repo.issue.comment"; 62 + type Record = CommentRecord; 63 + } 64 + 65 + impl From<CommentGetRecordOutput<'_>> for Comment<'static> { 66 + fn from(output: CommentGetRecordOutput<'_>) -> Self { 67 + use jacquard_common::IntoStatic; 68 + output.value.into_static() 69 + } 32 70 }
+38
crates/jacquard-api/src/sh_tangled/repo/issue/state.rs
··· 27 27 pub state: jacquard_common::CowStr<'a>, 28 28 } 29 29 30 + /// Typed wrapper for GetRecord response with this collection's record type. 31 + #[derive( 32 + serde::Serialize, 33 + serde::Deserialize, 34 + Debug, 35 + Clone, 36 + PartialEq, 37 + Eq, 38 + jacquard_derive::IntoStatic 39 + )] 40 + #[serde(rename_all = "camelCase")] 41 + pub struct StateGetRecordOutput<'a> { 42 + #[serde(skip_serializing_if = "std::option::Option::is_none")] 43 + #[serde(borrow)] 44 + pub cid: std::option::Option<jacquard_common::types::string::Cid<'a>>, 45 + #[serde(borrow)] 46 + pub uri: jacquard_common::types::string::AtUri<'a>, 47 + #[serde(borrow)] 48 + pub value: State<'a>, 49 + } 50 + 51 + /// Marker type for deserializing records from this collection. 52 + pub struct StateRecord; 53 + impl jacquard_common::xrpc::XrpcResp for StateRecord { 54 + const NSID: &'static str = "sh.tangled.repo.issue.state"; 55 + const ENCODING: &'static str = "application/json"; 56 + type Output<'de> = StateGetRecordOutput<'de>; 57 + type Err<'de> = jacquard_common::types::collection::RecordError<'de>; 58 + } 59 + 30 60 impl jacquard_common::types::collection::Collection for State<'_> { 31 61 const NSID: &'static str = "sh.tangled.repo.issue.state"; 62 + type Record = StateRecord; 63 + } 64 + 65 + impl From<StateGetRecordOutput<'_>> for State<'static> { 66 + fn from(output: StateGetRecordOutput<'_>) -> Self { 67 + use jacquard_common::IntoStatic; 68 + output.value.into_static() 69 + } 32 70 }
+38
crates/jacquard-api/src/sh_tangled/repo/pull.rs
··· 35 35 pub title: jacquard_common::CowStr<'a>, 36 36 } 37 37 38 + /// Typed wrapper for GetRecord response with this collection's record type. 39 + #[derive( 40 + serde::Serialize, 41 + serde::Deserialize, 42 + Debug, 43 + Clone, 44 + PartialEq, 45 + Eq, 46 + jacquard_derive::IntoStatic 47 + )] 48 + #[serde(rename_all = "camelCase")] 49 + pub struct PullGetRecordOutput<'a> { 50 + #[serde(skip_serializing_if = "std::option::Option::is_none")] 51 + #[serde(borrow)] 52 + pub cid: std::option::Option<jacquard_common::types::string::Cid<'a>>, 53 + #[serde(borrow)] 54 + pub uri: jacquard_common::types::string::AtUri<'a>, 55 + #[serde(borrow)] 56 + pub value: Pull<'a>, 57 + } 58 + 59 + /// Marker type for deserializing records from this collection. 60 + pub struct PullRecord; 61 + impl jacquard_common::xrpc::XrpcResp for PullRecord { 62 + const NSID: &'static str = "sh.tangled.repo.pull"; 63 + const ENCODING: &'static str = "application/json"; 64 + type Output<'de> = PullGetRecordOutput<'de>; 65 + type Err<'de> = jacquard_common::types::collection::RecordError<'de>; 66 + } 67 + 38 68 impl jacquard_common::types::collection::Collection for Pull<'_> { 39 69 const NSID: &'static str = "sh.tangled.repo.pull"; 70 + type Record = PullRecord; 71 + } 72 + 73 + impl From<PullGetRecordOutput<'_>> for Pull<'static> { 74 + fn from(output: PullGetRecordOutput<'_>) -> Self { 75 + use jacquard_common::IntoStatic; 76 + output.value.into_static() 77 + } 40 78 } 41 79 42 80 #[jacquard_derive::lexicon]
+38
crates/jacquard-api/src/sh_tangled/repo/pull/comment.rs
··· 24 24 pub pull: jacquard_common::types::string::AtUri<'a>, 25 25 } 26 26 27 + /// Typed wrapper for GetRecord response with this collection's record type. 28 + #[derive( 29 + serde::Serialize, 30 + serde::Deserialize, 31 + Debug, 32 + Clone, 33 + PartialEq, 34 + Eq, 35 + jacquard_derive::IntoStatic 36 + )] 37 + #[serde(rename_all = "camelCase")] 38 + pub struct CommentGetRecordOutput<'a> { 39 + #[serde(skip_serializing_if = "std::option::Option::is_none")] 40 + #[serde(borrow)] 41 + pub cid: std::option::Option<jacquard_common::types::string::Cid<'a>>, 42 + #[serde(borrow)] 43 + pub uri: jacquard_common::types::string::AtUri<'a>, 44 + #[serde(borrow)] 45 + pub value: Comment<'a>, 46 + } 47 + 48 + /// Marker type for deserializing records from this collection. 49 + pub struct CommentRecord; 50 + impl jacquard_common::xrpc::XrpcResp for CommentRecord { 51 + const NSID: &'static str = "sh.tangled.repo.pull.comment"; 52 + const ENCODING: &'static str = "application/json"; 53 + type Output<'de> = CommentGetRecordOutput<'de>; 54 + type Err<'de> = jacquard_common::types::collection::RecordError<'de>; 55 + } 56 + 27 57 impl jacquard_common::types::collection::Collection for Comment<'_> { 28 58 const NSID: &'static str = "sh.tangled.repo.pull.comment"; 59 + type Record = CommentRecord; 60 + } 61 + 62 + impl From<CommentGetRecordOutput<'_>> for Comment<'static> { 63 + fn from(output: CommentGetRecordOutput<'_>) -> Self { 64 + use jacquard_common::IntoStatic; 65 + output.value.into_static() 66 + } 29 67 }
+38
crates/jacquard-api/src/sh_tangled/repo/pull/status.rs
··· 28 28 pub status: jacquard_common::CowStr<'a>, 29 29 } 30 30 31 + /// Typed wrapper for GetRecord response with this collection's record type. 32 + #[derive( 33 + serde::Serialize, 34 + serde::Deserialize, 35 + Debug, 36 + Clone, 37 + PartialEq, 38 + Eq, 39 + jacquard_derive::IntoStatic 40 + )] 41 + #[serde(rename_all = "camelCase")] 42 + pub struct StatusGetRecordOutput<'a> { 43 + #[serde(skip_serializing_if = "std::option::Option::is_none")] 44 + #[serde(borrow)] 45 + pub cid: std::option::Option<jacquard_common::types::string::Cid<'a>>, 46 + #[serde(borrow)] 47 + pub uri: jacquard_common::types::string::AtUri<'a>, 48 + #[serde(borrow)] 49 + pub value: Status<'a>, 50 + } 51 + 52 + /// Marker type for deserializing records from this collection. 53 + pub struct StatusRecord; 54 + impl jacquard_common::xrpc::XrpcResp for StatusRecord { 55 + const NSID: &'static str = "sh.tangled.repo.pull.status"; 56 + const ENCODING: &'static str = "application/json"; 57 + type Output<'de> = StatusGetRecordOutput<'de>; 58 + type Err<'de> = jacquard_common::types::collection::RecordError<'de>; 59 + } 60 + 31 61 impl jacquard_common::types::collection::Collection for Status<'_> { 32 62 const NSID: &'static str = "sh.tangled.repo.pull.status"; 63 + type Record = StatusRecord; 64 + } 65 + 66 + impl From<StatusGetRecordOutput<'_>> for Status<'static> { 67 + fn from(output: StatusGetRecordOutput<'_>) -> Self { 68 + use jacquard_common::IntoStatic; 69 + output.value.into_static() 70 + } 33 71 }
+38
crates/jacquard-api/src/sh_tangled/spindle.rs
··· 22 22 pub created_at: jacquard_common::types::string::Datetime, 23 23 } 24 24 25 + /// Typed wrapper for GetRecord response with this collection's record type. 26 + #[derive( 27 + serde::Serialize, 28 + serde::Deserialize, 29 + Debug, 30 + Clone, 31 + PartialEq, 32 + Eq, 33 + jacquard_derive::IntoStatic 34 + )] 35 + #[serde(rename_all = "camelCase")] 36 + pub struct SpindleGetRecordOutput<'a> { 37 + #[serde(skip_serializing_if = "std::option::Option::is_none")] 38 + #[serde(borrow)] 39 + pub cid: std::option::Option<jacquard_common::types::string::Cid<'a>>, 40 + #[serde(borrow)] 41 + pub uri: jacquard_common::types::string::AtUri<'a>, 42 + #[serde(borrow)] 43 + pub value: Spindle<'a>, 44 + } 45 + 46 + /// Marker type for deserializing records from this collection. 47 + pub struct SpindleRecord; 48 + impl jacquard_common::xrpc::XrpcResp for SpindleRecord { 49 + const NSID: &'static str = "sh.tangled.spindle"; 50 + const ENCODING: &'static str = "application/json"; 51 + type Output<'de> = SpindleGetRecordOutput<'de>; 52 + type Err<'de> = jacquard_common::types::collection::RecordError<'de>; 53 + } 54 + 25 55 impl jacquard_common::types::collection::Collection for Spindle<'_> { 26 56 const NSID: &'static str = "sh.tangled.spindle"; 57 + type Record = SpindleRecord; 58 + } 59 + 60 + impl From<SpindleGetRecordOutput<'_>> for Spindle<'static> { 61 + fn from(output: SpindleGetRecordOutput<'_>) -> Self { 62 + use jacquard_common::IntoStatic; 63 + output.value.into_static() 64 + } 27 65 }
+38
crates/jacquard-api/src/sh_tangled/spindle/member.rs
··· 25 25 pub subject: jacquard_common::types::string::Did<'a>, 26 26 } 27 27 28 + /// Typed wrapper for GetRecord response with this collection's record type. 29 + #[derive( 30 + serde::Serialize, 31 + serde::Deserialize, 32 + Debug, 33 + Clone, 34 + PartialEq, 35 + Eq, 36 + jacquard_derive::IntoStatic 37 + )] 38 + #[serde(rename_all = "camelCase")] 39 + pub struct MemberGetRecordOutput<'a> { 40 + #[serde(skip_serializing_if = "std::option::Option::is_none")] 41 + #[serde(borrow)] 42 + pub cid: std::option::Option<jacquard_common::types::string::Cid<'a>>, 43 + #[serde(borrow)] 44 + pub uri: jacquard_common::types::string::AtUri<'a>, 45 + #[serde(borrow)] 46 + pub value: Member<'a>, 47 + } 48 + 49 + /// Marker type for deserializing records from this collection. 50 + pub struct MemberRecord; 51 + impl jacquard_common::xrpc::XrpcResp for MemberRecord { 52 + const NSID: &'static str = "sh.tangled.spindle.member"; 53 + const ENCODING: &'static str = "application/json"; 54 + type Output<'de> = MemberGetRecordOutput<'de>; 55 + type Err<'de> = jacquard_common::types::collection::RecordError<'de>; 56 + } 57 + 28 58 impl jacquard_common::types::collection::Collection for Member<'_> { 29 59 const NSID: &'static str = "sh.tangled.spindle.member"; 60 + type Record = MemberRecord; 61 + } 62 + 63 + impl From<MemberGetRecordOutput<'_>> for Member<'static> { 64 + fn from(output: MemberGetRecordOutput<'_>) -> Self { 65 + use jacquard_common::IntoStatic; 66 + output.value.into_static() 67 + } 30 68 }
+38
crates/jacquard-api/src/sh_tangled/string.rs
··· 26 26 pub filename: jacquard_common::CowStr<'a>, 27 27 } 28 28 29 + /// Typed wrapper for GetRecord response with this collection's record type. 30 + #[derive( 31 + serde::Serialize, 32 + serde::Deserialize, 33 + Debug, 34 + Clone, 35 + PartialEq, 36 + Eq, 37 + jacquard_derive::IntoStatic 38 + )] 39 + #[serde(rename_all = "camelCase")] 40 + pub struct StringGetRecordOutput<'a> { 41 + #[serde(skip_serializing_if = "std::option::Option::is_none")] 42 + #[serde(borrow)] 43 + pub cid: std::option::Option<jacquard_common::types::string::Cid<'a>>, 44 + #[serde(borrow)] 45 + pub uri: jacquard_common::types::string::AtUri<'a>, 46 + #[serde(borrow)] 47 + pub value: String<'a>, 48 + } 49 + 50 + /// Marker type for deserializing records from this collection. 51 + pub struct StringRecord; 52 + impl jacquard_common::xrpc::XrpcResp for StringRecord { 53 + const NSID: &'static str = "sh.tangled.string"; 54 + const ENCODING: &'static str = "application/json"; 55 + type Output<'de> = StringGetRecordOutput<'de>; 56 + type Err<'de> = jacquard_common::types::collection::RecordError<'de>; 57 + } 58 + 29 59 impl jacquard_common::types::collection::Collection for String<'_> { 30 60 const NSID: &'static str = "sh.tangled.string"; 61 + type Record = StringRecord; 62 + } 63 + 64 + impl From<StringGetRecordOutput<'_>> for String<'static> { 65 + fn from(output: StringGetRecordOutput<'_>) -> Self { 66 + use jacquard_common::IntoStatic; 67 + output.value.into_static() 68 + } 31 69 }
+38
crates/jacquard-api/src/sh_weaver/actor/profile.rs
··· 57 57 pub tangled: std::option::Option<bool>, 58 58 } 59 59 60 + /// Typed wrapper for GetRecord response with this collection's record type. 61 + #[derive( 62 + serde::Serialize, 63 + serde::Deserialize, 64 + Debug, 65 + Clone, 66 + PartialEq, 67 + Eq, 68 + jacquard_derive::IntoStatic 69 + )] 70 + #[serde(rename_all = "camelCase")] 71 + pub struct ProfileGetRecordOutput<'a> { 72 + #[serde(skip_serializing_if = "std::option::Option::is_none")] 73 + #[serde(borrow)] 74 + pub cid: std::option::Option<jacquard_common::types::string::Cid<'a>>, 75 + #[serde(borrow)] 76 + pub uri: jacquard_common::types::string::AtUri<'a>, 77 + #[serde(borrow)] 78 + pub value: Profile<'a>, 79 + } 80 + 81 + /// Marker type for deserializing records from this collection. 82 + pub struct ProfileRecord; 83 + impl jacquard_common::xrpc::XrpcResp for ProfileRecord { 84 + const NSID: &'static str = "sh.weaver.actor.profile"; 85 + const ENCODING: &'static str = "application/json"; 86 + type Output<'de> = ProfileGetRecordOutput<'de>; 87 + type Err<'de> = jacquard_common::types::collection::RecordError<'de>; 88 + } 89 + 60 90 impl jacquard_common::types::collection::Collection for Profile<'_> { 61 91 const NSID: &'static str = "sh.weaver.actor.profile"; 92 + type Record = ProfileRecord; 93 + } 94 + 95 + impl From<ProfileGetRecordOutput<'_>> for Profile<'static> { 96 + fn from(output: ProfileGetRecordOutput<'_>) -> Self { 97 + use jacquard_common::IntoStatic; 98 + output.value.into_static() 99 + } 62 100 } 63 101 64 102 pub type PronounsList<'a> = Vec<jacquard_common::CowStr<'a>>;
+38
crates/jacquard-api/src/sh_weaver/edit/cursor.rs
··· 95 95 pub side: std::option::Option<crate::sh_weaver::edit::cursor::CursorSide<'a>>, 96 96 } 97 97 98 + /// Typed wrapper for GetRecord response with this collection's record type. 99 + #[derive( 100 + serde::Serialize, 101 + serde::Deserialize, 102 + Debug, 103 + Clone, 104 + PartialEq, 105 + Eq, 106 + jacquard_derive::IntoStatic 107 + )] 108 + #[serde(rename_all = "camelCase")] 109 + pub struct CursorGetRecordOutput<'a> { 110 + #[serde(skip_serializing_if = "std::option::Option::is_none")] 111 + #[serde(borrow)] 112 + pub cid: std::option::Option<jacquard_common::types::string::Cid<'a>>, 113 + #[serde(borrow)] 114 + pub uri: jacquard_common::types::string::AtUri<'a>, 115 + #[serde(borrow)] 116 + pub value: Cursor<'a>, 117 + } 118 + 119 + /// Marker type for deserializing records from this collection. 120 + pub struct CursorRecord; 121 + impl jacquard_common::xrpc::XrpcResp for CursorRecord { 122 + const NSID: &'static str = "sh.weaver.edit.cursor"; 123 + const ENCODING: &'static str = "application/json"; 124 + type Output<'de> = CursorGetRecordOutput<'de>; 125 + type Err<'de> = jacquard_common::types::collection::RecordError<'de>; 126 + } 127 + 98 128 impl jacquard_common::types::collection::Collection for Cursor<'_> { 99 129 const NSID: &'static str = "sh.weaver.edit.cursor"; 130 + type Record = CursorRecord; 131 + } 132 + 133 + impl From<CursorGetRecordOutput<'_>> for Cursor<'static> { 134 + fn from(output: CursorGetRecordOutput<'_>) -> Self { 135 + use jacquard_common::IntoStatic; 136 + output.value.into_static() 137 + } 100 138 } 101 139 102 140 #[jacquard_derive::lexicon]
+38
crates/jacquard-api/src/sh_weaver/edit/diff.rs
··· 26 26 pub snapshot: jacquard_common::types::blob::Blob<'a>, 27 27 } 28 28 29 + /// Typed wrapper for GetRecord response with this collection's record type. 30 + #[derive( 31 + serde::Serialize, 32 + serde::Deserialize, 33 + Debug, 34 + Clone, 35 + PartialEq, 36 + Eq, 37 + jacquard_derive::IntoStatic 38 + )] 39 + #[serde(rename_all = "camelCase")] 40 + pub struct DiffGetRecordOutput<'a> { 41 + #[serde(skip_serializing_if = "std::option::Option::is_none")] 42 + #[serde(borrow)] 43 + pub cid: std::option::Option<jacquard_common::types::string::Cid<'a>>, 44 + #[serde(borrow)] 45 + pub uri: jacquard_common::types::string::AtUri<'a>, 46 + #[serde(borrow)] 47 + pub value: Diff<'a>, 48 + } 49 + 50 + /// Marker type for deserializing records from this collection. 51 + pub struct DiffRecord; 52 + impl jacquard_common::xrpc::XrpcResp for DiffRecord { 53 + const NSID: &'static str = "sh.weaver.edit.diff"; 54 + const ENCODING: &'static str = "application/json"; 55 + type Output<'de> = DiffGetRecordOutput<'de>; 56 + type Err<'de> = jacquard_common::types::collection::RecordError<'de>; 57 + } 58 + 29 59 impl jacquard_common::types::collection::Collection for Diff<'_> { 30 60 const NSID: &'static str = "sh.weaver.edit.diff"; 61 + type Record = DiffRecord; 62 + } 63 + 64 + impl From<DiffGetRecordOutput<'_>> for Diff<'static> { 65 + fn from(output: DiffGetRecordOutput<'_>) -> Self { 66 + use jacquard_common::IntoStatic; 67 + output.value.into_static() 68 + } 31 69 }
+38
crates/jacquard-api/src/sh_weaver/edit/root.rs
··· 28 28 pub uri: jacquard_common::types::string::AtUri<'a>, 29 29 } 30 30 31 + /// Typed wrapper for GetRecord response with this collection's record type. 32 + #[derive( 33 + serde::Serialize, 34 + serde::Deserialize, 35 + Debug, 36 + Clone, 37 + PartialEq, 38 + Eq, 39 + jacquard_derive::IntoStatic 40 + )] 41 + #[serde(rename_all = "camelCase")] 42 + pub struct RootGetRecordOutput<'a> { 43 + #[serde(skip_serializing_if = "std::option::Option::is_none")] 44 + #[serde(borrow)] 45 + pub cid: std::option::Option<jacquard_common::types::string::Cid<'a>>, 46 + #[serde(borrow)] 47 + pub uri: jacquard_common::types::string::AtUri<'a>, 48 + #[serde(borrow)] 49 + pub value: Root<'a>, 50 + } 51 + 52 + /// Marker type for deserializing records from this collection. 53 + pub struct RootRecord; 54 + impl jacquard_common::xrpc::XrpcResp for RootRecord { 55 + const NSID: &'static str = "sh.weaver.edit.root"; 56 + const ENCODING: &'static str = "application/json"; 57 + type Output<'de> = RootGetRecordOutput<'de>; 58 + type Err<'de> = jacquard_common::types::collection::RecordError<'de>; 59 + } 60 + 31 61 impl jacquard_common::types::collection::Collection for Root<'_> { 32 62 const NSID: &'static str = "sh.weaver.edit.root"; 63 + type Record = RootRecord; 64 + } 65 + 66 + impl From<RootGetRecordOutput<'_>> for Root<'static> { 67 + fn from(output: RootGetRecordOutput<'_>) -> Self { 68 + use jacquard_common::IntoStatic; 69 + output.value.into_static() 70 + } 33 71 }
+38
crates/jacquard-api/src/sh_weaver/notebook/authors.rs
··· 63 63 pub created_at: std::option::Option<jacquard_common::types::string::Datetime>, 64 64 } 65 65 66 + /// Typed wrapper for GetRecord response with this collection's record type. 67 + #[derive( 68 + serde::Serialize, 69 + serde::Deserialize, 70 + Debug, 71 + Clone, 72 + PartialEq, 73 + Eq, 74 + jacquard_derive::IntoStatic 75 + )] 76 + #[serde(rename_all = "camelCase")] 77 + pub struct AuthorsGetRecordOutput<'a> { 78 + #[serde(skip_serializing_if = "std::option::Option::is_none")] 79 + #[serde(borrow)] 80 + pub cid: std::option::Option<jacquard_common::types::string::Cid<'a>>, 81 + #[serde(borrow)] 82 + pub uri: jacquard_common::types::string::AtUri<'a>, 83 + #[serde(borrow)] 84 + pub value: Authors<'a>, 85 + } 86 + 87 + /// Marker type for deserializing records from this collection. 88 + pub struct AuthorsRecord; 89 + impl jacquard_common::xrpc::XrpcResp for AuthorsRecord { 90 + const NSID: &'static str = "sh.weaver.notebook.authors"; 91 + const ENCODING: &'static str = "application/json"; 92 + type Output<'de> = AuthorsGetRecordOutput<'de>; 93 + type Err<'de> = jacquard_common::types::collection::RecordError<'de>; 94 + } 95 + 66 96 impl jacquard_common::types::collection::Collection for Authors<'_> { 67 97 const NSID: &'static str = "sh.weaver.notebook.authors"; 98 + type Record = AuthorsRecord; 99 + } 100 + 101 + impl From<AuthorsGetRecordOutput<'_>> for Authors<'static> { 102 + fn from(output: AuthorsGetRecordOutput<'_>) -> Self { 103 + use jacquard_common::IntoStatic; 104 + output.value.into_static() 105 + } 68 106 }
+38
crates/jacquard-api/src/sh_weaver/notebook/book.rs
··· 33 33 pub title: std::option::Option<crate::sh_weaver::notebook::Title<'a>>, 34 34 } 35 35 36 + /// Typed wrapper for GetRecord response with this collection's record type. 37 + #[derive( 38 + serde::Serialize, 39 + serde::Deserialize, 40 + Debug, 41 + Clone, 42 + PartialEq, 43 + Eq, 44 + jacquard_derive::IntoStatic 45 + )] 46 + #[serde(rename_all = "camelCase")] 47 + pub struct BookGetRecordOutput<'a> { 48 + #[serde(skip_serializing_if = "std::option::Option::is_none")] 49 + #[serde(borrow)] 50 + pub cid: std::option::Option<jacquard_common::types::string::Cid<'a>>, 51 + #[serde(borrow)] 52 + pub uri: jacquard_common::types::string::AtUri<'a>, 53 + #[serde(borrow)] 54 + pub value: Book<'a>, 55 + } 56 + 57 + /// Marker type for deserializing records from this collection. 58 + pub struct BookRecord; 59 + impl jacquard_common::xrpc::XrpcResp for BookRecord { 60 + const NSID: &'static str = "sh.weaver.notebook.book"; 61 + const ENCODING: &'static str = "application/json"; 62 + type Output<'de> = BookGetRecordOutput<'de>; 63 + type Err<'de> = jacquard_common::types::collection::RecordError<'de>; 64 + } 65 + 36 66 impl jacquard_common::types::collection::Collection for Book<'_> { 37 67 const NSID: &'static str = "sh.weaver.notebook.book"; 68 + type Record = BookRecord; 69 + } 70 + 71 + impl From<BookGetRecordOutput<'_>> for Book<'static> { 72 + fn from(output: BookGetRecordOutput<'_>) -> Self { 73 + use jacquard_common::IntoStatic; 74 + output.value.into_static() 75 + } 38 76 }
+38
crates/jacquard-api/src/sh_weaver/notebook/chapter.rs
··· 34 34 pub title: std::option::Option<crate::sh_weaver::notebook::Title<'a>>, 35 35 } 36 36 37 + /// Typed wrapper for GetRecord response with this collection's record type. 38 + #[derive( 39 + serde::Serialize, 40 + serde::Deserialize, 41 + Debug, 42 + Clone, 43 + PartialEq, 44 + Eq, 45 + jacquard_derive::IntoStatic 46 + )] 47 + #[serde(rename_all = "camelCase")] 48 + pub struct ChapterGetRecordOutput<'a> { 49 + #[serde(skip_serializing_if = "std::option::Option::is_none")] 50 + #[serde(borrow)] 51 + pub cid: std::option::Option<jacquard_common::types::string::Cid<'a>>, 52 + #[serde(borrow)] 53 + pub uri: jacquard_common::types::string::AtUri<'a>, 54 + #[serde(borrow)] 55 + pub value: Chapter<'a>, 56 + } 57 + 58 + /// Marker type for deserializing records from this collection. 59 + pub struct ChapterRecord; 60 + impl jacquard_common::xrpc::XrpcResp for ChapterRecord { 61 + const NSID: &'static str = "sh.weaver.notebook.chapter"; 62 + const ENCODING: &'static str = "application/json"; 63 + type Output<'de> = ChapterGetRecordOutput<'de>; 64 + type Err<'de> = jacquard_common::types::collection::RecordError<'de>; 65 + } 66 + 37 67 impl jacquard_common::types::collection::Collection for Chapter<'_> { 38 68 const NSID: &'static str = "sh.weaver.notebook.chapter"; 69 + type Record = ChapterRecord; 70 + } 71 + 72 + impl From<ChapterGetRecordOutput<'_>> for Chapter<'static> { 73 + fn from(output: ChapterGetRecordOutput<'_>) -> Self { 74 + use jacquard_common::IntoStatic; 75 + output.value.into_static() 76 + } 39 77 }
+38
crates/jacquard-api/src/sh_weaver/notebook/entry.rs
··· 34 34 pub title: crate::sh_weaver::notebook::Title<'a>, 35 35 } 36 36 37 + /// Typed wrapper for GetRecord response with this collection's record type. 38 + #[derive( 39 + serde::Serialize, 40 + serde::Deserialize, 41 + Debug, 42 + Clone, 43 + PartialEq, 44 + Eq, 45 + jacquard_derive::IntoStatic 46 + )] 47 + #[serde(rename_all = "camelCase")] 48 + pub struct EntryGetRecordOutput<'a> { 49 + #[serde(skip_serializing_if = "std::option::Option::is_none")] 50 + #[serde(borrow)] 51 + pub cid: std::option::Option<jacquard_common::types::string::Cid<'a>>, 52 + #[serde(borrow)] 53 + pub uri: jacquard_common::types::string::AtUri<'a>, 54 + #[serde(borrow)] 55 + pub value: Entry<'a>, 56 + } 57 + 58 + /// Marker type for deserializing records from this collection. 59 + pub struct EntryRecord; 60 + impl jacquard_common::xrpc::XrpcResp for EntryRecord { 61 + const NSID: &'static str = "sh.weaver.notebook.entry"; 62 + const ENCODING: &'static str = "application/json"; 63 + type Output<'de> = EntryGetRecordOutput<'de>; 64 + type Err<'de> = jacquard_common::types::collection::RecordError<'de>; 65 + } 66 + 37 67 impl jacquard_common::types::collection::Collection for Entry<'_> { 38 68 const NSID: &'static str = "sh.weaver.notebook.entry"; 69 + type Record = EntryRecord; 70 + } 71 + 72 + impl From<EntryGetRecordOutput<'_>> for Entry<'static> { 73 + fn from(output: EntryGetRecordOutput<'_>) -> Self { 74 + use jacquard_common::IntoStatic; 75 + output.value.into_static() 76 + } 39 77 }
+38
crates/jacquard-api/src/sh_weaver/publish/blob.rs
··· 23 23 pub upload: jacquard_common::types::blob::Blob<'a>, 24 24 } 25 25 26 + /// Typed wrapper for GetRecord response with this collection's record type. 27 + #[derive( 28 + serde::Serialize, 29 + serde::Deserialize, 30 + Debug, 31 + Clone, 32 + PartialEq, 33 + Eq, 34 + jacquard_derive::IntoStatic 35 + )] 36 + #[serde(rename_all = "camelCase")] 37 + pub struct BlobGetRecordOutput<'a> { 38 + #[serde(skip_serializing_if = "std::option::Option::is_none")] 39 + #[serde(borrow)] 40 + pub cid: std::option::Option<jacquard_common::types::string::Cid<'a>>, 41 + #[serde(borrow)] 42 + pub uri: jacquard_common::types::string::AtUri<'a>, 43 + #[serde(borrow)] 44 + pub value: Blob<'a>, 45 + } 46 + 47 + /// Marker type for deserializing records from this collection. 48 + pub struct BlobRecord; 49 + impl jacquard_common::xrpc::XrpcResp for BlobRecord { 50 + const NSID: &'static str = "sh.weaver.publish.blob"; 51 + const ENCODING: &'static str = "application/json"; 52 + type Output<'de> = BlobGetRecordOutput<'de>; 53 + type Err<'de> = jacquard_common::types::collection::RecordError<'de>; 54 + } 55 + 26 56 impl jacquard_common::types::collection::Collection for Blob<'_> { 27 57 const NSID: &'static str = "sh.weaver.publish.blob"; 58 + type Record = BlobRecord; 59 + } 60 + 61 + impl From<BlobGetRecordOutput<'_>> for Blob<'static> { 62 + fn from(output: BlobGetRecordOutput<'_>) -> Self { 63 + use jacquard_common::IntoStatic; 64 + output.value.into_static() 65 + } 28 66 }
+38
crates/jacquard-api/src/social_clippr/actor/profile.rs
··· 33 33 pub display_name: jacquard_common::CowStr<'a>, 34 34 } 35 35 36 + /// Typed wrapper for GetRecord response with this collection's record type. 37 + #[derive( 38 + serde::Serialize, 39 + serde::Deserialize, 40 + Debug, 41 + Clone, 42 + PartialEq, 43 + Eq, 44 + jacquard_derive::IntoStatic 45 + )] 46 + #[serde(rename_all = "camelCase")] 47 + pub struct ProfileGetRecordOutput<'a> { 48 + #[serde(skip_serializing_if = "std::option::Option::is_none")] 49 + #[serde(borrow)] 50 + pub cid: std::option::Option<jacquard_common::types::string::Cid<'a>>, 51 + #[serde(borrow)] 52 + pub uri: jacquard_common::types::string::AtUri<'a>, 53 + #[serde(borrow)] 54 + pub value: Profile<'a>, 55 + } 56 + 57 + /// Marker type for deserializing records from this collection. 58 + pub struct ProfileRecord; 59 + impl jacquard_common::xrpc::XrpcResp for ProfileRecord { 60 + const NSID: &'static str = "social.clippr.actor.profile"; 61 + const ENCODING: &'static str = "application/json"; 62 + type Output<'de> = ProfileGetRecordOutput<'de>; 63 + type Err<'de> = jacquard_common::types::collection::RecordError<'de>; 64 + } 65 + 36 66 impl jacquard_common::types::collection::Collection for Profile<'_> { 37 67 const NSID: &'static str = "social.clippr.actor.profile"; 68 + type Record = ProfileRecord; 69 + } 70 + 71 + impl From<ProfileGetRecordOutput<'_>> for Profile<'static> { 72 + fn from(output: ProfileGetRecordOutput<'_>) -> Self { 73 + use jacquard_common::IntoStatic; 74 + output.value.into_static() 75 + } 38 76 }
+38
crates/jacquard-api/src/social_clippr/feed/clip.rs
··· 49 49 pub url: jacquard_common::types::string::Uri<'a>, 50 50 } 51 51 52 + /// Typed wrapper for GetRecord response with this collection's record type. 53 + #[derive( 54 + serde::Serialize, 55 + serde::Deserialize, 56 + Debug, 57 + Clone, 58 + PartialEq, 59 + Eq, 60 + jacquard_derive::IntoStatic 61 + )] 62 + #[serde(rename_all = "camelCase")] 63 + pub struct ClipGetRecordOutput<'a> { 64 + #[serde(skip_serializing_if = "std::option::Option::is_none")] 65 + #[serde(borrow)] 66 + pub cid: std::option::Option<jacquard_common::types::string::Cid<'a>>, 67 + #[serde(borrow)] 68 + pub uri: jacquard_common::types::string::AtUri<'a>, 69 + #[serde(borrow)] 70 + pub value: Clip<'a>, 71 + } 72 + 73 + /// Marker type for deserializing records from this collection. 74 + pub struct ClipRecord; 75 + impl jacquard_common::xrpc::XrpcResp for ClipRecord { 76 + const NSID: &'static str = "social.clippr.feed.clip"; 77 + const ENCODING: &'static str = "application/json"; 78 + type Output<'de> = ClipGetRecordOutput<'de>; 79 + type Err<'de> = jacquard_common::types::collection::RecordError<'de>; 80 + } 81 + 52 82 impl jacquard_common::types::collection::Collection for Clip<'_> { 53 83 const NSID: &'static str = "social.clippr.feed.clip"; 84 + type Record = ClipRecord; 85 + } 86 + 87 + impl From<ClipGetRecordOutput<'_>> for Clip<'static> { 88 + fn from(output: ClipGetRecordOutput<'_>) -> Self { 89 + use jacquard_common::IntoStatic; 90 + output.value.into_static() 91 + } 54 92 }
+38
crates/jacquard-api/src/social_clippr/feed/tag.rs
··· 33 33 pub name: jacquard_common::CowStr<'a>, 34 34 } 35 35 36 + /// Typed wrapper for GetRecord response with this collection's record type. 37 + #[derive( 38 + serde::Serialize, 39 + serde::Deserialize, 40 + Debug, 41 + Clone, 42 + PartialEq, 43 + Eq, 44 + jacquard_derive::IntoStatic 45 + )] 46 + #[serde(rename_all = "camelCase")] 47 + pub struct TagGetRecordOutput<'a> { 48 + #[serde(skip_serializing_if = "std::option::Option::is_none")] 49 + #[serde(borrow)] 50 + pub cid: std::option::Option<jacquard_common::types::string::Cid<'a>>, 51 + #[serde(borrow)] 52 + pub uri: jacquard_common::types::string::AtUri<'a>, 53 + #[serde(borrow)] 54 + pub value: Tag<'a>, 55 + } 56 + 57 + /// Marker type for deserializing records from this collection. 58 + pub struct TagRecord; 59 + impl jacquard_common::xrpc::XrpcResp for TagRecord { 60 + const NSID: &'static str = "social.clippr.feed.tag"; 61 + const ENCODING: &'static str = "application/json"; 62 + type Output<'de> = TagGetRecordOutput<'de>; 63 + type Err<'de> = jacquard_common::types::collection::RecordError<'de>; 64 + } 65 + 36 66 impl jacquard_common::types::collection::Collection for Tag<'_> { 37 67 const NSID: &'static str = "social.clippr.feed.tag"; 68 + type Record = TagRecord; 69 + } 70 + 71 + impl From<TagGetRecordOutput<'_>> for Tag<'static> { 72 + fn from(output: TagGetRecordOutput<'_>) -> Self { 73 + use jacquard_common::IntoStatic; 74 + output.value.into_static() 75 + } 38 76 }
+38
crates/jacquard-api/src/social_grain/actor/profile.rs
··· 33 33 pub display_name: std::option::Option<jacquard_common::CowStr<'a>>, 34 34 } 35 35 36 + /// Typed wrapper for GetRecord response with this collection's record type. 37 + #[derive( 38 + serde::Serialize, 39 + serde::Deserialize, 40 + Debug, 41 + Clone, 42 + PartialEq, 43 + Eq, 44 + jacquard_derive::IntoStatic 45 + )] 46 + #[serde(rename_all = "camelCase")] 47 + pub struct ProfileGetRecordOutput<'a> { 48 + #[serde(skip_serializing_if = "std::option::Option::is_none")] 49 + #[serde(borrow)] 50 + pub cid: std::option::Option<jacquard_common::types::string::Cid<'a>>, 51 + #[serde(borrow)] 52 + pub uri: jacquard_common::types::string::AtUri<'a>, 53 + #[serde(borrow)] 54 + pub value: Profile<'a>, 55 + } 56 + 57 + /// Marker type for deserializing records from this collection. 58 + pub struct ProfileRecord; 59 + impl jacquard_common::xrpc::XrpcResp for ProfileRecord { 60 + const NSID: &'static str = "social.grain.actor.profile"; 61 + const ENCODING: &'static str = "application/json"; 62 + type Output<'de> = ProfileGetRecordOutput<'de>; 63 + type Err<'de> = jacquard_common::types::collection::RecordError<'de>; 64 + } 65 + 36 66 impl jacquard_common::types::collection::Collection for Profile<'_> { 37 67 const NSID: &'static str = "social.grain.actor.profile"; 68 + type Record = ProfileRecord; 69 + } 70 + 71 + impl From<ProfileGetRecordOutput<'_>> for Profile<'static> { 72 + fn from(output: ProfileGetRecordOutput<'_>) -> Self { 73 + use jacquard_common::IntoStatic; 74 + output.value.into_static() 75 + } 38 76 }
+38
crates/jacquard-api/src/social_grain/favorite.rs
··· 22 22 pub subject: jacquard_common::types::string::AtUri<'a>, 23 23 } 24 24 25 + /// Typed wrapper for GetRecord response with this collection's record type. 26 + #[derive( 27 + serde::Serialize, 28 + serde::Deserialize, 29 + Debug, 30 + Clone, 31 + PartialEq, 32 + Eq, 33 + jacquard_derive::IntoStatic 34 + )] 35 + #[serde(rename_all = "camelCase")] 36 + pub struct FavoriteGetRecordOutput<'a> { 37 + #[serde(skip_serializing_if = "std::option::Option::is_none")] 38 + #[serde(borrow)] 39 + pub cid: std::option::Option<jacquard_common::types::string::Cid<'a>>, 40 + #[serde(borrow)] 41 + pub uri: jacquard_common::types::string::AtUri<'a>, 42 + #[serde(borrow)] 43 + pub value: Favorite<'a>, 44 + } 45 + 46 + /// Marker type for deserializing records from this collection. 47 + pub struct FavoriteRecord; 48 + impl jacquard_common::xrpc::XrpcResp for FavoriteRecord { 49 + const NSID: &'static str = "social.grain.favorite"; 50 + const ENCODING: &'static str = "application/json"; 51 + type Output<'de> = FavoriteGetRecordOutput<'de>; 52 + type Err<'de> = jacquard_common::types::collection::RecordError<'de>; 53 + } 54 + 25 55 impl jacquard_common::types::collection::Collection for Favorite<'_> { 26 56 const NSID: &'static str = "social.grain.favorite"; 57 + type Record = FavoriteRecord; 58 + } 59 + 60 + impl From<FavoriteGetRecordOutput<'_>> for Favorite<'static> { 61 + fn from(output: FavoriteGetRecordOutput<'_>) -> Self { 62 + use jacquard_common::IntoStatic; 63 + output.value.into_static() 64 + } 27 65 }
+38
crates/jacquard-api/src/social_grain/gallery.rs
··· 31 31 pub title: jacquard_common::CowStr<'a>, 32 32 } 33 33 34 + /// Typed wrapper for GetRecord response with this collection's record type. 35 + #[derive( 36 + serde::Serialize, 37 + serde::Deserialize, 38 + Debug, 39 + Clone, 40 + PartialEq, 41 + Eq, 42 + jacquard_derive::IntoStatic 43 + )] 44 + #[serde(rename_all = "camelCase")] 45 + pub struct GalleryGetRecordOutput<'a> { 46 + #[serde(skip_serializing_if = "std::option::Option::is_none")] 47 + #[serde(borrow)] 48 + pub cid: std::option::Option<jacquard_common::types::string::Cid<'a>>, 49 + #[serde(borrow)] 50 + pub uri: jacquard_common::types::string::AtUri<'a>, 51 + #[serde(borrow)] 52 + pub value: Gallery<'a>, 53 + } 54 + 55 + /// Marker type for deserializing records from this collection. 56 + pub struct GalleryRecord; 57 + impl jacquard_common::xrpc::XrpcResp for GalleryRecord { 58 + const NSID: &'static str = "social.grain.gallery"; 59 + const ENCODING: &'static str = "application/json"; 60 + type Output<'de> = GalleryGetRecordOutput<'de>; 61 + type Err<'de> = jacquard_common::types::collection::RecordError<'de>; 62 + } 63 + 34 64 impl jacquard_common::types::collection::Collection for Gallery<'_> { 35 65 const NSID: &'static str = "social.grain.gallery"; 66 + type Record = GalleryRecord; 67 + } 68 + 69 + impl From<GalleryGetRecordOutput<'_>> for Gallery<'static> { 70 + fn from(output: GalleryGetRecordOutput<'_>) -> Self { 71 + use jacquard_common::IntoStatic; 72 + output.value.into_static() 73 + } 36 74 } 37 75 38 76 #[jacquard_derive::lexicon]
+38
crates/jacquard-api/src/social_grain/gallery/item.rs
··· 26 26 pub position: std::option::Option<i64>, 27 27 } 28 28 29 + /// Typed wrapper for GetRecord response with this collection's record type. 30 + #[derive( 31 + serde::Serialize, 32 + serde::Deserialize, 33 + Debug, 34 + Clone, 35 + PartialEq, 36 + Eq, 37 + jacquard_derive::IntoStatic 38 + )] 39 + #[serde(rename_all = "camelCase")] 40 + pub struct ItemGetRecordOutput<'a> { 41 + #[serde(skip_serializing_if = "std::option::Option::is_none")] 42 + #[serde(borrow)] 43 + pub cid: std::option::Option<jacquard_common::types::string::Cid<'a>>, 44 + #[serde(borrow)] 45 + pub uri: jacquard_common::types::string::AtUri<'a>, 46 + #[serde(borrow)] 47 + pub value: Item<'a>, 48 + } 49 + 50 + /// Marker type for deserializing records from this collection. 51 + pub struct ItemRecord; 52 + impl jacquard_common::xrpc::XrpcResp for ItemRecord { 53 + const NSID: &'static str = "social.grain.gallery.item"; 54 + const ENCODING: &'static str = "application/json"; 55 + type Output<'de> = ItemGetRecordOutput<'de>; 56 + type Err<'de> = jacquard_common::types::collection::RecordError<'de>; 57 + } 58 + 29 59 impl jacquard_common::types::collection::Collection for Item<'_> { 30 60 const NSID: &'static str = "social.grain.gallery.item"; 61 + type Record = ItemRecord; 62 + } 63 + 64 + impl From<ItemGetRecordOutput<'_>> for Item<'static> { 65 + fn from(output: ItemGetRecordOutput<'_>) -> Self { 66 + use jacquard_common::IntoStatic; 67 + output.value.into_static() 68 + } 31 69 }
+38
crates/jacquard-api/src/social_grain/photo.rs
··· 31 31 pub photo: jacquard_common::types::blob::Blob<'a>, 32 32 } 33 33 34 + /// Typed wrapper for GetRecord response with this collection's record type. 35 + #[derive( 36 + serde::Serialize, 37 + serde::Deserialize, 38 + Debug, 39 + Clone, 40 + PartialEq, 41 + Eq, 42 + jacquard_derive::IntoStatic 43 + )] 44 + #[serde(rename_all = "camelCase")] 45 + pub struct PhotoGetRecordOutput<'a> { 46 + #[serde(skip_serializing_if = "std::option::Option::is_none")] 47 + #[serde(borrow)] 48 + pub cid: std::option::Option<jacquard_common::types::string::Cid<'a>>, 49 + #[serde(borrow)] 50 + pub uri: jacquard_common::types::string::AtUri<'a>, 51 + #[serde(borrow)] 52 + pub value: Photo<'a>, 53 + } 54 + 55 + /// Marker type for deserializing records from this collection. 56 + pub struct PhotoRecord; 57 + impl jacquard_common::xrpc::XrpcResp for PhotoRecord { 58 + const NSID: &'static str = "social.grain.photo"; 59 + const ENCODING: &'static str = "application/json"; 60 + type Output<'de> = PhotoGetRecordOutput<'de>; 61 + type Err<'de> = jacquard_common::types::collection::RecordError<'de>; 62 + } 63 + 34 64 impl jacquard_common::types::collection::Collection for Photo<'_> { 35 65 const NSID: &'static str = "social.grain.photo"; 66 + type Record = PhotoRecord; 67 + } 68 + 69 + impl From<PhotoGetRecordOutput<'_>> for Photo<'static> { 70 + fn from(output: PhotoGetRecordOutput<'_>) -> Self { 71 + use jacquard_common::IntoStatic; 72 + output.value.into_static() 73 + } 36 74 } 37 75 38 76 #[jacquard_derive::lexicon]
+38
crates/jacquard-api/src/social_grain/photo/exif.rs
··· 50 50 pub photo: jacquard_common::types::string::AtUri<'a>, 51 51 } 52 52 53 + /// Typed wrapper for GetRecord response with this collection's record type. 54 + #[derive( 55 + serde::Serialize, 56 + serde::Deserialize, 57 + Debug, 58 + Clone, 59 + PartialEq, 60 + Eq, 61 + jacquard_derive::IntoStatic 62 + )] 63 + #[serde(rename_all = "camelCase")] 64 + pub struct ExifGetRecordOutput<'a> { 65 + #[serde(skip_serializing_if = "std::option::Option::is_none")] 66 + #[serde(borrow)] 67 + pub cid: std::option::Option<jacquard_common::types::string::Cid<'a>>, 68 + #[serde(borrow)] 69 + pub uri: jacquard_common::types::string::AtUri<'a>, 70 + #[serde(borrow)] 71 + pub value: Exif<'a>, 72 + } 73 + 74 + /// Marker type for deserializing records from this collection. 75 + pub struct ExifRecord; 76 + impl jacquard_common::xrpc::XrpcResp for ExifRecord { 77 + const NSID: &'static str = "social.grain.photo.exif"; 78 + const ENCODING: &'static str = "application/json"; 79 + type Output<'de> = ExifGetRecordOutput<'de>; 80 + type Err<'de> = jacquard_common::types::collection::RecordError<'de>; 81 + } 82 + 53 83 impl jacquard_common::types::collection::Collection for Exif<'_> { 54 84 const NSID: &'static str = "social.grain.photo.exif"; 85 + type Record = ExifRecord; 86 + } 87 + 88 + impl From<ExifGetRecordOutput<'_>> for Exif<'static> { 89 + fn from(output: ExifGetRecordOutput<'_>) -> Self { 90 + use jacquard_common::IntoStatic; 91 + output.value.into_static() 92 + } 55 93 }
+38
crates/jacquard-api/src/social_pmsky/proposal.rs
··· 55 55 pub ver: std::option::Option<i64>, 56 56 } 57 57 58 + /// Typed wrapper for GetRecord response with this collection's record type. 59 + #[derive( 60 + serde::Serialize, 61 + serde::Deserialize, 62 + Debug, 63 + Clone, 64 + PartialEq, 65 + Eq, 66 + jacquard_derive::IntoStatic 67 + )] 68 + #[serde(rename_all = "camelCase")] 69 + pub struct ProposalGetRecordOutput<'a> { 70 + #[serde(skip_serializing_if = "std::option::Option::is_none")] 71 + #[serde(borrow)] 72 + pub cid: std::option::Option<jacquard_common::types::string::Cid<'a>>, 73 + #[serde(borrow)] 74 + pub uri: jacquard_common::types::string::AtUri<'a>, 75 + #[serde(borrow)] 76 + pub value: Proposal<'a>, 77 + } 78 + 79 + /// Marker type for deserializing records from this collection. 80 + pub struct ProposalRecord; 81 + impl jacquard_common::xrpc::XrpcResp for ProposalRecord { 82 + const NSID: &'static str = "social.pmsky.proposal"; 83 + const ENCODING: &'static str = "application/json"; 84 + type Output<'de> = ProposalGetRecordOutput<'de>; 85 + type Err<'de> = jacquard_common::types::collection::RecordError<'de>; 86 + } 87 + 58 88 impl jacquard_common::types::collection::Collection for Proposal<'_> { 59 89 const NSID: &'static str = "social.pmsky.proposal"; 90 + type Record = ProposalRecord; 91 + } 92 + 93 + impl From<ProposalGetRecordOutput<'_>> for Proposal<'static> { 94 + fn from(output: ProposalGetRecordOutput<'_>) -> Self { 95 + use jacquard_common::IntoStatic; 96 + output.value.into_static() 97 + } 60 98 }
+38
crates/jacquard-api/src/social_pmsky/vote.rs
··· 44 44 pub val: i64, 45 45 } 46 46 47 + /// Typed wrapper for GetRecord response with this collection's record type. 48 + #[derive( 49 + serde::Serialize, 50 + serde::Deserialize, 51 + Debug, 52 + Clone, 53 + PartialEq, 54 + Eq, 55 + jacquard_derive::IntoStatic 56 + )] 57 + #[serde(rename_all = "camelCase")] 58 + pub struct VoteGetRecordOutput<'a> { 59 + #[serde(skip_serializing_if = "std::option::Option::is_none")] 60 + #[serde(borrow)] 61 + pub cid: std::option::Option<jacquard_common::types::string::Cid<'a>>, 62 + #[serde(borrow)] 63 + pub uri: jacquard_common::types::string::AtUri<'a>, 64 + #[serde(borrow)] 65 + pub value: Vote<'a>, 66 + } 67 + 68 + /// Marker type for deserializing records from this collection. 69 + pub struct VoteRecord; 70 + impl jacquard_common::xrpc::XrpcResp for VoteRecord { 71 + const NSID: &'static str = "social.pmsky.vote"; 72 + const ENCODING: &'static str = "application/json"; 73 + type Output<'de> = VoteGetRecordOutput<'de>; 74 + type Err<'de> = jacquard_common::types::collection::RecordError<'de>; 75 + } 76 + 47 77 impl jacquard_common::types::collection::Collection for Vote<'_> { 48 78 const NSID: &'static str = "social.pmsky.vote"; 79 + type Record = VoteRecord; 80 + } 81 + 82 + impl From<VoteGetRecordOutput<'_>> for Vote<'static> { 83 + fn from(output: VoteGetRecordOutput<'_>) -> Self { 84 + use jacquard_common::IntoStatic; 85 + output.value.into_static() 86 + } 49 87 }
+38
crates/jacquard-api/src/social_psky/actor/profile.rs
··· 23 23 pub nickname: std::option::Option<jacquard_common::CowStr<'a>>, 24 24 } 25 25 26 + /// Typed wrapper for GetRecord response with this collection's record type. 27 + #[derive( 28 + serde::Serialize, 29 + serde::Deserialize, 30 + Debug, 31 + Clone, 32 + PartialEq, 33 + Eq, 34 + jacquard_derive::IntoStatic 35 + )] 36 + #[serde(rename_all = "camelCase")] 37 + pub struct ProfileGetRecordOutput<'a> { 38 + #[serde(skip_serializing_if = "std::option::Option::is_none")] 39 + #[serde(borrow)] 40 + pub cid: std::option::Option<jacquard_common::types::string::Cid<'a>>, 41 + #[serde(borrow)] 42 + pub uri: jacquard_common::types::string::AtUri<'a>, 43 + #[serde(borrow)] 44 + pub value: Profile<'a>, 45 + } 46 + 47 + /// Marker type for deserializing records from this collection. 48 + pub struct ProfileRecord; 49 + impl jacquard_common::xrpc::XrpcResp for ProfileRecord { 50 + const NSID: &'static str = "social.psky.actor.profile"; 51 + const ENCODING: &'static str = "application/json"; 52 + type Output<'de> = ProfileGetRecordOutput<'de>; 53 + type Err<'de> = jacquard_common::types::collection::RecordError<'de>; 54 + } 55 + 26 56 impl jacquard_common::types::collection::Collection for Profile<'_> { 27 57 const NSID: &'static str = "social.psky.actor.profile"; 58 + type Record = ProfileRecord; 59 + } 60 + 61 + impl From<ProfileGetRecordOutput<'_>> for Profile<'static> { 62 + fn from(output: ProfileGetRecordOutput<'_>) -> Self { 63 + use jacquard_common::IntoStatic; 64 + output.value.into_static() 65 + } 28 66 }
+38
crates/jacquard-api/src/social_psky/chat/message.rs
··· 32 32 pub room: jacquard_common::types::string::AtUri<'a>, 33 33 } 34 34 35 + /// Typed wrapper for GetRecord response with this collection's record type. 36 + #[derive( 37 + serde::Serialize, 38 + serde::Deserialize, 39 + Debug, 40 + Clone, 41 + PartialEq, 42 + Eq, 43 + jacquard_derive::IntoStatic 44 + )] 45 + #[serde(rename_all = "camelCase")] 46 + pub struct MessageGetRecordOutput<'a> { 47 + #[serde(skip_serializing_if = "std::option::Option::is_none")] 48 + #[serde(borrow)] 49 + pub cid: std::option::Option<jacquard_common::types::string::Cid<'a>>, 50 + #[serde(borrow)] 51 + pub uri: jacquard_common::types::string::AtUri<'a>, 52 + #[serde(borrow)] 53 + pub value: Message<'a>, 54 + } 55 + 56 + /// Marker type for deserializing records from this collection. 57 + pub struct MessageRecord; 58 + impl jacquard_common::xrpc::XrpcResp for MessageRecord { 59 + const NSID: &'static str = "social.psky.chat.message"; 60 + const ENCODING: &'static str = "application/json"; 61 + type Output<'de> = MessageGetRecordOutput<'de>; 62 + type Err<'de> = jacquard_common::types::collection::RecordError<'de>; 63 + } 64 + 35 65 impl jacquard_common::types::collection::Collection for Message<'_> { 36 66 const NSID: &'static str = "social.psky.chat.message"; 67 + type Record = MessageRecord; 68 + } 69 + 70 + impl From<MessageGetRecordOutput<'_>> for Message<'static> { 71 + fn from(output: MessageGetRecordOutput<'_>) -> Self { 72 + use jacquard_common::IntoStatic; 73 + output.value.into_static() 74 + } 37 75 }
+38
crates/jacquard-api/src/social_psky/chat/room.rs
··· 39 39 pub topic: std::option::Option<jacquard_common::CowStr<'a>>, 40 40 } 41 41 42 + /// Typed wrapper for GetRecord response with this collection's record type. 43 + #[derive( 44 + serde::Serialize, 45 + serde::Deserialize, 46 + Debug, 47 + Clone, 48 + PartialEq, 49 + Eq, 50 + jacquard_derive::IntoStatic 51 + )] 52 + #[serde(rename_all = "camelCase")] 53 + pub struct RoomGetRecordOutput<'a> { 54 + #[serde(skip_serializing_if = "std::option::Option::is_none")] 55 + #[serde(borrow)] 56 + pub cid: std::option::Option<jacquard_common::types::string::Cid<'a>>, 57 + #[serde(borrow)] 58 + pub uri: jacquard_common::types::string::AtUri<'a>, 59 + #[serde(borrow)] 60 + pub value: Room<'a>, 61 + } 62 + 63 + /// Marker type for deserializing records from this collection. 64 + pub struct RoomRecord; 65 + impl jacquard_common::xrpc::XrpcResp for RoomRecord { 66 + const NSID: &'static str = "social.psky.chat.room"; 67 + const ENCODING: &'static str = "application/json"; 68 + type Output<'de> = RoomGetRecordOutput<'de>; 69 + type Err<'de> = jacquard_common::types::collection::RecordError<'de>; 70 + } 71 + 42 72 impl jacquard_common::types::collection::Collection for Room<'_> { 43 73 const NSID: &'static str = "social.psky.chat.room"; 74 + type Record = RoomRecord; 75 + } 76 + 77 + impl From<RoomGetRecordOutput<'_>> for Room<'static> { 78 + fn from(output: RoomGetRecordOutput<'_>) -> Self { 79 + use jacquard_common::IntoStatic; 80 + output.value.into_static() 81 + } 44 82 } 45 83 46 84 #[jacquard_derive::lexicon]
+38
crates/jacquard-api/src/tools_smokesignal/blahg/content/post.rs
··· 57 57 pub title: std::option::Option<jacquard_common::CowStr<'a>>, 58 58 } 59 59 60 + /// Typed wrapper for GetRecord response with this collection's record type. 61 + #[derive( 62 + serde::Serialize, 63 + serde::Deserialize, 64 + Debug, 65 + Clone, 66 + PartialEq, 67 + Eq, 68 + jacquard_derive::IntoStatic 69 + )] 70 + #[serde(rename_all = "camelCase")] 71 + pub struct PostGetRecordOutput<'a> { 72 + #[serde(skip_serializing_if = "std::option::Option::is_none")] 73 + #[serde(borrow)] 74 + pub cid: std::option::Option<jacquard_common::types::string::Cid<'a>>, 75 + #[serde(borrow)] 76 + pub uri: jacquard_common::types::string::AtUri<'a>, 77 + #[serde(borrow)] 78 + pub value: Post<'a>, 79 + } 80 + 81 + /// Marker type for deserializing records from this collection. 82 + pub struct PostRecord; 83 + impl jacquard_common::xrpc::XrpcResp for PostRecord { 84 + const NSID: &'static str = "tools.smokesignal.blahg.content.post"; 85 + const ENCODING: &'static str = "application/json"; 86 + type Output<'de> = PostGetRecordOutput<'de>; 87 + type Err<'de> = jacquard_common::types::collection::RecordError<'de>; 88 + } 89 + 60 90 impl jacquard_common::types::collection::Collection for Post<'_> { 61 91 const NSID: &'static str = "tools.smokesignal.blahg.content.post"; 92 + type Record = PostRecord; 93 + } 94 + 95 + impl From<PostGetRecordOutput<'_>> for Post<'static> { 96 + fn from(output: PostGetRecordOutput<'_>) -> Self { 97 + use jacquard_common::IntoStatic; 98 + output.value.into_static() 99 + } 62 100 }
+38
crates/jacquard-api/src/uk_ewancroft/now.rs
··· 24 24 pub text: jacquard_common::CowStr<'a>, 25 25 } 26 26 27 + /// Typed wrapper for GetRecord response with this collection's record type. 28 + #[derive( 29 + serde::Serialize, 30 + serde::Deserialize, 31 + Debug, 32 + Clone, 33 + PartialEq, 34 + Eq, 35 + jacquard_derive::IntoStatic 36 + )] 37 + #[serde(rename_all = "camelCase")] 38 + pub struct NowGetRecordOutput<'a> { 39 + #[serde(skip_serializing_if = "std::option::Option::is_none")] 40 + #[serde(borrow)] 41 + pub cid: std::option::Option<jacquard_common::types::string::Cid<'a>>, 42 + #[serde(borrow)] 43 + pub uri: jacquard_common::types::string::AtUri<'a>, 44 + #[serde(borrow)] 45 + pub value: Now<'a>, 46 + } 47 + 48 + /// Marker type for deserializing records from this collection. 49 + pub struct NowRecord; 50 + impl jacquard_common::xrpc::XrpcResp for NowRecord { 51 + const NSID: &'static str = "uk.ewancroft.now"; 52 + const ENCODING: &'static str = "application/json"; 53 + type Output<'de> = NowGetRecordOutput<'de>; 54 + type Err<'de> = jacquard_common::types::collection::RecordError<'de>; 55 + } 56 + 27 57 impl jacquard_common::types::collection::Collection for Now<'_> { 28 58 const NSID: &'static str = "uk.ewancroft.now"; 59 + type Record = NowRecord; 60 + } 61 + 62 + impl From<NowGetRecordOutput<'_>> for Now<'static> { 63 + fn from(output: NowGetRecordOutput<'_>) -> Self { 64 + use jacquard_common::IntoStatic; 65 + output.value.into_static() 66 + } 29 67 }
+38
crates/jacquard-api/src/uk_skyblur/post.rs
··· 42 42 pub visibility: jacquard_common::CowStr<'a>, 43 43 } 44 44 45 + /// Typed wrapper for GetRecord response with this collection's record type. 46 + #[derive( 47 + serde::Serialize, 48 + serde::Deserialize, 49 + Debug, 50 + Clone, 51 + PartialEq, 52 + Eq, 53 + jacquard_derive::IntoStatic 54 + )] 55 + #[serde(rename_all = "camelCase")] 56 + pub struct PostGetRecordOutput<'a> { 57 + #[serde(skip_serializing_if = "std::option::Option::is_none")] 58 + #[serde(borrow)] 59 + pub cid: std::option::Option<jacquard_common::types::string::Cid<'a>>, 60 + #[serde(borrow)] 61 + pub uri: jacquard_common::types::string::AtUri<'a>, 62 + #[serde(borrow)] 63 + pub value: Post<'a>, 64 + } 65 + 66 + /// Marker type for deserializing records from this collection. 67 + pub struct PostRecord; 68 + impl jacquard_common::xrpc::XrpcResp for PostRecord { 69 + const NSID: &'static str = "uk.skyblur.post"; 70 + const ENCODING: &'static str = "application/json"; 71 + type Output<'de> = PostGetRecordOutput<'de>; 72 + type Err<'de> = jacquard_common::types::collection::RecordError<'de>; 73 + } 74 + 45 75 impl jacquard_common::types::collection::Collection for Post<'_> { 46 76 const NSID: &'static str = "uk.skyblur.post"; 77 + type Record = PostRecord; 78 + } 79 + 80 + impl From<PostGetRecordOutput<'_>> for Post<'static> { 81 + fn from(output: PostGetRecordOutput<'_>) -> Self { 82 + use jacquard_common::IntoStatic; 83 + output.value.into_static() 84 + } 47 85 }
+38
crates/jacquard-api/src/uk_skyblur/preference.rs
··· 22 22 pub my_page: crate::uk_skyblur::preference::MyPage<'a>, 23 23 } 24 24 25 + /// Typed wrapper for GetRecord response with this collection's record type. 26 + #[derive( 27 + serde::Serialize, 28 + serde::Deserialize, 29 + Debug, 30 + Clone, 31 + PartialEq, 32 + Eq, 33 + jacquard_derive::IntoStatic 34 + )] 35 + #[serde(rename_all = "camelCase")] 36 + pub struct PreferenceGetRecordOutput<'a> { 37 + #[serde(skip_serializing_if = "std::option::Option::is_none")] 38 + #[serde(borrow)] 39 + pub cid: std::option::Option<jacquard_common::types::string::Cid<'a>>, 40 + #[serde(borrow)] 41 + pub uri: jacquard_common::types::string::AtUri<'a>, 42 + #[serde(borrow)] 43 + pub value: Preference<'a>, 44 + } 45 + 46 + /// Marker type for deserializing records from this collection. 47 + pub struct PreferenceRecord; 48 + impl jacquard_common::xrpc::XrpcResp for PreferenceRecord { 49 + const NSID: &'static str = "uk.skyblur.preference"; 50 + const ENCODING: &'static str = "application/json"; 51 + type Output<'de> = PreferenceGetRecordOutput<'de>; 52 + type Err<'de> = jacquard_common::types::collection::RecordError<'de>; 53 + } 54 + 25 55 impl jacquard_common::types::collection::Collection for Preference<'_> { 26 56 const NSID: &'static str = "uk.skyblur.preference"; 57 + type Record = PreferenceRecord; 58 + } 59 + 60 + impl From<PreferenceGetRecordOutput<'_>> for Preference<'static> { 61 + fn from(output: PreferenceGetRecordOutput<'_>) -> Self { 62 + use jacquard_common::IntoStatic; 63 + output.value.into_static() 64 + } 27 65 } 28 66 29 67 #[jacquard_derive::lexicon]
+38
crates/jacquard-api/src/us_polhem/blog/content.rs
··· 28 28 pub slug: jacquard_common::CowStr<'a>, 29 29 } 30 30 31 + /// Typed wrapper for GetRecord response with this collection's record type. 32 + #[derive( 33 + serde::Serialize, 34 + serde::Deserialize, 35 + Debug, 36 + Clone, 37 + PartialEq, 38 + Eq, 39 + jacquard_derive::IntoStatic 40 + )] 41 + #[serde(rename_all = "camelCase")] 42 + pub struct ContentGetRecordOutput<'a> { 43 + #[serde(skip_serializing_if = "std::option::Option::is_none")] 44 + #[serde(borrow)] 45 + pub cid: std::option::Option<jacquard_common::types::string::Cid<'a>>, 46 + #[serde(borrow)] 47 + pub uri: jacquard_common::types::string::AtUri<'a>, 48 + #[serde(borrow)] 49 + pub value: Content<'a>, 50 + } 51 + 52 + /// Marker type for deserializing records from this collection. 53 + pub struct ContentRecord; 54 + impl jacquard_common::xrpc::XrpcResp for ContentRecord { 55 + const NSID: &'static str = "us.polhem.blog.content"; 56 + const ENCODING: &'static str = "application/json"; 57 + type Output<'de> = ContentGetRecordOutput<'de>; 58 + type Err<'de> = jacquard_common::types::collection::RecordError<'de>; 59 + } 60 + 31 61 impl jacquard_common::types::collection::Collection for Content<'_> { 32 62 const NSID: &'static str = "us.polhem.blog.content"; 63 + type Record = ContentRecord; 64 + } 65 + 66 + impl From<ContentGetRecordOutput<'_>> for Content<'static> { 67 + fn from(output: ContentGetRecordOutput<'_>) -> Self { 68 + use jacquard_common::IntoStatic; 69 + output.value.into_static() 70 + } 33 71 }
+38
crates/jacquard-api/src/us_polhem/blog/post.rs
··· 43 43 pub visibility: std::option::Option<jacquard_common::CowStr<'a>>, 44 44 } 45 45 46 + /// Typed wrapper for GetRecord response with this collection's record type. 47 + #[derive( 48 + serde::Serialize, 49 + serde::Deserialize, 50 + Debug, 51 + Clone, 52 + PartialEq, 53 + Eq, 54 + jacquard_derive::IntoStatic 55 + )] 56 + #[serde(rename_all = "camelCase")] 57 + pub struct PostGetRecordOutput<'a> { 58 + #[serde(skip_serializing_if = "std::option::Option::is_none")] 59 + #[serde(borrow)] 60 + pub cid: std::option::Option<jacquard_common::types::string::Cid<'a>>, 61 + #[serde(borrow)] 62 + pub uri: jacquard_common::types::string::AtUri<'a>, 63 + #[serde(borrow)] 64 + pub value: Post<'a>, 65 + } 66 + 67 + /// Marker type for deserializing records from this collection. 68 + pub struct PostRecord; 69 + impl jacquard_common::xrpc::XrpcResp for PostRecord { 70 + const NSID: &'static str = "us.polhem.blog.post"; 71 + const ENCODING: &'static str = "application/json"; 72 + type Output<'de> = PostGetRecordOutput<'de>; 73 + type Err<'de> = jacquard_common::types::collection::RecordError<'de>; 74 + } 75 + 46 76 impl jacquard_common::types::collection::Collection for Post<'_> { 47 77 const NSID: &'static str = "us.polhem.blog.post"; 78 + type Record = PostRecord; 79 + } 80 + 81 + impl From<PostGetRecordOutput<'_>> for Post<'static> { 82 + fn from(output: PostGetRecordOutput<'_>) -> Self { 83 + use jacquard_common::IntoStatic; 84 + output.value.into_static() 85 + } 48 86 }
+38
crates/jacquard-api/src/us_polhem/blog/tag.rs
··· 27 27 pub slug: jacquard_common::CowStr<'a>, 28 28 } 29 29 30 + /// Typed wrapper for GetRecord response with this collection's record type. 31 + #[derive( 32 + serde::Serialize, 33 + serde::Deserialize, 34 + Debug, 35 + Clone, 36 + PartialEq, 37 + Eq, 38 + jacquard_derive::IntoStatic 39 + )] 40 + #[serde(rename_all = "camelCase")] 41 + pub struct TagGetRecordOutput<'a> { 42 + #[serde(skip_serializing_if = "std::option::Option::is_none")] 43 + #[serde(borrow)] 44 + pub cid: std::option::Option<jacquard_common::types::string::Cid<'a>>, 45 + #[serde(borrow)] 46 + pub uri: jacquard_common::types::string::AtUri<'a>, 47 + #[serde(borrow)] 48 + pub value: Tag<'a>, 49 + } 50 + 51 + /// Marker type for deserializing records from this collection. 52 + pub struct TagRecord; 53 + impl jacquard_common::xrpc::XrpcResp for TagRecord { 54 + const NSID: &'static str = "us.polhem.blog.tag"; 55 + const ENCODING: &'static str = "application/json"; 56 + type Output<'de> = TagGetRecordOutput<'de>; 57 + type Err<'de> = jacquard_common::types::collection::RecordError<'de>; 58 + } 59 + 30 60 impl jacquard_common::types::collection::Collection for Tag<'_> { 31 61 const NSID: &'static str = "us.polhem.blog.tag"; 62 + type Record = TagRecord; 63 + } 64 + 65 + impl From<TagGetRecordOutput<'_>> for Tag<'static> { 66 + fn from(output: TagGetRecordOutput<'_>) -> Self { 67 + use jacquard_common::IntoStatic; 68 + output.value.into_static() 69 + } 32 70 }
+38
crates/jacquard-api/src/win_tomo_x/pushat/allow.rs
··· 24 24 pub created_at: jacquard_common::types::string::Datetime, 25 25 } 26 26 27 + /// Typed wrapper for GetRecord response with this collection's record type. 28 + #[derive( 29 + serde::Serialize, 30 + serde::Deserialize, 31 + Debug, 32 + Clone, 33 + PartialEq, 34 + Eq, 35 + jacquard_derive::IntoStatic 36 + )] 37 + #[serde(rename_all = "camelCase")] 38 + pub struct AllowGetRecordOutput<'a> { 39 + #[serde(skip_serializing_if = "std::option::Option::is_none")] 40 + #[serde(borrow)] 41 + pub cid: std::option::Option<jacquard_common::types::string::Cid<'a>>, 42 + #[serde(borrow)] 43 + pub uri: jacquard_common::types::string::AtUri<'a>, 44 + #[serde(borrow)] 45 + pub value: Allow<'a>, 46 + } 47 + 48 + /// Marker type for deserializing records from this collection. 49 + pub struct AllowRecord; 50 + impl jacquard_common::xrpc::XrpcResp for AllowRecord { 51 + const NSID: &'static str = "win.tomo-x.pushat.allow"; 52 + const ENCODING: &'static str = "application/json"; 53 + type Output<'de> = AllowGetRecordOutput<'de>; 54 + type Err<'de> = jacquard_common::types::collection::RecordError<'de>; 55 + } 56 + 27 57 impl jacquard_common::types::collection::Collection for Allow<'_> { 28 58 const NSID: &'static str = "win.tomo-x.pushat.allow"; 59 + type Record = AllowRecord; 60 + } 61 + 62 + impl From<AllowGetRecordOutput<'_>> for Allow<'static> { 63 + fn from(output: AllowGetRecordOutput<'_>) -> Self { 64 + use jacquard_common::IntoStatic; 65 + output.value.into_static() 66 + } 29 67 }
+4 -4
crates/jacquard-axum/Cargo.toml
··· 15 15 [lib] 16 16 path = "src/lib.rs" 17 17 18 - [[bin]] 19 - name = "jacquard_axum" 20 - path = "src/main.rs" 21 - 18 + [[example]] 19 + name = "axum_server" 20 + path = "../../examples/axum_server.rs" 21 + required-features = ["jacquard/fancy"] 22 22 23 23 [dependencies] 24 24 axum = "0.8.6"
+84
crates/jacquard-axum/src/lib.rs
··· 1 + //! # Axum helpers for jacquard XRPC server implementations 2 + //! 3 + //! ## Usage 4 + //! 5 + //! ```no_run 6 + //! use axum::{Router, routing::get, http::StatusCode, response::IntoResponse, Json}; 7 + //! use jacquard_axum::{ ExtractXrpc, IntoRouter }; 8 + //! use std::collections::BTreeMap; 9 + //! use miette::{IntoDiagnostic, Result}; 10 + //! use jacquard::api::com_atproto::identity::resolve_handle::{ResolveHandle, ResolveHandleRequest, ResolveHandleOutput}; 11 + //! use jacquard_common::types::string::Did; 12 + //! 13 + //! async fn handle_resolve( 14 + //! ExtractXrpc(req): ExtractXrpc<ResolveHandleRequest> 15 + //! ) -> Result<Json<ResolveHandleOutput<'static>>, StatusCode> { 16 + //! // req is ResolveHandle<'static>, ready to use 17 + //! let handle = req.handle; 18 + //! // ... resolve logic 19 + //! # let output = ResolveHandleOutput { did: Did::new_static("did:plc:test").unwrap(), extra_data: BTreeMap::new() }; 20 + //! Ok(Json(output)) 21 + //! } 22 + //! 23 + //! #[tokio::main] 24 + //! async fn main() -> Result<()> { 25 + //! let app = Router::new() 26 + //! .route("/", axum::routing::get(|| async { "hello world!" })) 27 + //! .merge(ResolveHandleRequest::into_router(handle_resolve)); 28 + //! 29 + //! let listener = tokio::net::TcpListener::bind("0.0.0.0:3000") 30 + //! .await 31 + //! .into_diagnostic()?; 32 + //! axum::serve(listener, app).await.unwrap(); 33 + //! Ok(()) 34 + //! } 35 + //! ``` 36 + //! 37 + //! 38 + //! The extractor uses the [`XrpcEndpoint`] trait to determine request type: 39 + //! - **Query**: Deserializes from query string parameters 40 + //! - **Procedure**: Deserializes from request body (supports custom encodings via `decode_body`) 41 + //! 42 + //! Deserialization errors return a 400 Bad Request with a JSON error body matching 43 + //! the XRPC error format. 44 + //! 45 + //! The extractor deserializes to borrowed types first, then converts to `'static` via 46 + //! [`IntoStatic`], avoiding the DeserializeOwned requirement of the Json axum extractor and similar. 47 + 1 48 use axum::{ 49 + Router, 2 50 body::Bytes, 3 51 extract::{FromRequest, Request}, 4 52 http::StatusCode, ··· 9 57 xrpc::{XrpcEndpoint, XrpcMethod, XrpcRequest}, 10 58 }; 11 59 use serde_json::json; 60 + 61 + /// Axum extractor for XRPC requests 62 + /// 63 + /// Deserializes incoming requests based on the endpoint's method type (Query or Procedure) 64 + /// and returns the owned (`'static`) request type ready for handler logic. 12 65 13 66 pub struct ExtractXrpc<E: XrpcEndpoint>(pub E::Request<'static>); 14 67 ··· 86 139 #[error("UTF-8 decode error: {0}")] 87 140 Utf8DecodeError(std::string::FromUtf8Error), 88 141 } 142 + 143 + /// Conversion trait to turn an XrpcEndpoint and a handler into an axum Router 144 + pub trait IntoRouter { 145 + fn into_router<T, S, U>(handler: U) -> Router<S> 146 + where 147 + T: 'static, 148 + S: Clone + Send + Sync + 'static, 149 + U: axum::handler::Handler<T, S>; 150 + } 151 + 152 + impl<X> IntoRouter for X 153 + where 154 + X: XrpcEndpoint, 155 + { 156 + /// Creates an axum router that will invoke `handler` in response to xrpc 157 + /// request `X`. 158 + fn into_router<T, S, U>(handler: U) -> Router<S> 159 + where 160 + T: 'static, 161 + S: Clone + Send + Sync + 'static, 162 + U: axum::handler::Handler<T, S>, 163 + { 164 + Router::new().route( 165 + X::PATH, 166 + (match X::METHOD { 167 + XrpcMethod::Query => axum::routing::get, 168 + XrpcMethod::Procedure(_) => axum::routing::post, 169 + })(handler), 170 + ) 171 + } 172 + }
-73
crates/jacquard-axum/src/main.rs
··· 1 - use axum::{Router, response::IntoResponse}; 2 - use jacquard::{ 3 - IntoStatic, 4 - api::com_atproto::identity::resolve_did::{ResolveDid, ResolveDidOutput, ResolveDidRequest}, 5 - identity::resolver::IdentityResolver, 6 - types::value::Data, 7 - xrpc::XrpcEndpoint, 8 - }; 9 - use jacquard_axum::ExtractXrpc; 10 - use jacquard_common::xrpc::XrpcMethod; 11 - use miette::{IntoDiagnostic, Result}; 12 - use tracing_subscriber::EnvFilter; 13 - 14 - trait IntoRouter { 15 - fn into_router<T, S, U>(handler: U) -> Router<S> 16 - where 17 - T: 'static, 18 - S: Clone + Send + Sync + 'static, 19 - U: axum::handler::Handler<T, S>; 20 - } 21 - 22 - impl<X> IntoRouter for X 23 - where 24 - X: XrpcEndpoint, 25 - { 26 - /// Creates an axum router that will invoke `handler` in response to xrpc 27 - /// request `X`. 28 - fn into_router<T, S, U>(handler: U) -> Router<S> 29 - where 30 - T: 'static, 31 - S: Clone + Send + Sync + 'static, 32 - U: axum::handler::Handler<T, S>, 33 - { 34 - Router::new().route( 35 - X::PATH, 36 - (match X::METHOD { 37 - XrpcMethod::Query => axum::routing::get, 38 - XrpcMethod::Procedure(_) => axum::routing::post, 39 - })(handler), 40 - ) 41 - } 42 - } 43 - 44 - #[axum_macros::debug_handler] 45 - async fn handler(ExtractXrpc(args): ExtractXrpc<ResolveDidRequest>) -> &'static str { 46 - "hello world!" 47 - // let res = jacquard::identity::slingshot_resolver_default(); 48 - // let doc = res.resolve_did_doc(&args.did).await?; 49 - // let valid_doc = doc.parse()?; 50 - // let doc_value = serde_json::to_value(valid_doc).unwrap(); 51 - // Ok(ResolveDidOutput { 52 - // did_doc: Data::from_json(&doc_value).unwrap().into_static(), 53 - // extra_data: Default::default(), 54 - // } 55 - // .into()) 56 - } 57 - 58 - #[tokio::main] 59 - async fn main() -> Result<()> { 60 - tracing_subscriber::fmt() 61 - .with_timer(tracing_subscriber::fmt::time::UtcTime::rfc_3339()) 62 - .with_env_filter(EnvFilter::from_env("QDPDS_LOG")) 63 - .init(); 64 - let app = Router::new() 65 - .route("/", axum::routing::get(|| async { "hello world!" })) 66 - .merge(ResolveDidRequest::into_router(handler)) 67 - .layer(tower_http::trace::TraceLayer::new_for_http()); 68 - let listener = tokio::net::TcpListener::bind("0.0.0.0:3000") 69 - .await 70 - .into_diagnostic()?; 71 - axum::serve(listener, app).await.unwrap(); 72 - Ok(()) 73 - }
-1
crates/jacquard-common/Cargo.toml
··· 23 23 miette.workspace = true 24 24 multibase = "0.9.1" 25 25 multihash = "0.19.3" 26 - num-traits = "0.2.19" 27 26 ouroboros = "0.18.5" 28 27 rand = "0.9.2" 29 28 regex = "1.11.3"
+182 -2
crates/jacquard-common/src/lib.rs
··· 1 - //! Common types for the jacquard implementation of atproto 1 + //! # Common types for the jacquard implementation of atproto 2 + //! 3 + //! ## Working with Lifetimes and Zero-Copy Deserialization 4 + //! 5 + //! Jacquard is designed around zero-copy deserialization: types like `Post<'de>` can borrow 6 + //! strings and other data directly from the response buffer instead of allocating owned copies. 7 + //! This is great for performance, but it creates some interesting challenges when combined with 8 + //! async Rust and trait bounds. 9 + //! 10 + //! ### The Problem: Lifetimes + Async + Traits 11 + //! 12 + //! The naive approach would be to put a lifetime parameter on the trait itself: 13 + //! 14 + //! ```ignore 15 + //! trait XrpcRequest<'de> { 16 + //! type Output: Deserialize<'de>; 17 + //! // ... 18 + //! } 19 + //! ``` 20 + //! 21 + //! This looks reasonable until you try to use it in a generic context. If you have a function 22 + //! that works with *any* lifetime, you need a Higher-Ranked Trait Bound (HRTB): 23 + //! 24 + //! ```ignore 25 + //! fn foo<R>(response: &[u8]) 26 + //! where 27 + //! R: for<'any> XrpcRequest<'any> 28 + //! { 29 + //! // deserialize from response... 30 + //! } 31 + //! ``` 32 + //! 33 + //! The `for<'any>` bound says "this type must implement `XrpcRequest` for *every possible lifetime*", 34 + //! which is effectively the same as requiring `DeserializeOwned`. You've just thrown away your 35 + //! zero-copy optimization, and this also won't work on most of the types in jacquard. The vast 36 + //! majority of them have either a custom Deserialize implementation which will borrow if it 37 + //! can, a #[serde(borrow)] attribute on one or more fields, or an equivalent lifetime bound 38 + //! attribute, associated with the Deserialize derive macro. 39 + //! 40 + //! It gets worse with async. If you want to return borrowed data from an async method, where does 41 + //! the lifetime come from? The response buffer needs to outlive the borrow, but the buffer is 42 + //! consumed by the HTTP call. You end up with "cannot infer appropriate lifetime" errors or even 43 + //! more confusing errors because the compiler can't prove the buffer will stay alive. You *could* 44 + //! do some lifetime laundering with `unsafe`, but you don't actually *need* to tell rustc to "trust 45 + //! me, bro", you can, with some cleverness, explain this to the compiler in a way that it can 46 + //! reason about perfectly well. 47 + //! 48 + //! ### Explaining where the buffer goes to `rustc`: GATs + Method-Level Lifetimes 49 + //! 50 + //! The fix is to use Generic Associated Types (GATs) on the trait's associated types, while keeping 51 + //! the trait itself lifetime-free: 52 + //! 53 + //! ```ignore 54 + //! trait XrpcResp { 55 + //! const NSID: &'static str; 56 + //! 57 + //! // GATs: lifetime is on the associated type, not the trait 58 + //! type Output<'de>: Deserialize<'de> + IntoStatic; 59 + //! type Err<'de>: Deserialize<'de> + IntoStatic; 60 + //! } 61 + //! ``` 62 + //! 63 + //! Now you can write trait bounds without HRTBs: 64 + //! 65 + //! ```ignore 66 + //! fn foo<R: XrpcResp>(response: &[u8]) { 67 + //! // Compiler can pick a concrete lifetime for R::Output<'_> 68 + //! } 69 + //! ``` 70 + //! 71 + //! Methods that need lifetimes use method-level generic parameters: 72 + //! 73 + //! ```ignore 74 + //! // This is part of a trait from jacquard itself, used to genericize updates to the Bluesky 75 + //! // preferences union, so that if you implement a similar lexicon type in your AppView or App 76 + //! // Server API, you don't have to special-case it. 77 + //! 78 + //! trait VecUpdate { 79 + //! type GetRequest<'de>: XrpcRequest<'de>; // GAT 80 + //! type PutRequest<'de>: XrpcRequest<'de>; // GAT 81 + //! 82 + //! // Method-level lifetime, not trait-level 83 + //! fn extract_vec<'s>( 84 + //! output: <Self::GetRequest<'s> as XrpcRequest<'s>>::Output<'s> 85 + //! ) -> Vec<Self::Item>; 86 + //! } 87 + //! ``` 88 + //! 89 + //! The compiler can monomorphize for concrete lifetimes instead of trying to prove bounds hold 90 + //! for *all* lifetimes at once. 91 + //! 92 + //! ### Handling Async with `Response<R: XrpcResp>` 93 + //! 94 + //! For the async problem, we use a wrapper type that owns the response buffer: 95 + //! 96 + //! ```ignore 97 + //! pub struct Response<R: XrpcResp> { 98 + //! buffer: Bytes, // Refcounted, cheap to clone 99 + //! status: StatusCode, 100 + //! _marker: PhantomData<R>, 101 + //! } 102 + //! ``` 103 + //! 104 + //! This lets async methods return a `Response` that owns its buffer, then the *caller* decides 105 + //! the lifetime strategy: 106 + //! 107 + //! ```ignore 108 + //! // Zero-copy: borrow from the owned buffer 109 + //! let output: R::Output<'_> = response.parse()?; 110 + //! 111 + //! // Owned: convert to 'static via IntoStatic 112 + //! let output: R::Output<'static> = response.into_output()?; 113 + //! ``` 114 + //! 115 + //! The async method doesn't need to know or care about lifetimes - it just returns the `Response`. 116 + //! The caller gets full control over whether to use borrowed or owned data. It can even decide 117 + //! after the fact that it doesn't want to parse out the API response type that it asked for. Instead 118 + //! it can call `.parse_data()` or `.parse_raw()` on the response to get loosely typed, validated 119 + //! data or minimally typed maximally accepting data values out. 120 + //! 121 + //! ### Example: XRPC Traits in Practice 122 + //! 123 + //! Here's how the pattern works with the XRPC layer: 124 + //! 125 + //! ```ignore 126 + //! // XrpcResp uses GATs, not trait-level lifetime 127 + //! trait XrpcResp { 128 + //! const NSID: &'static str; 129 + //! type Output<'de>: Deserialize<'de> + IntoStatic; 130 + //! type Err<'de>: Deserialize<'de> + IntoStatic; 131 + //! } 132 + //! 133 + //! // Response owns the buffer (Bytes is refcounted) 134 + //! pub struct Response<R: XrpcResp> { 135 + //! buffer: Bytes, 136 + //! status: StatusCode, 137 + //! _marker: PhantomData<R>, 138 + //! } 139 + //! 140 + //! impl<R: XrpcResp> Response<R> { 141 + //! // Borrow from owned buffer 142 + //! pub fn parse(&self) -> XrpcResult<R::Output<'_>> { 143 + //! serde_json::from_slice(&self.buffer) 144 + //! } 145 + //! 146 + //! // Convert to fully owned 147 + //! pub fn into_output(self) -> XrpcResult<R::Output<'static>> { 148 + //! let borrowed = self.parse()?; 149 + //! Ok(borrowed.into_static()) 150 + //! } 151 + //! } 152 + //! 153 + //! // Async method returns Response, caller chooses strategy 154 + //! async fn send_xrpc<Req>(&self, req: Req) -> Result<Response<Req::Response>> 155 + //! where 156 + //! Req: XrpcRequest<'_> 157 + //! { 158 + //! // Do HTTP call, get Bytes buffer 159 + //! // Return Response wrapping that buffer 160 + //! // No lifetime issues - Response owns the buffer 161 + //! } 162 + //! 163 + //! // Usage: 164 + //! let response = send_xrpc(request).await?; 165 + //! 166 + //! // Zero-copy: borrow from response buffer 167 + //! let output = response.parse()?; // Output<'_> borrows from response 168 + //! 169 + //! // Or owned: convert to 'static 170 + //! let output = response.into_output()?; // Output<'static> is fully owned 171 + //! ``` 172 + //! 173 + //! When you see types like `Response<R: XrpcResp>` or methods with lifetime parameters, 174 + //! this is the pattern at work. It looks a bit funky, but it's solving a specific problem 175 + //! in a way that doesn't require unsafe code or much actual work from you, if you're using it. 176 + //! It's also not too bad to write, once you're aware of the pattern and why it works. If you run 177 + //! into a lifetime/borrowing inference issue in jacquard, please contact the crate author. She'd 178 + //! be happy to debug, and if it's using a method from one of the jacquard crates and seems like 179 + //! it *should* just work, that is a bug in jacquard, and you should [file an issue](https://tangled.org/@nonbinary.computer/jacquard/). 2 180 3 181 #![warn(missing_docs)] 182 + pub use bytes; 183 + pub use chrono; 4 184 pub use cowstr::CowStr; 5 185 pub use into_static::IntoStatic; 6 186 pub use smol_str; ··· 21 201 pub mod session; 22 202 /// Baseline fundamental AT Protocol data types. 23 203 pub mod types; 24 - /// XRPC protocol types and traits 204 + // XRPC protocol types and traits 25 205 pub mod xrpc; 26 206 27 207 /// Authorization token types for XRPC requests.
+38 -1
crates/jacquard-common/src/types/collection.rs
··· 1 1 use core::fmt; 2 2 3 - use serde::Serialize; 3 + use serde::{Deserialize, Serialize}; 4 4 5 + use crate::IntoStatic; 6 + use crate::types::value::Data; 5 7 use crate::types::{ 6 8 aturi::RepoPath, 7 9 nsid::Nsid, 8 10 recordkey::{RecordKey, RecordKeyType, Rkey}, 9 11 }; 12 + use crate::xrpc::XrpcResp; 10 13 11 14 /// Trait for a collection of records that can be stored in a repository. 12 15 /// ··· 16 19 pub trait Collection: fmt::Debug + Serialize { 17 20 /// The NSID for the Lexicon that defines the schema of records in this collection. 18 21 const NSID: &'static str; 22 + 23 + /// A marker type implementing [`XrpcResp`] that allows typed deserialization of records 24 + /// from this collection. Used by [`Agent::get_record`] to return properly typed responses. 25 + type Record: XrpcResp; 19 26 20 27 /// Returns the [`Nsid`] for the Lexicon that defines the schema of records in this 21 28 /// collection. ··· 49 56 } 50 57 } 51 58 } 59 + 60 + /// Generic error type for record retrieval operations. 61 + /// 62 + /// Used by generated collection marker types as their error type. 63 + #[derive( 64 + Debug, Clone, PartialEq, Eq, Serialize, Deserialize, thiserror::Error, miette::Diagnostic, 65 + )] 66 + #[serde(tag = "error", content = "message")] 67 + pub enum RecordError<'a> { 68 + /// The requested record was not found 69 + #[error("RecordNotFound")] 70 + #[serde(rename = "RecordNotFound")] 71 + RecordNotFound(Option<String>), 72 + /// An unknown error occurred 73 + #[error("Unknown")] 74 + #[serde(rename = "Unknown")] 75 + #[serde(borrow)] 76 + Unknown(Data<'a>), 77 + } 78 + 79 + impl IntoStatic for RecordError<'_> { 80 + type Output = RecordError<'static>; 81 + 82 + fn into_static(self) -> Self::Output { 83 + match self { 84 + RecordError::RecordNotFound(msg) => RecordError::RecordNotFound(msg), 85 + RecordError::Unknown(data) => RecordError::Unknown(data.into_static()), 86 + } 87 + } 88 + }
+18 -6
crates/jacquard-common/src/types/did_doc.rs
··· 15 15 /// pattern as lexicon structs. 16 16 /// 17 17 /// Example 18 - /// ```ignore 18 + /// ``` 19 19 /// use jacquard_common::types::did_doc::DidDocument; 20 - /// use serde_json::json; 21 - /// let doc: DidDocument<'_> = serde_json::from_value(json!({ 20 + /// 21 + /// # fn example() -> Result<(), Box<dyn std::error::Error>> { 22 + /// let json = r##"{ 22 23 /// "id": "did:plc:alice", 23 24 /// "alsoKnownAs": ["at://alice.example"], 24 - /// "service": [{"id":"#pds","type":"AtprotoPersonalDataServer","serviceEndpoint":"https://pds.example"}], 25 - /// "verificationMethod":[{"id":"#k","type":"Multikey","publicKeyMultibase":"z6Mki..."}] 26 - /// })).unwrap(); 25 + /// "service": [{ 26 + /// "id": "#pds", 27 + /// "type": "AtprotoPersonalDataServer", 28 + /// "serviceEndpoint": "https://pds.example" 29 + /// }], 30 + /// "verificationMethod": [{ 31 + /// "id": "#k", 32 + /// "type": "Multikey", 33 + /// "publicKeyMultibase": "z6MkhaXgBZDvotDkL5257faiztiGiC2QtKLGpbnnEGta2doK" 34 + /// }] 35 + /// }"##; 36 + /// let doc: DidDocument<'_> = serde_json::from_str(json)?; 27 37 /// assert_eq!(doc.id.as_str(), "did:plc:alice"); 28 38 /// assert!(doc.pds_endpoint().is_some()); 39 + /// # Ok(()) 40 + /// # } 29 41 /// ``` 30 42 #[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, Builder)] 31 43 #[builder(start_fn = new)]
+36 -24
crates/jacquard-common/src/types/value.rs
··· 358 358 /// similar to `serde_json::from_value()`. 359 359 /// 360 360 /// # Example 361 - /// ```ignore 362 - /// use jacquard_common::types::value::{Data, from_data}; 363 - /// use serde::Deserialize; 364 - /// 361 + /// ``` 362 + /// # use jacquard_common::types::value::{Data, from_data}; 363 + /// # use serde::Deserialize; 364 + /// # 365 365 /// #[derive(Deserialize)] 366 366 /// struct Post<'a> { 367 367 /// #[serde(borrow)] ··· 370 370 /// author: &'a str, 371 371 /// } 372 372 /// 373 - /// let data: Data = /* ... */; 373 + /// # fn example() -> Result<(), Box<dyn std::error::Error>> { 374 + /// # let json = serde_json::json!({"text": "hello", "author": "alice"}); 375 + /// # let data = Data::from_json(&json)?; 374 376 /// let post: Post = from_data(&data)?; 377 + /// # Ok(()) 378 + /// # } 375 379 /// ``` 376 380 pub fn from_data<'de, T>(data: &'de Data<'de>) -> Result<T, DataDeserializerError> 377 381 where ··· 385 389 /// Allows extracting strongly-typed structures from untyped `RawData` values. 386 390 /// 387 391 /// # Example 388 - /// ```ignore 389 - /// use jacquard_common::types::value::{RawData, from_raw_data}; 390 - /// use serde::Deserialize; 391 - /// 392 - /// #[derive(Deserialize)] 393 - /// struct Post<'a> { 394 - /// #[serde(borrow)] 395 - /// text: &'a str, 396 - /// #[serde(borrow)] 397 - /// author: &'a str, 392 + /// ``` 393 + /// # use jacquard_common::types::value::{RawData, from_raw_data, to_raw_data}; 394 + /// # use serde::{Serialize, Deserialize}; 395 + /// # 396 + /// #[derive(Serialize, Deserialize)] 397 + /// struct Post { 398 + /// text: String, 399 + /// author: String, 398 400 /// } 399 401 /// 400 - /// let data: RawData = /* ... */; 402 + /// # fn example() -> Result<(), Box<dyn std::error::Error>> { 403 + /// # let orig = Post { text: "hello".to_string(), author: "alice".to_string() }; 404 + /// # let data = to_raw_data(&orig)?; 401 405 /// let post: Post = from_raw_data(&data)?; 406 + /// # Ok(()) 407 + /// # } 402 408 /// ``` 403 409 pub fn from_raw_data<'de, T>(data: &'de RawData<'de>) -> Result<T, DataDeserializerError> 404 410 where ··· 412 418 /// Allows converting strongly-typed structures into untyped `RawData` values. 413 419 /// 414 420 /// # Example 415 - /// ```ignore 416 - /// use jacquard_common::types::value::{RawData, to_raw_data}; 417 - /// use serde::Serialize; 418 - /// 421 + /// ``` 422 + /// # use jacquard_common::types::value::{RawData, to_raw_data}; 423 + /// # use serde::Serialize; 424 + /// # 419 425 /// #[derive(Serialize)] 420 426 /// struct Post { 421 427 /// text: String, 422 428 /// likes: i64, 423 429 /// } 424 430 /// 431 + /// # fn example() -> Result<(), Box<dyn std::error::Error>> { 425 432 /// let post = Post { text: "hello".to_string(), likes: 42 }; 426 433 /// let data: RawData = to_raw_data(&post)?; 434 + /// # Ok(()) 435 + /// # } 427 436 /// ``` 428 437 pub fn to_raw_data<T>(value: &T) -> Result<RawData<'static>, serde_impl::RawDataSerializerError> 429 438 where ··· 437 446 /// Combines `to_raw_data()` and validation/type inference in one step. 438 447 /// 439 448 /// # Example 440 - /// ```ignore 441 - /// use jacquard_common::types::value::{Data, to_data}; 442 - /// use serde::Serialize; 443 - /// 449 + /// ``` 450 + /// # use jacquard_common::types::value::{Data, to_data}; 451 + /// # use serde::Serialize; 452 + /// # 444 453 /// #[derive(Serialize)] 445 454 /// struct Post { 446 455 /// text: String, 447 456 /// did: String, // Will be inferred as Did if valid 448 457 /// } 449 458 /// 459 + /// # fn example() -> Result<(), Box<dyn std::error::Error>> { 450 460 /// let post = Post { 451 461 /// text: "hello".to_string(), 452 462 /// did: "did:plc:abc123".to_string() 453 463 /// }; 454 464 /// let data: Data = to_data(&post)?; 465 + /// # Ok(()) 466 + /// # } 455 467 /// ``` 456 468 pub fn to_data<T>(value: &T) -> Result<Data<'static>, convert::ConversionError> 457 469 where
+46 -51
crates/jacquard-common/src/xrpc.rs
··· 1 - //! Stateless XRPC utilities and request/response mapping 1 + //! # Stateless XRPC utilities and request/response mapping 2 2 //! 3 3 //! Mapping overview: 4 4 //! - Success (2xx): parse body into the endpoint's typed output. ··· 9 9 //! can inspect `error="invalid_token"` or `error="use_dpop_nonce"` and refresh/retry. 10 10 //! If the header is absent, parse the body and map auth errors to 11 11 //! `AuthError::TokenExpired`/`InvalidToken`. 12 - //! 13 12 use bytes::Bytes; 14 13 use http::{ 15 14 HeaderName, HeaderValue, Request, StatusCode, ··· 135 134 /// 136 135 /// It is implemented by the code generation on a marker struct, like the client-side [XrpcResp] trait. 137 136 pub trait XrpcEndpoint { 138 - /// Fully-qualified path ('/xrpc/[nsid]') where this endpoint should live on the server 137 + /// Fully-qualified path ('/xrpc/\[nsid\]') where this endpoint should live on the server 139 138 const PATH: &'static str; 140 139 /// XRPC method (query/GET or procedure/POST) 141 140 const METHOD: XrpcMethod; ··· 195 194 /// Extension for stateless XRPC calls on any `HttpClient`. 196 195 /// 197 196 /// Example 198 - /// ```ignore 199 - /// use jacquard::client::XrpcExt; 200 - /// use jacquard::api::app_bsky::feed::get_author_feed::GetAuthorFeed; 201 - /// use jacquard::types::ident::AtIdentifier; 202 - /// use miette::IntoDiagnostic; 197 + /// ```no_run 198 + /// # #[tokio::main] 199 + /// # async fn main() -> Result<(), Box<dyn std::error::Error>> { 200 + /// use jacquard_common::xrpc::XrpcExt; 201 + /// use jacquard_common::http_client::HttpClient; 203 202 /// 204 - /// #[tokio::main] 205 - /// async fn main() -> miette::Result<()> { 206 - /// let http = reqwest::Client::new(); 207 - /// let base = url::Url::parse("https://public.api.bsky.app")?; 208 - /// let resp = http 209 - /// .xrpc(base) 210 - /// .send( 211 - /// GetAuthorFeed::new() 212 - /// .actor(AtIdentifier::new_static("pattern.atproto.systems").unwrap()) 213 - /// .limit(5) 214 - /// .build(), 215 - /// ) 216 - /// .await?; 217 - /// let out = resp.into_output()?; 218 - /// println!("author feed:\n{}", serde_json::to_string_pretty(&out).into_diagnostic()?); 219 - /// Ok(()) 220 - /// } 203 + /// let http = reqwest::Client::new(); 204 + /// let base = url::Url::parse("https://public.api.bsky.app")?; 205 + /// // let resp = http.xrpc(base).send(&request).await?; 206 + /// # Ok(()) 207 + /// # } 221 208 /// ``` 222 209 pub trait XrpcExt: HttpClient { 223 210 /// Start building an XRPC call for the given base URL. ··· 256 243 /// Stateless XRPC call builder. 257 244 /// 258 245 /// Example (per-request overrides) 259 - /// ```ignore 260 - /// use jacquard::client::{XrpcExt, AuthorizationToken}; 261 - /// use jacquard::api::app_bsky::feed::get_author_feed::GetAuthorFeed; 262 - /// use jacquard::types::ident::AtIdentifier; 263 - /// use jacquard::CowStr; 264 - /// use miette::IntoDiagnostic; 246 + /// ```no_run 247 + /// # #[tokio::main] 248 + /// # async fn main() -> Result<(), Box<dyn std::error::Error>> { 249 + /// use jacquard_common::xrpc::XrpcExt; 250 + /// use jacquard_common::{AuthorizationToken, CowStr}; 265 251 /// 266 - /// #[tokio::main] 267 - /// async fn main() -> miette::Result<()> { 268 - /// let http = reqwest::Client::new(); 269 - /// let base = url::Url::parse("https://public.api.bsky.app")?; 270 - /// let resp = http 271 - /// .xrpc(base) 272 - /// .auth(AuthorizationToken::Bearer(CowStr::from("ACCESS_JWT"))) 273 - /// .accept_labelers(vec![CowStr::from("did:plc:labelerid")]) 274 - /// .header(http::header::USER_AGENT, http::HeaderValue::from_static("jacquard-example")) 275 - /// .send( 276 - /// GetAuthorFeed::new() 277 - /// .actor(AtIdentifier::new_static("pattern.atproto.systems").unwrap()) 278 - /// .limit(5) 279 - /// .build(), 280 - /// ) 281 - /// .await?; 282 - /// let out = resp.into_output()?; 283 - /// println!("{}", serde_json::to_string_pretty(&out).into_diagnostic()?); 284 - /// Ok(()) 285 - /// } 252 + /// let http = reqwest::Client::new(); 253 + /// let base = url::Url::parse("https://public.api.bsky.app")?; 254 + /// let call = http 255 + /// .xrpc(base) 256 + /// .auth(AuthorizationToken::Bearer(CowStr::from("ACCESS_JWT"))) 257 + /// .accept_labelers(vec![CowStr::from("did:plc:labelerid")]) 258 + /// .header(http::header::USER_AGENT, http::HeaderValue::from_static("jacquard-example")); 259 + /// // let resp = call.send(&request).await?; 260 + /// # Ok(()) 261 + /// # } 286 262 /// ``` 287 263 pub struct XrpcCall<'a, C: HttpClient> { 288 264 pub(crate) client: &'a C, ··· 684 660 } 685 661 Err(e) => Err(XrpcError::Decode(e)), 686 662 } 663 + } 664 + } 665 + 666 + /// Reinterpret this response as a different response type. 667 + /// 668 + /// This transmutes the response by keeping the same buffer and status code, 669 + /// but changing the type-level marker. Useful for converting generic XRPC responses 670 + /// into collection-specific typed responses. 671 + /// 672 + /// # Safety 673 + /// 674 + /// This is safe in the sense that no memory unsafety occurs, but logical correctness 675 + /// depends on ensuring the buffer actually contains data that can deserialize to `NEW`. 676 + /// Incorrect conversion will cause deserialization errors at runtime. 677 + pub fn transmute<NEW: XrpcResp>(self) -> Response<NEW> { 678 + Response { 679 + buffer: self.buffer, 680 + status: self.status, 681 + _marker: PhantomData, 687 682 } 688 683 } 689 684 }
+77 -25
crates/jacquard-derive/src/lib.rs
··· 1 + //! # Derive macros for jacquard lexicon types 2 + //! 3 + //! This crate provides attribute macros that the code generator uses to add lexicon-specific 4 + //! behavior to generated types. You'll rarely need to use these directly unless you're writing 5 + //! custom lexicon types by hand. However, deriving IntoStatic will likely be very useful. 6 + //! 7 + //! ## Macros 8 + //! 9 + //! ### `#[lexicon]` 10 + //! 11 + //! Adds an `extra_data` field to structs to capture unknown fields during deserialization. 12 + //! This makes objects "open" - they'll accept and preserve fields not defined in the schema. 13 + //! 14 + //! ```ignore 15 + //! #[lexicon] 16 + //! struct Post<'s> { 17 + //! text: &'s str, 18 + //! } 19 + //! // Expands to add: 20 + //! // #[serde(flatten)] 21 + //! // pub extra_data: BTreeMap<SmolStr, Data<'s>> 22 + //! ``` 23 + //! 24 + //! ### `#[open_union]` 25 + //! 26 + //! Adds an `Unknown(Data)` variant to enums to make them extensible unions. This lets 27 + //! enums accept variants not defined in your code, storing them as loosely typed atproto `Data`. 28 + //! 29 + //! ```ignore 30 + //! #[open_union] 31 + //! enum RecordEmbed<'s> { 32 + //! #[serde(rename = "app.bsky.embed.images")] 33 + //! Images(Images), 34 + //! } 35 + //! // Expands to add: 36 + //! // #[serde(untagged)] 37 + //! // Unknown(Data<'s>) 38 + //! ``` 39 + //! 40 + //! ### `#[derive(IntoStatic)]` 41 + //! 42 + //! Derives conversion from borrowed (`'a`) to owned (`'static`) types by recursively calling 43 + //! `.into_static()` on all fields. Works with structs and enums. 44 + //! 45 + //! ```ignore 46 + //! #[derive(IntoStatic)] 47 + //! struct Post<'a> { 48 + //! text: CowStr<'a>, 49 + //! } 50 + //! // Generates: 51 + //! // impl IntoStatic for Post<'_> { 52 + //! // type Output = Post<'static>; 53 + //! // fn into_static(self) -> Self::Output { ... } 54 + //! // } 55 + //! ``` 56 + 1 57 use proc_macro::TokenStream; 2 58 use quote::quote; 3 59 use syn::{Data, DeriveInput, Fields, GenericParam, parse_macro_input}; ··· 160 216 let (impl_generics, ty_generics, where_clause) = generics.split_for_impl(); 161 217 162 218 // Build the Output type with all lifetimes replaced by 'static 163 - let output_generics = generics.params.iter().map(|param| { 164 - match param { 165 - GenericParam::Lifetime(_) => quote! { 'static }, 166 - GenericParam::Type(ty) => { 167 - let ident = &ty.ident; 168 - quote! { #ident } 169 - } 170 - GenericParam::Const(c) => { 171 - let ident = &c.ident; 172 - quote! { #ident } 173 - } 219 + let output_generics = generics.params.iter().map(|param| match param { 220 + GenericParam::Lifetime(_) => quote! { 'static }, 221 + GenericParam::Type(ty) => { 222 + let ident = &ty.ident; 223 + quote! { #ident } 224 + } 225 + GenericParam::Const(c) => { 226 + let ident = &c.ident; 227 + quote! { #ident } 174 228 } 175 229 }); 176 230 ··· 182 236 183 237 // Generate the conversion body based on struct/enum 184 238 let conversion = match &input.data { 185 - Data::Struct(data_struct) => { 186 - generate_struct_conversion(name, &data_struct.fields) 187 - } 188 - Data::Enum(data_enum) => { 189 - generate_enum_conversion(name, data_enum) 190 - } 239 + Data::Struct(data_struct) => generate_struct_conversion(name, &data_struct.fields), 240 + Data::Enum(data_enum) => generate_enum_conversion(name, data_enum), 191 241 Data::Union(_) => { 192 - return syn::Error::new_spanned( 193 - input, 194 - "IntoStatic cannot be derived for unions" 195 - ) 196 - .to_compile_error() 197 - .into(); 242 + return syn::Error::new_spanned(input, "IntoStatic cannot be derived for unions") 243 + .to_compile_error() 244 + .into(); 198 245 } 199 246 }; 200 247 ··· 239 286 } 240 287 } 241 288 242 - fn generate_enum_conversion(name: &syn::Ident, data_enum: &syn::DataEnum) -> proc_macro2::TokenStream { 289 + fn generate_enum_conversion( 290 + name: &syn::Ident, 291 + data_enum: &syn::DataEnum, 292 + ) -> proc_macro2::TokenStream { 243 293 let variants = data_enum.variants.iter().map(|variant| { 244 294 let variant_name = &variant.ident; 245 295 match &variant.fields { ··· 258 308 } 259 309 Fields::Unnamed(fields) => { 260 310 let field_bindings: Vec<_> = (0..fields.unnamed.len()) 261 - .map(|i| syn::Ident::new(&format!("field_{}", i), proc_macro2::Span::call_site())) 311 + .map(|i| { 312 + syn::Ident::new(&format!("field_{}", i), proc_macro2::Span::call_site()) 313 + }) 262 314 .collect(); 263 315 let field_conversions = field_bindings.iter().map(|binding| { 264 316 quote! { #binding.into_static() }
+64 -11
crates/jacquard-identity/src/lib.rs
··· 1 - //! Identity resolution utilities: DID and handle resolution, DID document fetch, 2 - //! and helpers for PDS endpoint discovery. See `identity::resolver` for details. 3 - //! Identity resolution: handle → DID and DID → document, with smart fallbacks. 1 + //! Identity resolution for the AT Protocol 2 + //! 3 + //! Jacquard's handle-to-DID and DID-to-document resolution with configurable 4 + //! fallback chains. 5 + //! 6 + //! ## Quick start 7 + //! 8 + //! ```no_run 9 + //! # async fn example() -> Result<(), Box<dyn std::error::Error>> { 10 + //! use jacquard_identity::{PublicResolver, resolver::IdentityResolver}; 11 + //! use jacquard_common::types::string::Handle; 12 + //! 13 + //! let resolver = PublicResolver::default(); 14 + //! 15 + //! // Resolve handle to DID 16 + //! let did = resolver.resolve_handle(&Handle::new("alice.bsky.social")?).await?; 17 + //! 18 + //! // Fetch DID document 19 + //! let doc_response = resolver.resolve_did_doc(&did).await?; 20 + //! let doc = doc_response.parse()?; // Borrow from response buffer 21 + //! # Ok(()) 22 + //! # } 23 + //! ``` 4 24 //! 5 - //! Fallback order (default): 6 - //! - Handle → DID: DNS TXT (if `dns` feature) → HTTPS well-known → PDS XRPC 7 - //! `resolveHandle` (when `pds_fallback` is configured) → public API fallback → Slingshot `resolveHandle` (if configured). 8 - //! - DID → Doc: did:web well-known → PLC/Slingshot HTTP → PDS XRPC `resolveDid` (when configured), 9 - //! then Slingshot mini‑doc (partial) if configured. 25 + //! ## Resolution fallback order 10 26 //! 11 - //! Parsing returns a `DidDocResponse` so callers can borrow from the response buffer 12 - //! and optionally validate the document `id` against the requested DID. 27 + //! **Handle → DID** (configurable via [`resolver::HandleStep`]): 28 + //! 1. DNS TXT record at `_atproto.{handle}` (if `dns` feature enabled) 29 + //! 2. HTTPS well-known at `https://{handle}/.well-known/atproto-did` 30 + //! 3. PDS XRPC `com.atproto.identity.resolveHandle` (if PDS configured) 31 + //! 4. Public API fallback (`https://public.api.bsky.app`) 32 + //! 5. Slingshot `resolveHandle` (if configured) 33 + //! 34 + //! **DID → Document** (configurable via [`resolver::DidStep`]): 35 + //! 1. `did:web` HTTPS well-known 36 + //! 2. PLC directory HTTP (for `did:plc`) 37 + //! 3. PDS XRPC `com.atproto.identity.resolveDid` (if PDS configured) 38 + //! 4. Slingshot mini-doc (partial document) 39 + //! 40 + //! ## Customization 41 + //! 42 + //! ``` 43 + //! use jacquard_identity::JacquardResolver; 44 + //! use jacquard_identity::resolver::{ResolverOptions, PlcSource}; 45 + //! 46 + //! let opts = ResolverOptions { 47 + //! plc_source: PlcSource::slingshot_default(), 48 + //! public_fallback_for_handle: true, 49 + //! validate_doc_id: true, 50 + //! ..Default::default() 51 + //! }; 52 + //! 53 + //! let resolver = JacquardResolver::new(reqwest::Client::new(), opts); 54 + //! #[cfg(feature = "dns")] 55 + //! let resolver = resolver.with_system_dns(); // Enable DNS TXT resolution 56 + //! ``` 57 + //! 58 + //! ## Response types 59 + //! 60 + //! Resolution methods return wrapper types that own the response buffer, allowing 61 + //! zero-copy parsing: 62 + //! 63 + //! - [`resolver::DidDocResponse`] - Full DID document response 64 + //! - [`MiniDocResponse`] - Slingshot mini-doc response (partial) 65 + //! 66 + //! Both support `.parse()` for borrowing and validation. 13 67 14 68 // use crate::CowStr; // not currently needed directly here 15 69 pub mod resolver; ··· 387 441 } 388 442 PlcSource::Slingshot { base } => base.join(did.as_str())?, 389 443 }; 390 - println!("Fetching DID document from {}", url); 391 444 if let Ok((buf, status)) = self.get_json_bytes(url).await { 392 445 return Ok(DidDocResponse { 393 446 buffer: buf,
+100 -19
crates/jacquard-lexicon/src/codegen/structs.rs
··· 6 6 use proc_macro2::TokenStream; 7 7 use quote::quote; 8 8 9 - use super::utils::{make_ident, value_to_variant_name}; 10 9 use super::CodeGenerator; 10 + use super::utils::{make_ident, value_to_variant_name}; 11 11 12 12 /// Enum variant kind for IntoStatic generation 13 13 #[derive(Debug, Clone)] ··· 52 52 match field_type { 53 53 LexObjectProperty::Union(union) => { 54 54 // Skip empty, single-variant unions unless they're self-referential 55 - if !union.refs.is_empty() && (union.refs.len() > 1 || self.is_self_referential_union(nsid, &type_name, union)) { 56 - let union_name = self.generate_field_type_name(nsid, &type_name, field_name, ""); 55 + if !union.refs.is_empty() 56 + && (union.refs.len() > 1 57 + || self.is_self_referential_union(nsid, &type_name, union)) 58 + { 59 + let union_name = 60 + self.generate_field_type_name(nsid, &type_name, field_name, ""); 57 61 let refs: Vec<_> = union.refs.iter().cloned().collect(); 58 - let union_def = 59 - self.generate_union(nsid, &union_name, &refs, None, union.closed)?; 62 + let union_def = self.generate_union( 63 + nsid, 64 + &union_name, 65 + &refs, 66 + None, 67 + union.closed, 68 + )?; 60 69 unions.push(union_def); 61 70 } 62 71 } 63 72 LexObjectProperty::Object(nested_obj) => { 64 - let object_name = self.generate_field_type_name(nsid, &type_name, field_name, ""); 73 + let object_name = 74 + self.generate_field_type_name(nsid, &type_name, field_name, ""); 65 75 let obj_def = self.generate_object(nsid, &object_name, nested_obj)?; 66 76 unions.push(obj_def); 67 77 } ··· 69 79 if let LexArrayItem::Union(union) = &array.items { 70 80 // Skip single-variant array unions 71 81 if union.refs.len() > 1 { 72 - let union_name = self.generate_field_type_name(nsid, &type_name, field_name, "Item"); 82 + let union_name = self.generate_field_type_name( 83 + nsid, &type_name, field_name, "Item", 84 + ); 73 85 let refs: Vec<_> = union.refs.iter().cloned().collect(); 74 - let union_def = self.generate_union(nsid, &union_name, &refs, None, union.closed)?; 86 + let union_def = self.generate_union( 87 + nsid, 88 + &union_name, 89 + &refs, 90 + None, 91 + union.closed, 92 + )?; 75 93 unions.push(union_def); 76 94 } 77 95 } ··· 80 98 } 81 99 } 82 100 101 + // Generate typed GetRecordOutput wrapper 102 + let output_type_name = format!("{}GetRecordOutput", type_name); 103 + let output_type_ident = 104 + syn::Ident::new(&output_type_name, proc_macro2::Span::call_site()); 105 + 106 + let output_wrapper = quote! { 107 + /// Typed wrapper for GetRecord response with this collection's record type. 108 + #[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq, jacquard_derive::IntoStatic)] 109 + #[serde(rename_all = "camelCase")] 110 + pub struct #output_type_ident<'a> { 111 + #[serde(skip_serializing_if = "std::option::Option::is_none")] 112 + #[serde(borrow)] 113 + pub cid: std::option::Option<jacquard_common::types::string::Cid<'a>>, 114 + #[serde(borrow)] 115 + pub uri: jacquard_common::types::string::AtUri<'a>, 116 + #[serde(borrow)] 117 + pub value: #ident<'a>, 118 + } 119 + }; 120 + 121 + // Generate marker struct for XrpcResp 122 + let record_marker_name = format!("{}Record", type_name); 123 + let record_marker_ident = 124 + syn::Ident::new(&record_marker_name, proc_macro2::Span::call_site()); 125 + 126 + let record_marker = quote! { 127 + /// Marker type for deserializing records from this collection. 128 + pub struct #record_marker_ident; 129 + 130 + impl jacquard_common::xrpc::XrpcResp for #record_marker_ident { 131 + const NSID: &'static str = #nsid; 132 + const ENCODING: &'static str = "application/json"; 133 + type Output<'de> = #output_type_ident<'de>; 134 + type Err<'de> = jacquard_common::types::collection::RecordError<'de>; 135 + } 136 + 137 + 138 + }; 139 + let from_impl = quote! { 140 + impl From<#output_type_ident<'_>> for #ident<'static> { 141 + fn from(output: #output_type_ident<'_>) -> Self { 142 + use jacquard_common::IntoStatic; 143 + output.value.into_static() 144 + } 145 + } 146 + }; 147 + 83 148 // Generate Collection trait impl 84 149 let collection_impl = quote! { 85 150 impl jacquard_common::types::collection::Collection for #ident<'_> { 86 151 const NSID: &'static str = #nsid; 152 + type Record = #record_marker_ident; 87 153 } 88 154 }; 89 155 90 156 Ok(quote! { 91 157 #struct_def 92 158 #(#unions)* 159 + #output_wrapper 160 + #record_marker 93 161 #collection_impl 162 + #from_impl 94 163 }) 95 164 } 96 165 } ··· 127 196 match field_type { 128 197 LexObjectProperty::Union(union) => { 129 198 // Skip empty, single-variant unions unless they're self-referential 130 - if !union.refs.is_empty() && (union.refs.len() > 1 || self.is_self_referential_union(nsid, &type_name, union)) { 131 - let union_name = self.generate_field_type_name(nsid, &type_name, field_name, ""); 199 + if !union.refs.is_empty() 200 + && (union.refs.len() > 1 201 + || self.is_self_referential_union(nsid, &type_name, union)) 202 + { 203 + let union_name = 204 + self.generate_field_type_name(nsid, &type_name, field_name, ""); 132 205 let refs: Vec<_> = union.refs.iter().cloned().collect(); 133 206 let union_def = 134 207 self.generate_union(nsid, &union_name, &refs, None, union.closed)?; ··· 136 209 } 137 210 } 138 211 LexObjectProperty::Object(nested_obj) => { 139 - let object_name = self.generate_field_type_name(nsid, &type_name, field_name, ""); 212 + let object_name = 213 + self.generate_field_type_name(nsid, &type_name, field_name, ""); 140 214 let obj_def = self.generate_object(nsid, &object_name, nested_obj)?; 141 215 unions.push(obj_def); 142 216 } ··· 144 218 if let LexArrayItem::Union(union) = &array.items { 145 219 // Skip single-variant array unions 146 220 if union.refs.len() > 1 { 147 - let union_name = self.generate_field_type_name(nsid, &type_name, field_name, "Item"); 221 + let union_name = 222 + self.generate_field_type_name(nsid, &type_name, field_name, "Item"); 148 223 let refs: Vec<_> = union.refs.iter().cloned().collect(); 149 - let union_def = self.generate_union(nsid, &union_name, &refs, None, union.closed)?; 224 + let union_def = 225 + self.generate_union(nsid, &union_name, &refs, None, union.closed)?; 150 226 unions.push(union_def); 151 227 } 152 228 } ··· 296 372 }; 297 373 298 374 // Parse ref to get NSID and def name 299 - let (ref_nsid_str, ref_def) = if let Some((nsid, fragment)) = normalized_ref.split_once('#') { 300 - (nsid, fragment) 301 - } else { 302 - (normalized_ref.as_str(), "main") 303 - }; 375 + let (ref_nsid_str, ref_def) = 376 + if let Some((nsid, fragment)) = normalized_ref.split_once('#') { 377 + (nsid, fragment) 378 + } else { 379 + (normalized_ref.as_str(), "main") 380 + }; 304 381 305 382 // Skip unknown refs - they'll be handled by Unknown variant 306 383 if !self.corpus.ref_exists(&normalized_ref) { ··· 329 406 // For other fragments, include the last NSID segment to avoid collisions 330 407 // e.g. app.bsky.embed.images#view -> ImagesView 331 408 // app.bsky.embed.video#view -> VideoView 332 - format!("{}{}", last_segment.to_pascal_case(), ref_def.to_pascal_case()) 409 + format!( 410 + "{}{}", 411 + last_segment.to_pascal_case(), 412 + ref_def.to_pascal_case() 413 + ) 333 414 }; 334 415 335 416 variant_infos.push(VariantInfo {
+38
crates/jacquard-lexicon/src/lib.rs
··· 1 + //! # Lexicon schema parsing and Rust code generation for the Jacquard atproto ecosystem 2 + //! 3 + //! This crate also provides lexicon fetching capabilitiees ofr 4 + //! 5 + //! ## Usage 6 + //! 7 + //! ### Fetch lexicons 8 + //! 9 + //! The `lex-fetch` binary downloads lexicons from configured sources and 10 + //! runs the code generation pipeline on them: 11 + //! 12 + //! ```bash 13 + //! cargo run -p jacquard-lexicon --bin lex-fetch 14 + //! ``` 15 + //! 16 + //! Configuration lives in `lexicons.kdl` at the workspace root. 17 + //! 18 + //! ### Generate Rust code 19 + //! 20 + //! The `jacquard-codegen` binary can be pointed at a local directory to 21 + //! runs the code generation pipeline: 22 + //! 23 + //! ```bash 24 + //! cargo run -p jacquard-lexicon --bin jacquard-codegen -- \ 25 + //! -i ./lexicons \ 26 + //! -o ./crates/jacquard-api/src 27 + //! ``` 28 + //! 29 + //! 30 + //! ## Modules 31 + //! 32 + //! - [`codegen`] - Rust code generation from parsed schemas 33 + //! - [`corpus`] - Lexicon corpus management and namespace organization 34 + //! - [`lexicon`] - Schema parsing and validation 35 + //! - [`union_registry`] - Tracks union types for collision detection 36 + //! - [`fetch`] - Ingests lexicons from git, atproto, http fetch, and other sources 37 + //! - [`fs`] - Filesystem utilities for lexicon storage 38 + 1 39 pub mod codegen; 2 40 pub mod corpus; 3 41 pub mod error;
+79 -2
crates/jacquard-oauth/src/client.rs
··· 13 13 AuthorizationToken, CowStr, IntoStatic, 14 14 error::{AuthError, ClientError, TransportError, XrpcResult}, 15 15 http_client::HttpClient, 16 - types::did::Did, 16 + types::{did::Did, string::Handle}, 17 17 xrpc::{ 18 18 CallOptions, Response, XrpcClient, XrpcExt, XrpcRequest, XrpcResp, build_http_request, 19 19 process_response, 20 20 }, 21 21 }; 22 - use jacquard_identity::JacquardResolver; 22 + use jacquard_identity::{JacquardResolver, resolver::IdentityResolver}; 23 23 use jose_jwk::JwkSet; 24 24 use std::sync::Arc; 25 25 use tokio::sync::RwLock; ··· 38 38 pub fn new(store: S, client_data: ClientData<'static>) -> Self { 39 39 let client = JacquardResolver::default(); 40 40 Self::new_from_resolver(store, client, client_data) 41 + } 42 + 43 + /// Create an OAuth client with the provided store and default localhost client metadata. 44 + /// 45 + /// This is a convenience constructor for quickly setting up an OAuth client 46 + /// with default localhost redirect URIs and "atproto transition:generic" scopes. 47 + /// 48 + /// # Example 49 + /// 50 + /// ```no_run 51 + /// # use jacquard_oauth::client::OAuthClient; 52 + /// # use jacquard_oauth::authstore::MemoryAuthStore; 53 + /// # #[tokio::main] 54 + /// # async fn main() -> Result<(), Box<dyn std::error::Error>> { 55 + /// let store = MemoryAuthStore::new(); 56 + /// let oauth = OAuthClient::with_default_config(store); 57 + /// # Ok(()) 58 + /// # } 59 + /// ``` 60 + pub fn with_default_config(store: S) -> Self { 61 + let client_data = ClientData { 62 + keyset: None, 63 + config: crate::atproto::AtprotoClientMetadata::default_localhost(), 64 + }; 65 + Self::new(store, client_data) 66 + } 67 + } 68 + 69 + impl OAuthClient<JacquardResolver, crate::authstore::MemoryAuthStore> { 70 + /// Create an OAuth client with an in-memory auth store and default localhost client metadata. 71 + /// 72 + /// This is a convenience constructor for simple testing and development. 73 + /// The session will not persist across restarts. 74 + /// 75 + /// # Example 76 + /// 77 + /// ```no_run 78 + /// # use jacquard_oauth::client::OAuthClient; 79 + /// # #[tokio::main] 80 + /// # async fn main() -> Result<(), Box<dyn std::error::Error>> { 81 + /// let oauth = OAuthClient::with_memory_store(); 82 + /// # Ok(()) 83 + /// # } 84 + /// ``` 85 + pub fn with_memory_store() -> Self { 86 + Self::with_default_config(crate::authstore::MemoryAuthStore::new()) 41 87 } 42 88 } 43 89 ··· 430 476 _ => false, 431 477 } 432 478 } 479 + 480 + impl<T, S> IdentityResolver for OAuthSession<T, S> 481 + where 482 + S: ClientAuthStore + Send + Sync + 'static, 483 + T: OAuthResolver + IdentityResolver + XrpcExt + Send + Sync + 'static, 484 + { 485 + fn options(&self) -> &jacquard_identity::resolver::ResolverOptions { 486 + self.client.options() 487 + } 488 + 489 + fn resolve_handle( 490 + &self, 491 + handle: &Handle<'_>, 492 + ) -> impl Future< 493 + Output = std::result::Result<Did<'static>, jacquard_identity::resolver::IdentityError>, 494 + > { 495 + async { self.client.resolve_handle(handle).await } 496 + } 497 + 498 + fn resolve_did_doc( 499 + &self, 500 + did: &Did<'_>, 501 + ) -> impl Future< 502 + Output = std::result::Result< 503 + jacquard_identity::resolver::DidDocResponse, 504 + jacquard_identity::resolver::IdentityError, 505 + >, 506 + > { 507 + async { self.client.resolve_did_doc(did).await } 508 + } 509 + }
+47 -2
crates/jacquard-oauth/src/lib.rs
··· 1 - //! Core OAuth 2.1 (AT Protocol profile) types and helpers for Jacquard. 2 - //! Transport, discovery, and orchestration live in `jacquard`. 1 + //! # Jacquard OAuth 2.1 implementation for the AT Protocol 2 + //! 3 + //! Implements the AT Protocol OAuth profile, including DPoP (Demonstrating 4 + //! Proof-of-Possession), PKCE, PAR (Pushed Authorization Requests), and token management. 5 + //! 6 + //! 7 + //! ## Authentication flow 8 + //! 9 + //! ```no_run 10 + //! # #[cfg(feature = "loopback")] 11 + //! # async fn example() -> Result<(), Box<dyn std::error::Error>> { 12 + //! use jacquard_oauth::client::OAuthClient; 13 + //! use jacquard_oauth::session::ClientData; 14 + //! use jacquard_oauth::atproto::AtprotoClientMetadata; 15 + //! use jacquard_oauth::loopback::LoopbackConfig; 16 + //! use jacquard_oauth::authstore::MemoryAuthStore; 17 + //! 18 + //! let store = MemoryAuthStore::new(); 19 + //! 20 + //! // Create client with metadata 21 + //! let client_data = ClientData { 22 + //! keyset: None, // Will generate ES256 keypair if needed 23 + //! config: AtprotoClientMetadata::default_localhost(), 24 + //! }; 25 + //! let oauth = OAuthClient::new(store, client_data); 26 + //! 27 + //! // Start auth flow (with loopback feature) 28 + //! let session = oauth.login_with_local_server( 29 + //! "alice.bsky.social", 30 + //! Default::default(), 31 + //! LoopbackConfig::default(), 32 + //! ).await?; 33 + //! 34 + //! // Session handles token refresh automatically 35 + //! # Ok(()) 36 + //! # } 37 + //! ``` 38 + //! 39 + //! ## AT Protocol specifics 40 + //! 41 + //! The AT Protocol OAuth profile adds: 42 + //! - Required DPoP for all token requests 43 + //! - PAR (Pushed Authorization Requests) for better security 44 + //! - Specific scope format (`atproto`, `transition:generic`, etc.) 45 + //! - Server metadata discovery at `/.well-known/oauth-authorization-server` 46 + //! 47 + //! See [`atproto`] module for AT Protocol-specific metadata helpers. 3 48 4 49 pub mod atproto; 5 50 pub mod authstore;
+47 -4
crates/jacquard/Cargo.toml
··· 12 12 license.workspace = true 13 13 14 14 [features] 15 - default = ["api_full", "dns", "fancy", "loopback"] 15 + default = ["api_full", "dns", "loopback"] 16 16 derive = ["dep:jacquard-derive"] 17 17 api = ["jacquard-api/com_atproto", "jacquard-api/com_bad_example" ] 18 18 api_bluesky = ["api", "jacquard-api/bluesky" ] ··· 27 27 name = "jacquard" 28 28 path = "src/lib.rs" 29 29 30 - [[bin]] 31 - name = "jacquard" 32 - path = "src/main.rs" 30 + [[example]] 31 + name = "oauth_timeline" 32 + path = "../../examples/oauth_timeline.rs" 33 + required-features = ["fancy", "loopback", "api_bluesky"] 34 + 35 + [[example]] 36 + name = "create_post" 37 + path = "../../examples/create_post.rs" 38 + required-features = ["fancy", "loopback", "api_bluesky"] 39 + 40 + [[example]] 41 + name = "post_with_image" 42 + path = "../../examples/post_with_image.rs" 43 + required-features = ["fancy", "loopback", "api_bluesky"] 44 + 45 + [[example]] 46 + name = "update_profile" 47 + path = "../../examples/update_profile.rs" 48 + required-features = ["fancy", "loopback", "api_bluesky"] 49 + 50 + [[example]] 51 + name = "public_atproto_feed" 52 + path = "../../examples/public_atproto_feed.rs" 53 + 54 + [[example]] 55 + name = "create_whitewind_post" 56 + path = "../../examples/create_whitewind_post.rs" 57 + required-features = ["fancy", "loopback", "api_full"] 58 + 59 + [[example]] 60 + name = "read_whitewind_posts" 61 + path = "../../examples/read_whitewind_posts.rs" 62 + required-features = ["fancy", "api_full"] 63 + 64 + [[example]] 65 + name = "read_tangled_repo" 66 + path = "../../examples/read_tangled_repo.rs" 67 + required-features = ["api_full"] 33 68 69 + [[example]] 70 + name = "resolve_did" 71 + path = "../../examples/resolve_did.rs" 72 + 73 + [[example]] 74 + name = "update_preferences" 75 + path = "../../examples/update_preferences.rs" 76 + required-features = ["fancy", "loopback", "api_full"] 34 77 35 78 [dependencies] 36 79 jacquard-api = { version = "0.4", path = "../jacquard-api" }
+610 -6
crates/jacquard/src/client.rs
··· 1 1 //! XRPC client implementation for AT Protocol 2 2 //! 3 - //! This module provides HTTP and XRPC client traits along with an authenticated 4 - //! client implementation that manages session tokens. 3 + //! This module provides HTTP and XRPC client traits along with session management 4 + //! for both app-password and OAuth authentication. 5 + //! 6 + //! ## Key types 7 + //! 8 + //! - [`Agent<A>`] - Unified session wrapper with convenience methods 9 + //! - [`CredentialSession`] - App-password authentication with auto-refresh 10 + //! - [`crate::oauth::client::OAuthSession`] - OAuth/DPoP authentication 11 + //! - [`AgentSession`] - Common trait for both session types 12 + //! 13 + //! ## Modules 14 + //! 15 + //! - [`credential_session`] - App-password session implementation 16 + //! - [`token`] - Token storage and persistence 17 + //! - [`vec_update`] - Trait for fetch-modify-put patterns on array endpoints 5 18 6 - /// Stateful session client for app‑password auth with auto‑refresh. 19 + /// App-password session implementation with auto-refresh 7 20 pub mod credential_session; 8 - /// Token storage and on‑disk formats shared across app‑password and OAuth. 21 + /// Token storage and on-disk persistence formats 9 22 pub mod token; 23 + /// Trait for fetch-modify-put patterns on array-based endpoints 24 + pub mod vec_update; 10 25 11 26 use core::future::Future; 12 27 28 + use jacquard_api::com_atproto::repo::create_record::CreateRecordOutput; 29 + use jacquard_api::com_atproto::repo::delete_record::DeleteRecordOutput; 30 + use jacquard_api::com_atproto::repo::put_record::PutRecordOutput; 13 31 use jacquard_api::com_atproto::server::create_session::CreateSessionOutput; 14 32 use jacquard_api::com_atproto::server::refresh_session::RefreshSessionOutput; 15 - use jacquard_common::AuthorizationToken; 16 33 use jacquard_common::error::TransportError; 17 34 pub use jacquard_common::error::{ClientError, XrpcResult}; 18 35 use jacquard_common::http_client::HttpClient; 19 36 pub use jacquard_common::session::{MemorySessionStore, SessionStore, SessionStoreError}; 20 - use jacquard_common::xrpc::{CallOptions, Response, XrpcClient, XrpcExt, XrpcRequest}; 37 + use jacquard_common::types::blob::{BlobRef, MimeType}; 38 + use jacquard_common::types::collection::Collection; 39 + use jacquard_common::types::recordkey::{RecordKey, Rkey}; 40 + use jacquard_common::types::string::AtUri; 41 + use jacquard_common::xrpc::{ 42 + CallOptions, Response, XrpcClient, XrpcError, XrpcExt, XrpcRequest, XrpcResp, 43 + }; 44 + use jacquard_common::{AuthorizationToken, xrpc}; 21 45 use jacquard_common::{ 22 46 CowStr, IntoStatic, 23 47 types::string::{Did, Handle}, ··· 28 52 use jacquard_oauth::dpop::DpopExt; 29 53 use jacquard_oauth::resolver::OAuthResolver; 30 54 55 + use serde::Serialize; 31 56 pub use token::FileAuthStore; 32 57 33 58 use crate::client::credential_session::{CredentialSession, SessionKey}; 59 + 60 + use jacquard_common::error::{AuthError, DecodeError}; 61 + use jacquard_common::types::nsid::Nsid; 62 + use jacquard_common::xrpc::GenericXrpcError; 63 + 64 + /// Error type for Agent convenience methods 65 + #[derive(Debug, thiserror::Error, miette::Diagnostic)] 66 + pub enum AgentError { 67 + /// Transport/network layer failure 68 + #[error(transparent)] 69 + #[diagnostic(transparent)] 70 + Client(#[from] ClientError), 71 + 72 + /// No session available for operations requiring authentication 73 + #[error("No session available - cannot determine repo")] 74 + NoSession, 75 + 76 + /// Authentication error from XRPC layer 77 + #[error("Authentication error: {0}")] 78 + #[diagnostic(transparent)] 79 + Auth( 80 + #[from] 81 + #[diagnostic_source] 82 + AuthError, 83 + ), 84 + 85 + /// Generic XRPC error (InvalidRequest, etc.) 86 + #[error("XRPC error: {0}")] 87 + Generic(GenericXrpcError), 88 + 89 + /// Response deserialization failed 90 + #[error("Failed to decode response: {0}")] 91 + #[diagnostic(transparent)] 92 + Decode( 93 + #[from] 94 + #[diagnostic_source] 95 + DecodeError, 96 + ), 97 + 98 + /// Record operation failed with typed error from endpoint 99 + /// Context: which repo/collection/rkey we were operating on 100 + #[error("Record operation failed on {collection}/{rkey:?} in repo {repo}: {error}")] 101 + RecordOperation { 102 + /// The repository DID 103 + repo: Did<'static>, 104 + /// The collection NSID 105 + collection: Nsid<'static>, 106 + /// The record key 107 + rkey: RecordKey<Rkey<'static>>, 108 + /// The underlying error 109 + error: Box<dyn std::error::Error + Send + Sync>, 110 + }, 111 + 112 + /// Multi-step operation failed at sub-step (e.g., get failed in update_record) 113 + #[error("Operation failed at step '{step}': {error}")] 114 + SubOperation { 115 + /// Description of which step failed 116 + step: &'static str, 117 + /// The underlying error 118 + error: Box<dyn std::error::Error + Send + Sync>, 119 + }, 120 + } 121 + 122 + impl IntoStatic for AgentError { 123 + type Output = AgentError; 124 + 125 + fn into_static(self) -> Self::Output { 126 + match self { 127 + AgentError::RecordOperation { 128 + repo, 129 + collection, 130 + rkey, 131 + error, 132 + } => AgentError::RecordOperation { 133 + repo: repo.into_static(), 134 + collection: collection.into_static(), 135 + rkey: rkey.into_static(), 136 + error, 137 + }, 138 + AgentError::SubOperation { step, error } => AgentError::SubOperation { step, error }, 139 + // Error types are already 'static 140 + AgentError::Client(e) => AgentError::Client(e), 141 + AgentError::NoSession => AgentError::NoSession, 142 + AgentError::Auth(e) => AgentError::Auth(e), 143 + AgentError::Generic(e) => AgentError::Generic(e), 144 + AgentError::Decode(e) => AgentError::Decode(e), 145 + } 146 + } 147 + } 34 148 35 149 /// App password session information from `com.atproto.server.createSession` 36 150 /// ··· 204 318 pub async fn refresh(&self) -> Result<AuthorizationToken<'static>, ClientError> { 205 319 self.inner.refresh().await 206 320 } 321 + 322 + // Convenience methods for repository operations 323 + 324 + /// Create a new record in the repository. 325 + /// 326 + /// The collection is inferred from the record type's `Collection::NSID`. 327 + /// The repo is automatically filled from the session info. 328 + /// 329 + /// # Example 330 + /// 331 + /// ```no_run 332 + /// # use jacquard::client::BasicClient; 333 + /// # use jacquard_api::app_bsky::feed::post::Post; 334 + /// # use jacquard_common::types::string::Datetime; 335 + /// # use jacquard_common::CowStr; 336 + /// # #[tokio::main] 337 + /// # async fn main() -> Result<(), Box<dyn std::error::Error>> { 338 + /// # let agent: BasicClient = todo!(); 339 + /// let post = Post { 340 + /// text: CowStr::from("Hello world!"), 341 + /// created_at: Datetime::now(), 342 + /// embed: None, 343 + /// entities: None, 344 + /// facets: None, 345 + /// labels: None, 346 + /// langs: None, 347 + /// reply: None, 348 + /// tags: None, 349 + /// extra_data: Default::default(), 350 + /// }; 351 + /// let output = agent.create_record(post, None).await?; 352 + /// println!("Created record: {}", output.uri); 353 + /// # Ok(()) 354 + /// # } 355 + /// ``` 356 + pub async fn create_record<R>( 357 + &self, 358 + record: R, 359 + rkey: Option<RecordKey<Rkey<'_>>>, 360 + ) -> Result<CreateRecordOutput<'static>, AgentError> 361 + where 362 + R: Collection + serde::Serialize, 363 + { 364 + use jacquard_api::com_atproto::repo::create_record::CreateRecord; 365 + use jacquard_common::types::ident::AtIdentifier; 366 + use jacquard_common::types::value::to_data; 367 + 368 + let (did, _) = self.info().await.ok_or(AgentError::NoSession)?; 369 + 370 + let data = to_data(&record).map_err(|e| AgentError::SubOperation { 371 + step: "serialize record", 372 + error: Box::new(e), 373 + })?; 374 + 375 + let request = CreateRecord::new() 376 + .repo(AtIdentifier::Did(did)) 377 + .collection(R::nsid()) 378 + .record(data) 379 + .maybe_rkey(rkey) 380 + .build(); 381 + 382 + let response = self.send(request).await?; 383 + response.into_output().map_err(|e| match e { 384 + XrpcError::Auth(auth) => AgentError::Auth(auth), 385 + XrpcError::Generic(g) => AgentError::Generic(g), 386 + XrpcError::Decode(e) => AgentError::Decode(DecodeError::Json(e)), 387 + XrpcError::Xrpc(typed) => AgentError::SubOperation { 388 + step: "create record", 389 + error: Box::new(typed), 390 + }, 391 + }) 392 + } 393 + 394 + /// Delete a record from the repository. 395 + /// 396 + /// The collection is inferred from the type parameter. 397 + /// The repo is automatically filled from the session info. 398 + pub async fn delete_record<R, K>( 399 + &self, 400 + rkey: K, 401 + ) -> Result<DeleteRecordOutput<'static>, AgentError> 402 + where 403 + R: Collection, 404 + K: Into<RecordKey<Rkey<'static>>>, 405 + { 406 + use jacquard_api::com_atproto::repo::delete_record::DeleteRecord; 407 + use jacquard_common::types::ident::AtIdentifier; 408 + 409 + let (did, _) = self.info().await.ok_or(AgentError::NoSession)?; 410 + 411 + let request = DeleteRecord::new() 412 + .repo(AtIdentifier::Did(did)) 413 + .collection(R::nsid()) 414 + .rkey(rkey.into()) 415 + .build(); 416 + 417 + let response = self.send(request).await?; 418 + response.into_output().map_err(|e| match e { 419 + XrpcError::Auth(auth) => AgentError::Auth(auth), 420 + XrpcError::Generic(g) => AgentError::Generic(g), 421 + XrpcError::Decode(e) => AgentError::Decode(DecodeError::Json(e)), 422 + XrpcError::Xrpc(typed) => AgentError::SubOperation { 423 + step: "delete record", 424 + error: Box::new(typed), 425 + }, 426 + }) 427 + } 428 + 429 + /// Put (upsert) a record in the repository. 430 + /// 431 + /// The collection is inferred from the record type's `Collection::NSID`. 432 + /// The repo is automatically filled from the session info. 433 + pub async fn put_record<R>( 434 + &self, 435 + rkey: RecordKey<Rkey<'static>>, 436 + record: R, 437 + ) -> Result<PutRecordOutput<'static>, AgentError> 438 + where 439 + R: Collection + serde::Serialize, 440 + { 441 + use jacquard_api::com_atproto::repo::put_record::PutRecord; 442 + use jacquard_common::types::ident::AtIdentifier; 443 + use jacquard_common::types::value::to_data; 444 + 445 + let (did, _) = self.info().await.ok_or(AgentError::NoSession)?; 446 + 447 + let data = to_data(&record).map_err(|e| AgentError::SubOperation { 448 + step: "serialize record", 449 + error: Box::new(e), 450 + })?; 451 + 452 + let request = PutRecord::new() 453 + .repo(AtIdentifier::Did(did)) 454 + .collection(R::nsid()) 455 + .rkey(rkey) 456 + .record(data) 457 + .build(); 458 + 459 + let response = self.send(request).await?; 460 + response.into_output().map_err(|e| match e { 461 + XrpcError::Auth(auth) => AgentError::Auth(auth), 462 + XrpcError::Generic(g) => AgentError::Generic(g), 463 + XrpcError::Decode(e) => AgentError::Decode(DecodeError::Json(e)), 464 + XrpcError::Xrpc(typed) => AgentError::SubOperation { 465 + step: "put record", 466 + error: Box::new(typed), 467 + }, 468 + }) 469 + } 470 + 471 + /// Upload a blob to the repository. 472 + /// 473 + /// The mime type is sent as a Content-Type header hint, though the server also performs 474 + /// its own inference. 475 + /// 476 + /// # Example 477 + /// 478 + /// ```no_run 479 + /// # use jacquard::client::BasicClient; 480 + /// # use jacquard_common::types::blob::MimeType; 481 + /// # #[tokio::main] 482 + /// # async fn main() -> Result<(), Box<dyn std::error::Error>> { 483 + /// # let agent: BasicClient = todo!(); 484 + /// let data = std::fs::read("image.png")?; 485 + /// let mime_type = MimeType::new_static("image/png"); 486 + /// let blob_ref = agent.upload_blob(data, mime_type).await?; 487 + /// # Ok(()) 488 + /// # } 489 + /// ``` 490 + pub async fn upload_blob( 491 + &self, 492 + data: impl Into<bytes::Bytes>, 493 + mime_type: MimeType<'_>, 494 + ) -> Result<BlobRef<'static>, AgentError> { 495 + use http::header::CONTENT_TYPE; 496 + use jacquard_api::com_atproto::repo::upload_blob::UploadBlob; 497 + 498 + let bytes = data.into(); 499 + let request = UploadBlob::new().body(bytes).build(); 500 + 501 + // Override Content-Type header with actual mime type instead of */* 502 + let base = self.base_uri(); 503 + let mut opts = self.opts().await; 504 + opts.extra_headers.push(( 505 + CONTENT_TYPE, 506 + http::HeaderValue::from_str(mime_type.as_str()).map_err(|e| { 507 + AgentError::SubOperation { 508 + step: "set Content-Type header", 509 + error: Box::new(e), 510 + } 511 + })?, 512 + )); 513 + 514 + let response = self.xrpc(base).with_options(opts).send(&request).await?; 515 + 516 + let output = response.into_output().map_err(|e| match e { 517 + XrpcError::Auth(auth) => AgentError::Auth(auth), 518 + XrpcError::Generic(g) => AgentError::Generic(g), 519 + XrpcError::Decode(e) => AgentError::Decode(DecodeError::Json(e)), 520 + XrpcError::Xrpc(typed) => AgentError::SubOperation { 521 + step: "upload blob", 522 + error: Box::new(typed), 523 + }, 524 + })?; 525 + Ok(BlobRef::Blob(output.blob.into_static())) 526 + } 527 + 528 + /// Update a vec-based data structure with a fetch-modify-put pattern. 529 + /// 530 + /// This is useful for endpoints like preferences that return arrays requiring 531 + /// fetch-modify-put operations. 532 + /// 533 + /// # Example 534 + /// 535 + /// ```ignore 536 + /// agent.update_vec::<PreferencesUpdate>(|prefs| { 537 + /// prefs.push(AdultContentPref::new().enabled(true).build().into()); 538 + /// prefs.retain(|p| !matches!(p, Preference::Hidden(_))); 539 + /// }).await?; 540 + /// ``` 541 + pub async fn update_vec<'s, U>( 542 + &'s self, 543 + modify: impl FnOnce(&mut Vec<<U as vec_update::VecUpdate>::Item>), 544 + ) -> Result<xrpc::Response<<U::PutRequest<'s> as XrpcRequest<'s>>::Response>, AgentError> 545 + where 546 + U: vec_update::VecUpdate + 's, 547 + { 548 + // Fetch current data 549 + let get_request = U::build_get(); 550 + let response = self.send(get_request).await?; 551 + let output = response.parse().map_err(|e| match e { 552 + XrpcError::Auth(auth) => AgentError::Auth(auth), 553 + XrpcError::Generic(g) => AgentError::Generic(g), 554 + XrpcError::Decode(e) => AgentError::Decode(DecodeError::Json(e)), 555 + XrpcError::Xrpc(_) => AgentError::SubOperation { 556 + step: "get vec", 557 + error: format!("{:?}", e).into(), 558 + }, 559 + })?; 560 + 561 + // Extract vec (converts to owned via IntoStatic) 562 + let mut items = U::extract_vec(output); 563 + 564 + // Apply modification 565 + modify(&mut items); 566 + 567 + // Build put request 568 + let put_request = U::build_put(items); 569 + 570 + // Send it 571 + Ok(self.send(put_request).await?) 572 + } 573 + 574 + /// Update a single item in a vec-based data structure. 575 + /// 576 + /// This is a convenience wrapper around `update_vec` that finds and replaces 577 + /// a single matching item, or appends it if not found. 578 + /// 579 + /// # Example 580 + /// 581 + /// ```ignore 582 + /// let pref = AdultContentPref::new().enabled(true).build(); 583 + /// agent.update_vec_item::<PreferencesUpdate>(pref.into()).await?; 584 + /// ``` 585 + pub async fn update_vec_item<'s, U>( 586 + &'s self, 587 + item: <U as vec_update::VecUpdate>::Item, 588 + ) -> Result<xrpc::Response<<U::PutRequest<'s> as XrpcRequest<'s>>::Response>, AgentError> 589 + where 590 + U: vec_update::VecUpdate + 's, 591 + { 592 + self.update_vec::<U>(|vec| { 593 + if let Some(pos) = vec.iter().position(|i| U::matches(i, &item)) { 594 + vec[pos] = item; 595 + } else { 596 + vec.push(item); 597 + } 598 + }) 599 + .await 600 + } 601 + } 602 + 603 + impl<A: AgentSession + IdentityResolver> Agent<A> { 604 + /// Get a record from the repository using an at:// URI. 605 + /// 606 + /// Returns a typed `Response` that deserializes directly to the record type. 607 + /// Use `.parse()` to borrow from the response buffer, or `.into_output()` for owned data. 608 + /// 609 + /// # Example 610 + /// 611 + /// ```no_run 612 + /// # use jacquard::client::BasicClient; 613 + /// # use jacquard_api::app_bsky::feed::post::Post; 614 + /// # use jacquard_common::types::string::AtUri; 615 + /// # use jacquard_common::IntoStatic; 616 + /// # #[tokio::main] 617 + /// # async fn main() -> Result<(), Box<dyn std::error::Error>> { 618 + /// # let agent: BasicClient = todo!(); 619 + /// let uri = AtUri::new_static("at://did:plc:xyz/app.bsky.feed.post/3l5bqm7lepk2c").unwrap(); 620 + /// let response = agent.get_record::<Post>(uri).await?; 621 + /// let output = response.parse()?; // PostGetRecordOutput<'_> borrowing from buffer 622 + /// println!("Post text: {}", output.value.text); 623 + /// 624 + /// // Or get owned data 625 + /// let output_owned = response.into_output()?; 626 + /// # Ok(()) 627 + /// # } 628 + /// ``` 629 + pub async fn get_record<R>(&self, uri: AtUri<'_>) -> Result<Response<R::Record>, ClientError> 630 + where 631 + R: Collection, 632 + { 633 + // Validate that URI's collection matches the expected type 634 + if let Some(uri_collection) = uri.collection() { 635 + if uri_collection.as_str() != R::nsid().as_str() { 636 + return Err(ClientError::Transport(TransportError::Other( 637 + format!( 638 + "Collection mismatch: URI contains '{}' but type parameter expects '{}'", 639 + uri_collection, 640 + R::nsid() 641 + ) 642 + .into(), 643 + ))); 644 + } 645 + } 646 + 647 + let rkey = uri.rkey().ok_or_else(|| { 648 + ClientError::Transport(TransportError::Other("AtUri missing rkey".into())) 649 + })?; 650 + 651 + // Resolve authority (DID or handle) to get DID and PDS 652 + use jacquard_common::types::ident::AtIdentifier; 653 + let (repo_did, pds_url) = match uri.authority() { 654 + AtIdentifier::Did(did) => { 655 + let pds = self.pds_for_did(did).await.map_err(|e| { 656 + ClientError::Transport(TransportError::Other( 657 + format!("Failed to resolve PDS for {}: {}", did, e).into(), 658 + )) 659 + })?; 660 + (did.clone(), pds) 661 + } 662 + AtIdentifier::Handle(handle) => self.pds_for_handle(handle).await.map_err(|e| { 663 + ClientError::Transport(TransportError::Other( 664 + format!("Failed to resolve handle {}: {}", handle, e).into(), 665 + )) 666 + })?, 667 + }; 668 + 669 + // Make stateless XRPC call to that PDS (no auth required for public records) 670 + use jacquard_api::com_atproto::repo::get_record::GetRecord; 671 + let request = GetRecord::new() 672 + .repo(AtIdentifier::Did(repo_did)) 673 + .collection(R::nsid()) 674 + .rkey(rkey.clone()) 675 + .build(); 676 + 677 + let response = self.xrpc(pds_url).send(&request).await?; 678 + Ok(response.transmute()) 679 + } 680 + 681 + /// Update a record in-place with a fetch-modify-put pattern. 682 + /// 683 + /// This fetches the record using an at:// URI, converts it to owned data, applies 684 + /// the modification function, and puts it back. The modification function receives 685 + /// a mutable reference to the owned record. 686 + /// 687 + /// # Example 688 + /// 689 + /// ```no_run 690 + /// # use jacquard::client::BasicClient; 691 + /// # use jacquard_api::app_bsky::actor::profile::Profile; 692 + /// # use jacquard_common::CowStr; 693 + /// # use jacquard_common::types::string::AtUri; 694 + /// # #[tokio::main] 695 + /// # async fn main() -> Result<(), Box<dyn std::error::Error>> { 696 + /// # let agent: BasicClient = todo!(); 697 + /// let uri = AtUri::new_static("at://did:plc:xyz/app.bsky.actor.profile/self").unwrap(); 698 + /// // Update profile record in-place 699 + /// agent.update_record::<Profile>(uri, |output| { 700 + /// output.value.display_name = Some(CowStr::from("New Name")); 701 + /// output.value.description = Some(CowStr::from("Updated bio")); 702 + /// }).await?; 703 + /// # Ok(()) 704 + /// # } 705 + /// ``` 706 + pub async fn update_record<R>( 707 + &self, 708 + uri: AtUri<'_>, 709 + f: impl FnOnce(&mut <<<R as Collection>::Record as XrpcResp>::Output<'_> as IntoStatic>::Output), 710 + ) -> Result<PutRecordOutput<'static>, AgentError> 711 + where 712 + R: Collection + Serialize, 713 + R: From<<R as Collection>::Record>, 714 + R: for<'a> From< 715 + <<<R as Collection>::Record as XrpcResp>::Output<'a> as IntoStatic>::Output, 716 + >, 717 + { 718 + // Fetch the record - Response<R::Record> where R::Record::Output<'de> = R<'de> 719 + let response = self.get_record::<R>(uri.clone()).await?; 720 + 721 + // Parse to get R<'_> borrowing from response buffer 722 + let record = response.parse().map_err(|e| match e { 723 + XrpcError::Auth(auth) => AgentError::Auth(auth), 724 + XrpcError::Generic(g) => AgentError::Generic(g), 725 + XrpcError::Decode(e) => AgentError::Decode(DecodeError::Json(e)), 726 + XrpcError::Xrpc(typed) => AgentError::SubOperation { 727 + step: "get record", 728 + error: format!("{:?}", typed).into(), 729 + }, 730 + })?; 731 + 732 + // Convert to owned 733 + let mut owned = record.into_static(); 734 + 735 + // Apply modification 736 + f(&mut owned); 737 + 738 + // Put it back 739 + let rkey = uri 740 + .rkey() 741 + .ok_or(AgentError::SubOperation { 742 + step: "extract rkey", 743 + error: "AtUri missing rkey".into(), 744 + })? 745 + .clone() 746 + .into_static(); 747 + self.put_record::<R>(rkey, R::from(owned)).await 748 + } 207 749 } 208 750 209 751 impl<A: AgentSession> HttpClient for Agent<A> { ··· 236 778 } 237 779 } 238 780 781 + impl<A: AgentSession + IdentityResolver> IdentityResolver for Agent<A> { 782 + fn options(&self) -> &jacquard_identity::resolver::ResolverOptions { 783 + self.inner.options() 784 + } 785 + 786 + fn resolve_handle( 787 + &self, 788 + handle: &Handle<'_>, 789 + ) -> impl Future<Output = Result<Did<'static>, jacquard_identity::resolver::IdentityError>> 790 + { 791 + async { self.inner.resolve_handle(handle).await } 792 + } 793 + 794 + fn resolve_did_doc( 795 + &self, 796 + did: &Did<'_>, 797 + ) -> impl Future< 798 + Output = Result< 799 + jacquard_identity::resolver::DidDocResponse, 800 + jacquard_identity::resolver::IdentityError, 801 + >, 802 + > { 803 + async { self.inner.resolve_did_doc(did).await } 804 + } 805 + } 806 + 239 807 impl<A: AgentSession> From<A> for Agent<A> { 240 808 fn from(inner: A) -> Self { 241 809 Self::new(inner) ··· 254 822 jacquard_identity::PublicResolver, 255 823 >, 256 824 >; 825 + 826 + impl BasicClient { 827 + /// Create an unauthenticated BasicClient for public API access. 828 + /// 829 + /// Uses an in-memory session store and public resolver. Suitable for 830 + /// read-only operations on public data without authentication. 831 + /// 832 + /// # Example 833 + /// 834 + /// ```no_run 835 + /// # use jacquard::client::BasicClient; 836 + /// # use jacquard::types::string::AtUri; 837 + /// # use jacquard_api::app_bsky::feed::post::Post; 838 + /// # #[tokio::main] 839 + /// # async fn main() -> Result<(), Box<dyn std::error::Error>> { 840 + /// let client = BasicClient::unauthenticated(); 841 + /// let uri = AtUri::new_static("at://did:plc:xyz/app.bsky.feed.post/3l5abc").unwrap(); 842 + /// let response = client.get_record::<Post<'_>>(uri).await?; 843 + /// # Ok(()) 844 + /// # } 845 + /// ``` 846 + pub fn unauthenticated() -> Self { 847 + use std::sync::Arc; 848 + let http = reqwest::Client::new(); 849 + let resolver = jacquard_identity::PublicResolver::new(http, Default::default()); 850 + let store = MemorySessionStore::default(); 851 + let session = CredentialSession::new(Arc::new(store), Arc::new(resolver)); 852 + Agent::new(session) 853 + } 854 + } 855 + 856 + impl Default for BasicClient { 857 + fn default() -> Self { 858 + Self::unauthenticated() 859 + } 860 + }
+31 -1
crates/jacquard/src/client/credential_session.rs
··· 8 8 error::{AuthError, ClientError, TransportError, XrpcResult}, 9 9 http_client::HttpClient, 10 10 session::SessionStore, 11 - types::did::Did, 11 + types::{did::Did, string::Handle}, 12 12 xrpc::{CallOptions, Response, XrpcClient, XrpcError, XrpcExt, XrpcRequest, XrpcResp}, 13 13 }; 14 14 use tokio::sync::RwLock; ··· 451 451 _ => false, 452 452 } 453 453 } 454 + 455 + impl<S, T> IdentityResolver for CredentialSession<S, T> 456 + where 457 + S: SessionStore<SessionKey, AtpSession> + Send + Sync + 'static, 458 + T: HttpClient + IdentityResolver + Send + Sync + 'static, 459 + { 460 + fn options(&self) -> &jacquard_identity::resolver::ResolverOptions { 461 + self.client.options() 462 + } 463 + 464 + fn resolve_handle( 465 + &self, 466 + handle: &Handle<'_>, 467 + ) -> impl Future<Output = Result<Did<'static>, jacquard_identity::resolver::IdentityError>> 468 + { 469 + async { self.client.resolve_handle(handle).await } 470 + } 471 + 472 + fn resolve_did_doc( 473 + &self, 474 + did: &Did<'_>, 475 + ) -> impl Future< 476 + Output = Result< 477 + jacquard_identity::resolver::DidDocResponse, 478 + jacquard_identity::resolver::IdentityError, 479 + >, 480 + > { 481 + async { self.client.resolve_did_doc(did).await } 482 + } 483 + }
+3 -2
crates/jacquard/src/client/token.rs
··· 389 389 } 390 390 391 391 #[async_trait::async_trait] 392 - impl jacquard_common::session::SessionStore< 392 + impl 393 + jacquard_common::session::SessionStore< 393 394 crate::client::credential_session::SessionKey, 394 395 crate::client::AtpSession, 395 396 > for FileAuthStore ··· 452 453 #[cfg(test)] 453 454 mod tests { 454 455 use super::*; 455 - use crate::client::credential_session::SessionKey; 456 456 use crate::client::AtpSession; 457 + use crate::client::credential_session::SessionKey; 457 458 use jacquard_common::types::string::{Did, Handle}; 458 459 use std::fs; 459 460 use std::path::PathBuf;
+67
crates/jacquard/src/client/vec_update.rs
··· 1 + /// Bluesky actor preferences implementation 2 + pub mod preferences; 3 + 4 + pub use preferences::PreferencesUpdate; 5 + 6 + use jacquard_common::IntoStatic; 7 + use jacquard_common::xrpc::{XrpcRequest, XrpcResp}; 8 + 9 + /// Trait for get-modify-put patterns on vec-based data structures. 10 + /// 11 + /// This trait enables convenient update operations for endpoints that return arrays 12 + /// that need to be fetched, modified, and put back. Common use cases include 13 + /// preferences, saved feeds, and similar collection-style data. 14 + /// 15 + /// # Example 16 + /// 17 + /// ```ignore 18 + /// use jacquard::client::vec_update::VecUpdate; 19 + /// 20 + /// struct PreferencesUpdate; 21 + /// 22 + /// impl VecUpdate for PreferencesUpdate { 23 + /// type GetRequest = GetPreferences; 24 + /// type PutRequest = PutPreferences; 25 + /// type Item = PreferencesItem<'static>; 26 + /// 27 + /// fn extract_vec(output: GetPreferencesOutput<'_>) -> Vec<Self::Item> { 28 + /// output.preferences.into_iter().map(|p| p.into_static()).collect() 29 + /// } 30 + /// 31 + /// fn build_put(items: Vec<Self::Item>) -> PutPreferences { 32 + /// PutPreferences { preferences: items } 33 + /// } 34 + /// 35 + /// fn matches(a: &Self::Item, b: &Self::Item) -> bool { 36 + /// // Match by enum variant discriminant 37 + /// std::mem::discriminant(a) == std::mem::discriminant(b) 38 + /// } 39 + /// } 40 + /// ``` 41 + pub trait VecUpdate { 42 + /// The XRPC request type for fetching the data 43 + type GetRequest<'de>: XrpcRequest<'de>; 44 + 45 + /// The XRPC request type for putting the data back 46 + type PutRequest<'de>: XrpcRequest<'de>; 47 + 48 + /// The item type contained in the vec (must be owned/static) 49 + type Item: IntoStatic; 50 + 51 + /// Build the get request 52 + fn build_get<'s>() -> Self::GetRequest<'s>; 53 + 54 + /// Extract the vec from the get response output 55 + fn extract_vec<'s>( 56 + output: <<Self::GetRequest<'s> as XrpcRequest<'s>>::Response as XrpcResp>::Output<'s>, 57 + ) -> Vec<Self::Item>; 58 + 59 + /// Build the put request from the modified vec 60 + fn build_put<'s>(items: Vec<Self::Item>) -> Self::PutRequest<'s>; 61 + 62 + /// Check if two items match (for single-item update operations) 63 + /// 64 + /// This is used by `update_vec_item` to find and replace a single item in the vec. 65 + /// For example, preferences might match by enum variant discriminant. 66 + fn matches<'s>(a: &'s Self::Item, b: &'s Self::Item) -> bool; 67 + }
+63
crates/jacquard/src/client/vec_update/preferences.rs
··· 1 + use jacquard_api::app_bsky::actor::PreferencesItem; 2 + use jacquard_api::app_bsky::actor::get_preferences::{GetPreferences, GetPreferencesOutput}; 3 + use jacquard_api::app_bsky::actor::put_preferences::PutPreferences; 4 + use jacquard_common::IntoStatic; 5 + 6 + /// VecUpdate implementation for Bluesky actor preferences. 7 + /// 8 + /// Provides get-modify-put operations on user preferences, which are stored 9 + /// as a vec of preference items (each identified by enum discriminant). 10 + /// 11 + /// # Example 12 + /// 13 + /// ```ignore 14 + /// use jacquard::client::vec_update::PreferencesUpdate; 15 + /// use jacquard_api::app_bsky::actor::PreferencesItem; 16 + /// 17 + /// // Update all preferences 18 + /// agent.update_vec::<PreferencesUpdate>(|prefs| { 19 + /// // Add a new preference 20 + /// prefs.push(PreferencesItem::AdultContentPref( 21 + /// Box::new(AdultContentPref { enabled: true }) 22 + /// )); 23 + /// 24 + /// // Remove by variant 25 + /// prefs.retain(|p| !matches!(p, PreferencesItem::InterestsPref(_))); 26 + /// }).await?; 27 + /// 28 + /// // Update a single preference (replaces by discriminant) 29 + /// let pref = PreferencesItem::AdultContentPref( 30 + /// Box::new(AdultContentPref { enabled: false }) 31 + /// ); 32 + /// agent.update_vec_item::<PreferencesUpdate>(pref).await?; 33 + /// ``` 34 + pub struct PreferencesUpdate; 35 + 36 + impl super::VecUpdate for PreferencesUpdate { 37 + type GetRequest<'de> = GetPreferences; 38 + type PutRequest<'de> = PutPreferences<'de>; 39 + type Item = PreferencesItem<'static>; 40 + 41 + fn build_get<'s>() -> Self::GetRequest<'s> { 42 + GetPreferences::new().build() 43 + } 44 + 45 + fn extract_vec<'s>( 46 + output: GetPreferencesOutput<'s>, 47 + ) -> Vec<<Self::Item as IntoStatic>::Output> { 48 + output 49 + .preferences 50 + .into_iter() 51 + .map(|p| p.into_static()) 52 + .collect() 53 + } 54 + 55 + fn build_put<'s>(items: Vec<<Self::Item as IntoStatic>::Output>) -> Self::PutRequest<'s> { 56 + PutPreferences::new().preferences(items).build() 57 + } 58 + 59 + fn matches<'s>(a: &'s Self::Item, b: &'s Self::Item) -> bool { 60 + // Match preferences by enum variant discriminant 61 + std::mem::discriminant(a) == std::mem::discriminant(b) 62 + } 63 + }
+17 -13
crates/jacquard/src/lib.rs
··· 49 49 //! async fn main() -> miette::Result<()> { 50 50 //! let args = Args::parse(); 51 51 //! 52 - //! // File-backed auth store shared by OAuthClient and session registry 53 - //! let store = FileAuthStore::new(&args.store); 54 - //! let client_data = jacquard_oauth::session::ClientData { 55 - //! keyset: None, 56 - //! // Default sets normal localhost redirect URIs and "atproto transition:generic" scopes. 57 - //! // The localhost helper will ensure you have at least "atproto" and will fix urls 58 - //! config: AtprotoClientMetadata::default_localhost(), 59 - //! }; 60 - //! 61 - //! // Build an OAuth client (this is reusable, and can create multiple sessions) 62 - //! let oauth = OAuthClient::new(store, client_data); 52 + //! // Build an OAuth client with file-backed auth store and default localhost config 53 + //! let oauth = OAuthClient::with_default_config(FileAuthStore::new(&args.store)); 63 54 //! // Authenticate with a PDS, using a loopback server to handle the callback flow 64 55 //! # #[cfg(feature = "loopback")] 65 56 //! let session = oauth ··· 155 146 //! Ok(()) 156 147 //! } 157 148 //! ``` 149 + //! 150 + //! ## Component Crates 151 + //! 152 + //! Jacquard is split into several crates for modularity. The main `jacquard` crate 153 + //! re-exports most of the others, so you typically only need to depend on it directly. 154 + //! 155 + //! - [`jacquard-common`] - AT Protocol types (DIDs, handles, at-URIs, NSIDs, TIDs, CIDs, etc.) 156 + //! - [`jacquard-api`] - Generated API bindings from 646+ lexicon schemas 157 + //! - [`jacquard-axum`] - Server-side XRPC handler extractors for Axum framework (not re-exported, depends on jacquard) 158 + //! - [`jacquard-oauth`] - OAuth/DPoP flow implementation with session management 159 + //! - [`jacquard-identity`] - Identity resolution (handle→DID, DID→Doc, OAuth metadata) 160 + //! - [`jacquard-lexicon`] - Lexicon resolution, fetching, parsing and Rust code generation from schemas 161 + //! - [`jacquard-derive`] - Macros (`#[lexicon]`, `#[open_union]`, `#[derive(IntoStatic)]`) 158 162 159 163 #![warn(missing_docs)] 160 164 161 - /// XRPC client traits and basic implementation 162 165 pub mod client; 163 166 167 + pub use common::*; 164 168 #[cfg(feature = "api")] 165 169 /// If enabled, re-export the generated api crate 166 170 pub use jacquard_api as api; 167 - pub use jacquard_common::*; 171 + pub use jacquard_common as common; 168 172 169 173 #[cfg(feature = "derive")] 170 174 /// if enabled, reexport the attribute macros
+2 -4
crates/jacquard/src/main.rs examples/oauth_timeline.rs
··· 26 26 async fn main() -> miette::Result<()> { 27 27 let args = Args::parse(); 28 28 29 - // File-backed auth store for testing 29 + // File-backed auth store shared by OAuthClient and session registry 30 30 let store = FileAuthStore::new(&args.store); 31 - 32 - // Minimal localhost client metadata (redirect_uris get set by loopback helper) 33 31 let client_data = jacquard_oauth::session::ClientData { 34 32 keyset: None, 35 33 // Default sets normal localhost redirect URIs and "atproto transition:generic" scopes. ··· 37 35 config: AtprotoClientMetadata::default_localhost(), 38 36 }; 39 37 40 - // Build an OAuth client 38 + // Build an OAuth client (this is reusable, and can create multiple sessions) 41 39 let oauth = OAuthClient::new(store, client_data); 42 40 43 41 #[cfg(feature = "loopback")]
+36
examples/axum_server.rs
··· 1 + use axum::Router; 2 + use jacquard::api::com_atproto::identity::resolve_did::ResolveDidRequest; 3 + use jacquard_axum::{ExtractXrpc, IntoRouter}; 4 + use miette::{IntoDiagnostic, Result}; 5 + use tracing_subscriber::EnvFilter; 6 + 7 + #[axum_macros::debug_handler] 8 + async fn handler(ExtractXrpc(_args): ExtractXrpc<ResolveDidRequest>) -> &'static str { 9 + "hello world!" 10 + // let res = jacquard::identity::slingshot_resolver_default(); 11 + // let doc = res.resolve_did_doc(&args.did).await?; 12 + // let valid_doc = doc.parse()?; 13 + // let doc_value = serde_json::to_value(valid_doc).unwrap(); 14 + // Ok(ResolveDidOutput { 15 + // did_doc: Data::from_json(&doc_value).unwrap().into_static(), 16 + // extra_data: Default::default(), 17 + // } 18 + // .into()) 19 + } 20 + 21 + #[tokio::main] 22 + async fn main() -> Result<()> { 23 + tracing_subscriber::fmt() 24 + .with_timer(tracing_subscriber::fmt::time::UtcTime::rfc_3339()) 25 + .with_env_filter(EnvFilter::from_env("QDPDS_LOG")) 26 + .init(); 27 + let app = Router::new() 28 + .route("/", axum::routing::get(|| async { "hello world!" })) 29 + .merge(ResolveDidRequest::into_router(handler)) 30 + .layer(tower_http::trace::TraceLayer::new_for_http()); 31 + let listener = tokio::net::TcpListener::bind("0.0.0.0:3000") 32 + .await 33 + .into_diagnostic()?; 34 + axum::serve(listener, app).await.unwrap(); 35 + Ok(()) 36 + }
+56
examples/create_post.rs
··· 1 + use clap::Parser; 2 + use jacquard::api::app_bsky::feed::post::Post; 3 + use jacquard::client::{Agent, FileAuthStore}; 4 + use jacquard::oauth::atproto::AtprotoClientMetadata; 5 + use jacquard::oauth::client::OAuthClient; 6 + use jacquard::oauth::loopback::LoopbackConfig; 7 + use jacquard::types::string::Datetime; 8 + use jacquard::xrpc::XrpcClient; 9 + use jacquard::CowStr; 10 + use miette::IntoDiagnostic; 11 + 12 + #[derive(Parser, Debug)] 13 + #[command(author, version, about = "Create a simple post")] 14 + struct Args { 15 + /// Handle (e.g., alice.bsky.social), DID, or PDS URL 16 + input: CowStr<'static>, 17 + 18 + /// Post text 19 + #[arg(short, long)] 20 + text: String, 21 + 22 + /// Path to auth store file (will be created if missing) 23 + #[arg(long, default_value = "/tmp/jacquard-oauth-session.json")] 24 + store: String, 25 + } 26 + 27 + #[tokio::main] 28 + async fn main() -> miette::Result<()> { 29 + let args = Args::parse(); 30 + 31 + let oauth = OAuthClient::with_default_config(FileAuthStore::new(&args.store)); 32 + let session = oauth 33 + .login_with_local_server(args.input, Default::default(), LoopbackConfig::default()) 34 + .await?; 35 + 36 + let agent: Agent<_> = Agent::from(session); 37 + 38 + // Create a simple text post using the Agent convenience method 39 + let post = Post { 40 + text: CowStr::from(args.text), 41 + created_at: Datetime::now(), 42 + embed: None, 43 + entities: None, 44 + facets: None, 45 + labels: None, 46 + langs: None, 47 + reply: None, 48 + tags: None, 49 + extra_data: Default::default(), 50 + }; 51 + 52 + let output = agent.create_record(post, None).await?; 53 + println!("✓ Created post: {}", output.uri); 54 + 55 + Ok(()) 56 + }
+66
examples/create_whitewind_post.rs
··· 1 + use clap::Parser; 2 + use jacquard::api::com_whtwnd::blog::entry::Entry; 3 + use jacquard::client::{Agent, FileAuthStore}; 4 + use jacquard::oauth::atproto::AtprotoClientMetadata; 5 + use jacquard::oauth::client::OAuthClient; 6 + use jacquard::oauth::loopback::LoopbackConfig; 7 + use jacquard::types::string::Datetime; 8 + use jacquard::xrpc::XrpcClient; 9 + use jacquard::CowStr; 10 + use miette::IntoDiagnostic; 11 + 12 + #[derive(Parser, Debug)] 13 + #[command(author, version, about = "Create a WhiteWind blog post")] 14 + struct Args { 15 + /// Handle (e.g., alice.bsky.social), DID, or PDS URL 16 + input: CowStr<'static>, 17 + 18 + /// Blog post title 19 + #[arg(short, long)] 20 + title: String, 21 + 22 + /// Blog post content (markdown) 23 + #[arg(short, long)] 24 + content: String, 25 + 26 + /// Optional subtitle 27 + #[arg(short, long)] 28 + subtitle: Option<String>, 29 + 30 + /// Path to auth store file (will be created if missing) 31 + #[arg(long, default_value = "/tmp/jacquard-oauth-session.json")] 32 + store: String, 33 + } 34 + 35 + #[tokio::main] 36 + async fn main() -> miette::Result<()> { 37 + let args = Args::parse(); 38 + 39 + let oauth = OAuthClient::with_default_config(FileAuthStore::new(&args.store)); 40 + let session = oauth 41 + .login_with_local_server(args.input, Default::default(), LoopbackConfig::default()) 42 + .await?; 43 + 44 + let agent: Agent<_> = Agent::from(session); 45 + 46 + // Create a WhiteWind blog entry 47 + // The content field accepts markdown 48 + let entry = Entry { 49 + title: Some(CowStr::from(args.title)), 50 + subtitle: args.subtitle.map(CowStr::from), 51 + content: CowStr::from(args.content), 52 + created_at: Some(Datetime::now()), 53 + visibility: Some(CowStr::from("url")), // "url" = public with link, "author" = public on profile 54 + theme: None, 55 + ogp: None, 56 + blobs: None, 57 + is_draft: None, 58 + extra_data: Default::default(), 59 + }; 60 + 61 + let output = agent.create_record(entry, None).await?; 62 + println!("✓ Created WhiteWind blog post: {}", output.uri); 63 + println!(" View at: https://whtwnd.com/post/{}", output.uri); 64 + 65 + Ok(()) 66 + }
+97
examples/post_with_image.rs
··· 1 + use clap::Parser; 2 + use jacquard::api::app_bsky::embed::images::{Image, Images}; 3 + use jacquard::api::app_bsky::feed::post::{Post, PostEmbed}; 4 + use jacquard::client::{Agent, FileAuthStore}; 5 + use jacquard::oauth::atproto::AtprotoClientMetadata; 6 + use jacquard::oauth::client::OAuthClient; 7 + use jacquard::oauth::loopback::LoopbackConfig; 8 + use jacquard::types::blob::MimeType; 9 + use jacquard::types::string::Datetime; 10 + use jacquard::xrpc::XrpcClient; 11 + use jacquard::CowStr; 12 + use miette::IntoDiagnostic; 13 + use std::path::PathBuf; 14 + 15 + #[derive(Parser, Debug)] 16 + #[command(author, version, about = "Create a post with an image")] 17 + struct Args { 18 + /// Handle (e.g., alice.bsky.social), DID, or PDS URL 19 + input: CowStr<'static>, 20 + 21 + /// Post text 22 + #[arg(short, long)] 23 + text: String, 24 + 25 + /// Path to image file 26 + #[arg(short, long)] 27 + image: PathBuf, 28 + 29 + /// Alt text for image 30 + #[arg(long)] 31 + alt: Option<String>, 32 + 33 + /// Path to auth store file (will be created if missing) 34 + #[arg(long, default_value = "/tmp/jacquard-oauth-session.json")] 35 + store: String, 36 + } 37 + 38 + #[tokio::main] 39 + async fn main() -> miette::Result<()> { 40 + let args = Args::parse(); 41 + 42 + let oauth = OAuthClient::with_default_config(FileAuthStore::new(&args.store)); 43 + let session = oauth 44 + .login_with_local_server(args.input, Default::default(), LoopbackConfig::default()) 45 + .await?; 46 + 47 + let agent: Agent<_> = Agent::from(session); 48 + 49 + // Read image file 50 + let image_data = std::fs::read(&args.image).into_diagnostic()?; 51 + 52 + // Infer mime type from extension 53 + let mime_str = match args.image.extension().and_then(|s| s.to_str()) { 54 + Some("jpg") | Some("jpeg") => "image/jpeg", 55 + Some("png") => "image/png", 56 + Some("gif") => "image/gif", 57 + Some("webp") => "image/webp", 58 + _ => "image/jpeg", // default 59 + }; 60 + let mime_type = MimeType::new_static(mime_str); 61 + 62 + println!("📤 Uploading image..."); 63 + let blob_ref = agent.upload_blob(image_data, mime_type).await?; 64 + 65 + // Extract the Blob from the BlobRef 66 + let blob = match blob_ref { 67 + jacquard::types::blob::BlobRef::Blob(b) => b, 68 + _ => miette::bail!("Expected Blob, got LegacyBlob"), 69 + }; 70 + 71 + // Create post with image embed 72 + let post = Post { 73 + text: CowStr::from(args.text), 74 + created_at: Datetime::now(), 75 + embed: Some(PostEmbed::Images(Box::new(Images { 76 + images: vec![Image { 77 + alt: CowStr::from(args.alt.unwrap_or_default()), 78 + image: blob, 79 + aspect_ratio: None, 80 + extra_data: Default::default(), 81 + }], 82 + extra_data: Default::default(), 83 + }))), 84 + entities: None, 85 + facets: None, 86 + labels: None, 87 + langs: None, 88 + reply: None, 89 + tags: None, 90 + extra_data: Default::default(), 91 + }; 92 + 93 + let output = agent.create_record(post, None).await?; 94 + println!("✓ Created post with image: {}", output.uri); 95 + 96 + Ok(()) 97 + }
+32
examples/public_atproto_feed.rs
··· 1 + use jacquard::api::app_bsky::feed::get_feed::GetFeed; 2 + use jacquard::api::app_bsky::feed::post::Post; 3 + use jacquard::types::string::AtUri; 4 + use jacquard::types::value::from_data; 5 + use jacquard::xrpc::XrpcExt; 6 + use miette::IntoDiagnostic; 7 + 8 + #[tokio::main] 9 + async fn main() -> miette::Result<()> { 10 + // Stateless XRPC - no auth required for public feeds 11 + let http = reqwest::Client::new(); 12 + let base = url::Url::parse("https://public.api.bsky.app").into_diagnostic()?; 13 + 14 + // Feed of posts about the AT Protocol 15 + let feed_uri = 16 + AtUri::new_static("at://did:plc:oio4hkxaop4ao4wz2pp3f4cr/app.bsky.feed.generator/atproto") 17 + .unwrap(); 18 + 19 + let request = GetFeed::new().feed(feed_uri).limit(10).build(); 20 + 21 + let response = http.xrpc(base).send(&request).await?; 22 + let output = response.into_output()?; 23 + 24 + println!("📰 Latest posts from the AT Protocol feed:\n"); 25 + for (i, item) in output.feed.iter().enumerate() { 26 + // Deserialize the post record from the Data type 27 + let post: Post = from_data(&item.post.record).into_diagnostic()?; 28 + println!("{}.(@{})\n{} ", i + 1, item.post.author.handle, post.text); 29 + } 30 + 31 + Ok(()) 32 + }
+63
examples/read_tangled_repo.rs
··· 1 + use clap::Parser; 2 + use jacquard::api::sh_tangled::repo::Repo; 3 + use jacquard::client::BasicClient; 4 + use jacquard::types::string::AtUri; 5 + 6 + #[derive(Parser, Debug)] 7 + #[command(author, version, about = "Read a Tangled git repository record")] 8 + struct Args { 9 + /// at:// URI of the repo record 10 + /// Example: at://did:plc:xyz/sh.tangled.repo/3lzabc123 11 + /// The default is the jacquard repository 12 + #[arg(default_value = "at://did:plc:yfvwmnlztr4dwkb7hwz55r2g/sh.tangled.repo/3lzrya6fcwv22")] 13 + uri: String, 14 + } 15 + 16 + #[tokio::main] 17 + async fn main() -> miette::Result<()> { 18 + let args = Args::parse(); 19 + 20 + // Parse the at:// URI 21 + let uri = AtUri::new(&args.uri)?; 22 + 23 + // Create an unauthenticated agent for public record access 24 + let agent = BasicClient::unauthenticated(); 25 + 26 + // Use Agent's get_record helper with the at:// URI 27 + let response = agent.get_record::<Repo>(uri).await?; 28 + let output = response.into_output()?; 29 + 30 + println!("Tangled Repository\n"); 31 + println!("URI: {}", output.uri); 32 + println!("Name: {}", output.value.name); 33 + 34 + if let Some(desc) = &output.value.description { 35 + println!("Description: {}", desc); 36 + } 37 + 38 + println!("Knot: {}", output.value.knot); 39 + println!("Created: {}", output.value.created_at); 40 + 41 + if let Some(source) = &output.value.source { 42 + println!("Source: {}", source.as_str()); 43 + } 44 + 45 + if let Some(spindle) = &output.value.spindle { 46 + println!("CI Spindle: {}", spindle); 47 + } 48 + 49 + if let Some(labels) = &output.value.labels { 50 + if !labels.is_empty() { 51 + println!( 52 + "Labels available: {}", 53 + labels 54 + .iter() 55 + .map(|l| l.to_string()) 56 + .collect::<Vec<_>>() 57 + .join(", ") 58 + ); 59 + } 60 + } 61 + 62 + Ok(()) 63 + }
+40
examples/read_whitewind_posts.rs
··· 1 + use clap::Parser; 2 + use jacquard::api::com_whtwnd::blog::entry::Entry; 3 + use jacquard::client::BasicClient; 4 + use jacquard::types::string::AtUri; 5 + 6 + #[derive(Parser, Debug)] 7 + #[command(author, version, about = "Read a WhiteWind blog post")] 8 + struct Args { 9 + /// at:// URI of the blog entry 10 + /// Example: at://did:plc:xyz/com.whtwnd.blog.entry/3l5abc123 11 + uri: String, 12 + } 13 + 14 + #[tokio::main] 15 + async fn main() -> miette::Result<()> { 16 + let args = Args::parse(); 17 + 18 + // Parse the at:// URI 19 + let uri = AtUri::new(&args.uri)?; 20 + 21 + // Create an unauthenticated agent for public record access 22 + let agent = BasicClient::unauthenticated(); 23 + 24 + // Use Agent's get_record helper with the at:// URI 25 + let response = agent.get_record::<Entry>(uri).await?; 26 + let output = response.into_output()?; 27 + 28 + println!("📚 WhiteWind Blog Entry\n"); 29 + println!("URI: {}", output.uri); 30 + println!("Title: {}", output.value.title.as_deref().unwrap_or("[Untitled]")); 31 + if let Some(subtitle) = &output.value.subtitle { 32 + println!("Subtitle: {}", subtitle); 33 + } 34 + if let Some(created) = &output.value.created_at { 35 + println!("Created: {}", created); 36 + } 37 + println!("\n{}", output.value.content); 38 + 39 + Ok(()) 40 + }
+100
examples/resolve_did.rs
··· 1 + use clap::Parser; 2 + use jacquard::client::BasicClient; 3 + use jacquard::types::string::Handle; 4 + use jacquard_identity::resolver::IdentityResolver; 5 + use miette::IntoDiagnostic; 6 + 7 + #[derive(Parser, Debug)] 8 + #[command(author, version, about = "Resolve a handle to its DID document")] 9 + struct Args { 10 + /// Handle to resolve (e.g., alice.bsky.social) 11 + #[arg(default_value = "pfrazee.com")] 12 + handle: String, 13 + } 14 + 15 + #[tokio::main] 16 + async fn main() -> miette::Result<()> { 17 + let args = Args::parse(); 18 + 19 + // Parse the handle 20 + let handle = Handle::new(&args.handle)?; 21 + 22 + // Create an unauthenticated client with identity resolver 23 + let client = BasicClient::unauthenticated(); 24 + 25 + // Resolve handle to DID 26 + println!("Resolving handle: {}", handle); 27 + let did = client 28 + .resolve_handle(&handle) 29 + .await 30 + .map_err(|e| miette::miette!("Failed to resolve handle: {}", e))?; 31 + 32 + println!("DID: {}\n", did); 33 + 34 + // Resolve DID document 35 + let doc_response = client 36 + .resolve_did_doc(&did) 37 + .await 38 + .map_err(|e| miette::miette!("Failed to resolve DID document: {}", e))?; 39 + 40 + let doc = doc_response 41 + .parse() 42 + .map_err(|e| miette::miette!("Failed to parse DID document: {}", e))?; 43 + 44 + println!("DID Document:"); 45 + println!("ID: {}", doc.id); 46 + 47 + if let Some(aka) = &doc.also_known_as { 48 + if !aka.is_empty() { 49 + println!("\nAlso Known As:"); 50 + for handle in aka { 51 + println!(" - {}", handle); 52 + } 53 + } 54 + } 55 + 56 + if let Some(verification_methods) = &doc.verification_method { 57 + println!("\nVerification Methods:"); 58 + for method in verification_methods { 59 + println!(" ID: {}", method.id); 60 + println!(" Type: {}", method.r#type); 61 + if let Some(controller) = &method.controller { 62 + println!(" Controller: {}", controller); 63 + } 64 + if let Some(key) = &method.public_key_multibase { 65 + println!(" Public Key (multibase): {}", key); 66 + } 67 + if !method.extra_data.is_empty() { 68 + println!(" Extra fields: {:?}", method.extra_data); 69 + } 70 + println!(); 71 + } 72 + } 73 + 74 + if let Some(services) = &doc.service { 75 + println!("Services:"); 76 + for service in services { 77 + println!(" ID: {}", service.id); 78 + println!(" Type: {}", service.r#type); 79 + if let Some(endpoint) = &service.service_endpoint { 80 + println!(" Endpoint: {:?}", endpoint); 81 + } 82 + if !service.extra_data.is_empty() { 83 + println!(" Extra fields: {:?}", service.extra_data); 84 + } 85 + println!(); 86 + } 87 + } 88 + 89 + if !doc.extra_data.is_empty() { 90 + for (key, value) in &doc.extra_data { 91 + println!( 92 + "{}: {}", 93 + key, 94 + serde_json::to_string_pretty(value).into_diagnostic()? 95 + ); 96 + } 97 + } 98 + 99 + Ok(()) 100 + }
+95
examples/update_preferences.rs
··· 1 + use clap::Parser; 2 + use jacquard::api::app_bsky::actor::{AdultContentPref, PreferencesItem}; 3 + use jacquard::client::vec_update::VecUpdate; 4 + use jacquard::client::{Agent, FileAuthStore}; 5 + use jacquard::oauth::atproto::AtprotoClientMetadata; 6 + use jacquard::oauth::client::OAuthClient; 7 + use jacquard::oauth::loopback::LoopbackConfig; 8 + use jacquard::{CowStr, IntoStatic}; 9 + 10 + #[derive(Parser, Debug)] 11 + #[command(author, version, about = "Update Bluesky preferences")] 12 + struct Args { 13 + /// Handle (e.g., alice.bsky.social), DID, or PDS URL 14 + input: CowStr<'static>, 15 + 16 + /// Enable adult content 17 + #[arg(long)] 18 + enable_adult_content: bool, 19 + 20 + /// Path to auth store file (will be created if missing) 21 + #[arg(long, default_value = "/tmp/jacquard-oauth-session.json")] 22 + store: String, 23 + } 24 + 25 + /// Helper struct for the VecUpdate pattern on preferences 26 + pub struct PreferencesUpdate; 27 + 28 + impl VecUpdate for PreferencesUpdate { 29 + type GetRequest<'de> = jacquard::api::app_bsky::actor::get_preferences::GetPreferences; 30 + type PutRequest<'de> = jacquard::api::app_bsky::actor::put_preferences::PutPreferences<'de>; 31 + type Item = PreferencesItem<'static>; 32 + 33 + fn build_get<'s>() -> Self::GetRequest<'s> { 34 + jacquard::api::app_bsky::actor::get_preferences::GetPreferences::new().build() 35 + } 36 + 37 + fn build_put<'s>(items: Vec<Self::Item>) -> Self::PutRequest<'s> { 38 + jacquard::api::app_bsky::actor::put_preferences::PutPreferences { 39 + preferences: items, 40 + extra_data: Default::default(), 41 + } 42 + } 43 + 44 + fn extract_vec( 45 + output: jacquard::api::app_bsky::actor::get_preferences::GetPreferencesOutput<'_>, 46 + ) -> Vec<Self::Item> { 47 + output 48 + .preferences 49 + .into_iter() 50 + .map(|p| p.into_static()) 51 + .collect() 52 + } 53 + 54 + fn matches(a: &Self::Item, b: &Self::Item) -> bool { 55 + // Match by enum variant discriminant 56 + std::mem::discriminant(a) == std::mem::discriminant(b) 57 + } 58 + } 59 + 60 + #[tokio::main] 61 + async fn main() -> miette::Result<()> { 62 + let args = Args::parse(); 63 + 64 + let oauth = OAuthClient::with_default_config(FileAuthStore::new(&args.store)); 65 + let session = oauth 66 + .login_with_local_server(args.input, Default::default(), LoopbackConfig::default()) 67 + .await?; 68 + 69 + let agent: Agent<_> = Agent::from(session); 70 + 71 + // Create the adult content preference 72 + let adult_pref = AdultContentPref { 73 + enabled: args.enable_adult_content, 74 + extra_data: Default::default(), 75 + }; 76 + 77 + // Update preferences using update_vec_item 78 + // This will replace existing AdultContentPref or add it if not present 79 + agent 80 + .update_vec_item::<PreferencesUpdate>(PreferencesItem::AdultContentPref(Box::new( 81 + adult_pref, 82 + ))) 83 + .await?; 84 + 85 + println!( 86 + "✓ Updated adult content preference: {}", 87 + if args.enable_adult_content { 88 + "enabled" 89 + } else { 90 + "disabled" 91 + } 92 + ); 93 + 94 + Ok(()) 95 + }
+67
examples/update_profile.rs
··· 1 + use clap::Parser; 2 + use jacquard::CowStr; 3 + use jacquard::api::app_bsky::actor::profile::Profile; 4 + use jacquard::client::{Agent, FileAuthStore}; 5 + use jacquard::oauth::atproto::AtprotoClientMetadata; 6 + use jacquard::oauth::client::OAuthClient; 7 + use jacquard::oauth::loopback::LoopbackConfig; 8 + use jacquard::types::string::AtUri; 9 + use jacquard::xrpc::XrpcClient; 10 + use miette::IntoDiagnostic; 11 + 12 + #[derive(Parser, Debug)] 13 + #[command(author, version, about = "Update profile display name and description")] 14 + struct Args { 15 + /// Handle (e.g., alice.bsky.social), DID, or PDS URL 16 + input: CowStr<'static>, 17 + 18 + /// New display name 19 + #[arg(long)] 20 + display_name: Option<String>, 21 + 22 + /// New bio/description 23 + #[arg(long)] 24 + description: Option<String>, 25 + 26 + /// Path to auth store file (will be created if missing) 27 + #[arg(long, default_value = "/tmp/jacquard-oauth-session.json")] 28 + store: String, 29 + } 30 + 31 + #[tokio::main] 32 + async fn main() -> miette::Result<()> { 33 + let args = Args::parse(); 34 + 35 + let oauth = OAuthClient::with_default_config(FileAuthStore::new(&args.store)); 36 + let session = oauth 37 + .login_with_local_server(args.input, Default::default(), LoopbackConfig::default()) 38 + .await?; 39 + 40 + let agent: Agent<_> = Agent::from(session); 41 + 42 + // Get session info to build the at:// URI for the profile record 43 + let (did, _) = agent 44 + .info() 45 + .await 46 + .ok_or_else(|| miette::miette!("No session info available"))?; 47 + 48 + // Profile records use "self" as the rkey 49 + let uri_string = format!("at://{}/app.bsky.actor.profile/self", did); 50 + let uri = AtUri::new(&uri_string)?; 51 + 52 + // Update profile in-place using the fetch-modify-put pattern 53 + agent 54 + .update_record::<Profile>(uri, |profile| { 55 + if let Some(name) = &args.display_name { 56 + profile.display_name = Some(CowStr::from(name.clone())); 57 + } 58 + if let Some(desc) = &args.description { 59 + profile.description = Some(CowStr::from(desc.clone())); 60 + } 61 + }) 62 + .await?; 63 + 64 + println!("✓ Profile updated successfully"); 65 + 66 + Ok(()) 67 + }
+44
justfile
··· 12 12 # Run 'bacon' to run the project (auto-recompiles) 13 13 watch *ARGS: 14 14 bacon --job run -- -- {{ ARGS }} 15 + 16 + # Run the OAuth timeline example 17 + example-oauth *ARGS: 18 + cargo run -p jacquard --example oauth_timeline --features fancy -- {{ARGS}} 19 + 20 + # Create a simple post 21 + example-create-post *ARGS: 22 + cargo run -p jacquard --example create_post --features fancy -- {{ARGS}} 23 + 24 + # Create a post with an image 25 + example-post-image *ARGS: 26 + cargo run -p jacquard --example post_with_image --features fancy -- {{ARGS}} 27 + 28 + # Update profile display name and description 29 + example-update-profile *ARGS: 30 + cargo run -p jacquard --example update_profile --features fancy -- {{ARGS}} 31 + 32 + # Fetch public AT Protocol feed (no auth) 33 + example-public-feed: 34 + cargo run -p jacquard --example public_atproto_feed 35 + 36 + # Create a WhiteWind blog post 37 + example-whitewind-create *ARGS: 38 + cargo run -p jacquard --example create_whitewind_post --features fancy -- {{ARGS}} 39 + 40 + # Read a WhiteWind blog post 41 + example-whitewind-read *ARGS: 42 + cargo run -p jacquard --example read_whitewind_posts --features fancy,api_full -- {{ARGS}} 43 + 44 + # Read info about a Tangled git repository 45 + example-tangled-repo *ARGS: 46 + cargo run -p jacquard --example read_tangled_repo --features fancy,api_full -- {{ARGS}} 47 + 48 + # Resolve a handle to its DID document 49 + example-resolve-did *ARGS: 50 + cargo run -p jacquard --example resolve_did -- {{ARGS}} 51 + 52 + # Update Bluesky preferences 53 + example-update-preferences *ARGS: 54 + cargo run -p jacquard --example update_preferences --features fancy -- {{ARGS}} 55 + 56 + # Run the Axum server example 57 + example-axum: 58 + cargo run -p jacquard-axum --example axum_server --features jacquard/fancy