···1818jacquard-axum = { path = "../jacquard/crates/jacquard-axum" }
1919# jacquard-common = "0.11.0"
2020jacquard-common = { path = "../jacquard/crates/jacquard-common", features = ["websocket", "streaming", "reqwest-client"] }
2121+jacquard-derive = { path = "../jacquard/crates/jacquard-derive" }
2122# jacquard-identity = { version = "0.11.0", features = ["cache", "dns"] }
2223jacquard-identity = { path = "../jacquard/crates/jacquard-identity", features = ["cache", "dns"] }
2324log = "0.4.29"
2425postcard = { version = "1", features = ["alloc"] }
2526reqwest = { version = "0.12.23", features = ["stream", "json"] }
2727+rustversion = "1.0"
2628serde = { version = "1.0.228", features = ["derive"] }
2729serde_json = "1.0.149"
2830thiserror = "2"
+3
README.md
···4455# Work done currently
66- `app.bsky.actor.getProfile` - Just started, and let me tell you. It got hands
77+ - Should be pulling in everything from the profile lexicon
88+ - Pulls in followers since it's easy from constellation
99+ - Other things like labels, etc are not done yet
710- `app.bsky.actor.getPreferences` - Works, but not as expected. It has it's own internal preferences. Not the ones from your PDS. best to just use a social app that clears the atproto-proxy to get from your own PDS
811- `app.bsky.actor.putPreferences` - [lol](https://github.com/bluesky-social/atproto/issues/4193). Best to just use a bsky-social app fork like https://blacksky.community for running this AppView
···11+// @generated by jacquard-lexicon. DO NOT EDIT.
22+//
33+// This file was automatically generated from Lexicon schemas.
44+// Any manual changes will be overwritten on the next regeneration.
55+66+pub mod links;
+6
src/lexicons/blue_microcosm/links.rs
···11+// @generated by jacquard-lexicon. DO NOT EDIT.
22+//
33+// This file was automatically generated from Lexicon schemas.
44+// Any manual changes will be overwritten on the next regeneration.
55+66+pub mod get_backlink_dids;
···11+// @generated by jacquard-lexicon. DO NOT EDIT.
22+//
33+// Lexicon: blue.microcosm.links.getBacklinkDids
44+//
55+// This file was automatically generated from Lexicon schemas.
66+// Any manual changes will be overwritten on the next regeneration.
77+88+#[derive(
99+ serde::Serialize,
1010+ serde::Deserialize,
1111+ Debug,
1212+ Clone,
1313+ PartialEq,
1414+ Eq,
1515+ jacquard_derive::IntoStatic
1616+)]
1717+#[serde(rename_all = "camelCase")]
1818+pub struct GetBacklinkDids<'a> {
1919+ ///(default: 16, min: 1, max: 100)
2020+ #[serde(skip_serializing_if = "std::option::Option::is_none")]
2121+ pub limit: std::option::Option<i64>,
2222+ #[serde(borrow)]
2323+ pub source: jacquard_common::CowStr<'a>,
2424+ #[serde(borrow)]
2525+ pub subject: jacquard_common::types::string::UriValue<'a>,
2626+}
2727+2828+pub mod get_backlink_dids_state {
2929+3030+ pub use crate::builder_types::{Set, Unset, IsSet, IsUnset};
3131+ #[allow(unused)]
3232+ use ::core::marker::PhantomData;
3333+ mod sealed {
3434+ pub trait Sealed {}
3535+ }
3636+ /// State trait tracking which required fields have been set
3737+ pub trait State: sealed::Sealed {
3838+ type Subject;
3939+ type Source;
4040+ }
4141+ /// Empty state - all required fields are unset
4242+ pub struct Empty(());
4343+ impl sealed::Sealed for Empty {}
4444+ impl State for Empty {
4545+ type Subject = Unset;
4646+ type Source = Unset;
4747+ }
4848+ ///State transition - sets the `subject` field to Set
4949+ pub struct SetSubject<S: State = Empty>(PhantomData<fn() -> S>);
5050+ impl<S: State> sealed::Sealed for SetSubject<S> {}
5151+ impl<S: State> State for SetSubject<S> {
5252+ type Subject = Set<members::subject>;
5353+ type Source = S::Source;
5454+ }
5555+ ///State transition - sets the `source` field to Set
5656+ pub struct SetSource<S: State = Empty>(PhantomData<fn() -> S>);
5757+ impl<S: State> sealed::Sealed for SetSource<S> {}
5858+ impl<S: State> State for SetSource<S> {
5959+ type Subject = S::Subject;
6060+ type Source = Set<members::source>;
6161+ }
6262+ /// Marker types for field names
6363+ #[allow(non_camel_case_types)]
6464+ pub mod members {
6565+ ///Marker type for the `subject` field
6666+ pub struct subject(());
6767+ ///Marker type for the `source` field
6868+ pub struct source(());
6969+ }
7070+}
7171+7272+/// Builder for constructing an instance of this type
7373+pub struct GetBacklinkDidsBuilder<'a, S: get_backlink_dids_state::State> {
7474+ _phantom_state: ::core::marker::PhantomData<fn() -> S>,
7575+ __unsafe_private_named: (
7676+ ::core::option::Option<i64>,
7777+ ::core::option::Option<jacquard_common::CowStr<'a>>,
7878+ ::core::option::Option<jacquard_common::types::string::UriValue<'a>>,
7979+ ),
8080+ _phantom: ::core::marker::PhantomData<&'a ()>,
8181+}
8282+8383+impl<'a> GetBacklinkDids<'a> {
8484+ /// Create a new builder for this type
8585+ pub fn new() -> GetBacklinkDidsBuilder<'a, get_backlink_dids_state::Empty> {
8686+ GetBacklinkDidsBuilder::new()
8787+ }
8888+}
8989+9090+impl<'a> GetBacklinkDidsBuilder<'a, get_backlink_dids_state::Empty> {
9191+ /// Create a new builder with all fields unset
9292+ pub fn new() -> Self {
9393+ GetBacklinkDidsBuilder {
9494+ _phantom_state: ::core::marker::PhantomData,
9595+ __unsafe_private_named: (None, None, None),
9696+ _phantom: ::core::marker::PhantomData,
9797+ }
9898+ }
9999+}
100100+101101+impl<'a, S: get_backlink_dids_state::State> GetBacklinkDidsBuilder<'a, S> {
102102+ /// Set the `limit` field (optional)
103103+ pub fn limit(mut self, value: impl Into<Option<i64>>) -> Self {
104104+ self.__unsafe_private_named.0 = value.into();
105105+ self
106106+ }
107107+ /// Set the `limit` field to an Option value (optional)
108108+ pub fn maybe_limit(mut self, value: Option<i64>) -> Self {
109109+ self.__unsafe_private_named.0 = value;
110110+ self
111111+ }
112112+}
113113+114114+impl<'a, S> GetBacklinkDidsBuilder<'a, S>
115115+where
116116+ S: get_backlink_dids_state::State,
117117+ S::Source: get_backlink_dids_state::IsUnset,
118118+{
119119+ /// Set the `source` field (required)
120120+ pub fn source(
121121+ mut self,
122122+ value: impl Into<jacquard_common::CowStr<'a>>,
123123+ ) -> GetBacklinkDidsBuilder<'a, get_backlink_dids_state::SetSource<S>> {
124124+ self.__unsafe_private_named.1 = ::core::option::Option::Some(value.into());
125125+ GetBacklinkDidsBuilder {
126126+ _phantom_state: ::core::marker::PhantomData,
127127+ __unsafe_private_named: self.__unsafe_private_named,
128128+ _phantom: ::core::marker::PhantomData,
129129+ }
130130+ }
131131+}
132132+133133+impl<'a, S> GetBacklinkDidsBuilder<'a, S>
134134+where
135135+ S: get_backlink_dids_state::State,
136136+ S::Subject: get_backlink_dids_state::IsUnset,
137137+{
138138+ /// Set the `subject` field (required)
139139+ pub fn subject(
140140+ mut self,
141141+ value: impl Into<jacquard_common::types::string::UriValue<'a>>,
142142+ ) -> GetBacklinkDidsBuilder<'a, get_backlink_dids_state::SetSubject<S>> {
143143+ self.__unsafe_private_named.2 = ::core::option::Option::Some(value.into());
144144+ GetBacklinkDidsBuilder {
145145+ _phantom_state: ::core::marker::PhantomData,
146146+ __unsafe_private_named: self.__unsafe_private_named,
147147+ _phantom: ::core::marker::PhantomData,
148148+ }
149149+ }
150150+}
151151+152152+impl<'a, S> GetBacklinkDidsBuilder<'a, S>
153153+where
154154+ S: get_backlink_dids_state::State,
155155+ S::Subject: get_backlink_dids_state::IsSet,
156156+ S::Source: get_backlink_dids_state::IsSet,
157157+{
158158+ /// Build the final struct
159159+ pub fn build(self) -> GetBacklinkDids<'a> {
160160+ GetBacklinkDids {
161161+ limit: self.__unsafe_private_named.0,
162162+ source: self.__unsafe_private_named.1.unwrap(),
163163+ subject: self.__unsafe_private_named.2.unwrap(),
164164+ }
165165+ }
166166+}
167167+168168+#[jacquard_derive::lexicon]
169169+#[derive(
170170+ serde::Serialize,
171171+ serde::Deserialize,
172172+ Debug,
173173+ Clone,
174174+ PartialEq,
175175+ Eq,
176176+ jacquard_derive::IntoStatic
177177+)]
178178+pub struct GetBacklinkDidsOutput<'a> {
179179+ /// pagination cursor
180180+ #[serde(skip_serializing_if = "std::option::Option::is_none")]
181181+ #[serde(borrow)]
182182+ pub cursor: std::option::Option<jacquard_common::CowStr<'a>>,
183183+ #[serde(borrow)]
184184+ pub linking_dids: Vec<jacquard_common::types::string::Did<'a>>,
185185+ /// total number of matching links
186186+ pub total: i64,
187187+}
188188+189189+/// Response type for
190190+///blue.microcosm.links.getBacklinkDids
191191+pub struct GetBacklinkDidsResponse;
192192+impl jacquard_common::xrpc::XrpcResp for GetBacklinkDidsResponse {
193193+ const NSID: &'static str = "blue.microcosm.links.getBacklinkDids";
194194+ const ENCODING: &'static str = "application/json";
195195+ type Output<'de> = GetBacklinkDidsOutput<'de>;
196196+ type Err<'de> = jacquard_common::xrpc::GenericError<'de>;
197197+}
198198+199199+impl<'a> jacquard_common::xrpc::XrpcRequest for GetBacklinkDids<'a> {
200200+ const NSID: &'static str = "blue.microcosm.links.getBacklinkDids";
201201+ const METHOD: jacquard_common::xrpc::XrpcMethod = jacquard_common::xrpc::XrpcMethod::Query;
202202+ type Response = GetBacklinkDidsResponse;
203203+}
204204+205205+/// Endpoint type for
206206+///blue.microcosm.links.getBacklinkDids
207207+pub struct GetBacklinkDidsRequest;
208208+impl jacquard_common::xrpc::XrpcEndpoint for GetBacklinkDidsRequest {
209209+ const PATH: &'static str = "/xrpc/blue.microcosm.links.getBacklinkDids";
210210+ const METHOD: jacquard_common::xrpc::XrpcMethod = jacquard_common::xrpc::XrpcMethod::Query;
211211+ type Request<'de> = GetBacklinkDids<'de>;
212212+ type Response = GetBacklinkDidsResponse;
213213+}
+43
src/lexicons/builder_types.rs
···11+// @generated by jacquard-lexicon. DO NOT EDIT.
22+//
33+// This file was automatically generated from Lexicon schemas.
44+// Any manual changes will be overwritten on the next regeneration.
55+66+/// Marker type indicating a builder field has been set
77+pub struct Set<T>(pub T);
88+impl<T> Set<T> {
99+ /// Extract the inner value
1010+ #[inline]
1111+ pub fn into_inner(self) -> T {
1212+ self.0
1313+ }
1414+}
1515+1616+/// Marker type indicating a builder field has not been set
1717+pub struct Unset;
1818+/// Trait indicating a builder field is set (has a value)
1919+#[rustversion::attr(
2020+ since(1.78.0),
2121+ diagnostic::on_unimplemented(
2222+ message = "the field `{Self}` was not set, but this method requires it to be set",
2323+ label = "the field `{Self}` was not set"
2424+ )
2525+)]
2626+pub trait IsSet: private::Sealed {}
2727+/// Trait indicating a builder field is unset (no value yet)
2828+#[rustversion::attr(
2929+ since(1.78.0),
3030+ diagnostic::on_unimplemented(
3131+ message = "the field `{Self}` was already set, but this method requires it to be unset",
3232+ label = "the field `{Self}` was already set"
3333+ )
3434+)]
3535+pub trait IsUnset: private::Sealed {}
3636+impl<T> IsSet for Set<T> {}
3737+impl IsUnset for Unset {}
3838+mod private {
3939+ /// Sealed trait to prevent external implementations
4040+ pub trait Sealed {}
4141+ impl<T> Sealed for super::Set<T> {}
4242+ impl Sealed for super::Unset {}
4343+}
+2
src/lexicons/mod.rs
···11+pub mod blue_microcosm;
22+pub mod builder_types;