#[allow(unused_imports)]
use alloc::collections::BTreeMap;
use crate::app_bsky::feed::PostView;
#[allow(unused_imports)]
use core::marker::PhantomData;
use jacquard_common::deps::smol_str::SmolStr;
use jacquard_common::types::ident::AtIdentifier;
use jacquard_common::types::string::{AtUri, Language, UriValue};
use jacquard_common::types::value::Data;
use jacquard_common::{BosStr, CowStr, DefaultStr, FromStaticStr};
use jacquard_derive::{IntoStatic, open_union};
use serde::{Deserialize, Serialize};
#[derive(Serialize, Deserialize, Debug, Clone, PartialEq, Eq, IntoStatic)]
#[serde(
rename_all = "camelCase",
bound(deserialize = "S: Deserialize<'de> + BosStr")
)]
pub struct SearchPostsV2<S: BosStr = DefaultStr> {
#[serde(skip_serializing_if = "Option::is_none")]
pub all_time: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub authors: Option<Vec<AtIdentifier<S>>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub cursor: Option<S>,
#[serde(skip_serializing_if = "Option::is_none")]
pub domains: Option<Vec<S>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub embedded_at_uris: Option<Vec<AtUri<S>>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub exclude_authors: Option<Vec<AtIdentifier<S>>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub exclude_domains: Option<Vec<S>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub exclude_embedded_at_uris: Option<Vec<AtUri<S>>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub exclude_hashtags: Option<Vec<S>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub exclude_languages: Option<Vec<Language>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub exclude_mentions: Option<Vec<AtIdentifier<S>>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub exclude_replies: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub exclude_urls: Option<Vec<UriValue<S>>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub following: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub has_media: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub has_video: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub hashtags: Option<Vec<S>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub languages: Option<Vec<Language>>,
#[serde(default = "_default_limit")]
#[serde(skip_serializing_if = "Option::is_none")]
pub limit: Option<i64>,
#[serde(skip_serializing_if = "Option::is_none")]
pub mentions: Option<Vec<AtIdentifier<S>>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub query: Option<S>,
#[serde(skip_serializing_if = "Option::is_none")]
pub query_language: Option<S>,
#[serde(skip_serializing_if = "Option::is_none")]
pub replies_only: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub reply_parent_uri: Option<AtUri<S>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub since: Option<S>,
#[serde(skip_serializing_if = "Option::is_none")]
pub sort: Option<S>,
#[serde(skip_serializing_if = "Option::is_none")]
pub thread_root_uri: Option<AtUri<S>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub until: Option<S>,
#[serde(skip_serializing_if = "Option::is_none")]
pub urls: Option<Vec<UriValue<S>>>,
}
#[derive(Serialize, Deserialize, Debug, Clone, PartialEq, Eq, IntoStatic)]
#[serde(
rename_all = "camelCase",
bound(deserialize = "S: Deserialize<'de> + BosStr")
)]
pub struct SearchPostsV2Output<S: BosStr = DefaultStr> {
#[serde(skip_serializing_if = "Option::is_none")]
pub cursor: Option<S>,
#[serde(skip_serializing_if = "Option::is_none")]
pub detected_query_languages: Option<Vec<S>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub hits_total: Option<i64>,
pub posts: Vec<PostView<S>>,
#[serde(flatten, default, skip_serializing_if = "Option::is_none")]
pub extra_data: Option<BTreeMap<SmolStr, Data<S>>>,
}
#[derive(
Serialize, Deserialize, Debug, Clone, PartialEq, Eq, thiserror::Error, miette::Diagnostic,
)]
#[serde(tag = "error", content = "message")]
pub enum SearchPostsV2Error {
#[serde(rename = "BadQueryString")]
BadQueryString(Option<SmolStr>),
#[serde(untagged)]
Other {
error: SmolStr,
message: Option<SmolStr>,
},
}
impl core::fmt::Display for SearchPostsV2Error {
fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
match self {
Self::BadQueryString(msg) => {
write!(f, "BadQueryString")?;
if let Some(msg) = msg {
write!(f, ": {}", msg)?;
}
Ok(())
}
Self::Other { error, message } => {
write!(f, "{}", error)?;
if let Some(msg) = message {
write!(f, ": {}", msg)?;
}
Ok(())
}
}
}
}
pub struct SearchPostsV2Response;
impl jacquard_common::xrpc::XrpcResp for SearchPostsV2Response {
const NSID: &'static str = "app.bsky.feed.searchPostsV2";
const ENCODING: &'static str = "application/json";
type Output<S: BosStr> = SearchPostsV2Output<S>;
type Err = SearchPostsV2Error;
}
impl<S: BosStr> jacquard_common::xrpc::XrpcRequest for SearchPostsV2<S> {
const NSID: &'static str = "app.bsky.feed.searchPostsV2";
const METHOD: jacquard_common::xrpc::XrpcMethod = jacquard_common::xrpc::XrpcMethod::Query;
type Response = SearchPostsV2Response;
}
pub struct SearchPostsV2Request;
impl jacquard_common::xrpc::XrpcEndpoint for SearchPostsV2Request {
const PATH: &'static str = "/xrpc/app.bsky.feed.searchPostsV2";
const METHOD: jacquard_common::xrpc::XrpcMethod = jacquard_common::xrpc::XrpcMethod::Query;
type Request<S: BosStr> = SearchPostsV2<S>;
type Response = SearchPostsV2Response;
}
fn _default_limit() -> Option<i64> {
Some(25i64)
}
pub mod search_posts_v2_state {
pub use crate::builder_types::{IsSet, IsUnset, Set, Unset};
#[allow(unused)]
use ::core::marker::PhantomData;
mod sealed {
pub trait Sealed {}
}
pub trait State: sealed::Sealed {}
pub struct Empty(());
impl sealed::Sealed for Empty {}
impl State for Empty {}
#[allow(non_camel_case_types)]
pub mod members {}
}
pub struct SearchPostsV2Builder<St: search_posts_v2_state::State, S: BosStr = DefaultStr> {
_state: PhantomData<fn() -> St>,
_fields: (
Option<bool>,
Option<Vec<AtIdentifier<S>>>,
Option<S>,
Option<Vec<S>>,
Option<Vec<AtUri<S>>>,
Option<Vec<AtIdentifier<S>>>,
Option<Vec<S>>,
Option<Vec<AtUri<S>>>,
Option<Vec<S>>,
Option<Vec<Language>>,
Option<Vec<AtIdentifier<S>>>,
Option<bool>,
Option<Vec<UriValue<S>>>,
Option<bool>,
Option<bool>,
Option<bool>,
Option<Vec<S>>,
Option<Vec<Language>>,
Option<i64>,
Option<Vec<AtIdentifier<S>>>,
Option<S>,
Option<S>,
Option<bool>,
Option<AtUri<S>>,
Option<S>,
Option<S>,
Option<AtUri<S>>,
Option<S>,
Option<Vec<UriValue<S>>>,
),
_type: PhantomData<fn() -> S>,
}
impl SearchPostsV2<DefaultStr> {
pub fn new() -> SearchPostsV2Builder<search_posts_v2_state::Empty, DefaultStr> {
SearchPostsV2Builder::new()
}
}
impl<S: BosStr> SearchPostsV2<S> {
pub fn builder() -> SearchPostsV2Builder<search_posts_v2_state::Empty, S> {
SearchPostsV2Builder::builder()
}
}
impl SearchPostsV2Builder<search_posts_v2_state::Empty, DefaultStr> {
pub fn new() -> Self {
SearchPostsV2Builder {
_state: PhantomData,
_fields: (
None, None, None, None, None, None, None, None, None, None, None, None, None, None,
None, None, None, None, None, None, None, None, None, None, None, None, None, None,
None,
),
_type: PhantomData,
}
}
}
impl<S: BosStr> SearchPostsV2Builder<search_posts_v2_state::Empty, S> {
pub fn builder() -> Self {
SearchPostsV2Builder {
_state: PhantomData,
_fields: (
None, None, None, None, None, None, None, None, None, None, None, None, None, None,
None, None, None, None, None, None, None, None, None, None, None, None, None, None,
None,
),
_type: PhantomData,
}
}
}
impl<St: search_posts_v2_state::State, S: BosStr> SearchPostsV2Builder<St, S> {
pub fn all_time(mut self, value: impl Into<Option<bool>>) -> Self {
self._fields.0 = value.into();
self
}
pub fn maybe_all_time(mut self, value: Option<bool>) -> Self {
self._fields.0 = value;
self
}
}
impl<St: search_posts_v2_state::State, S: BosStr> SearchPostsV2Builder<St, S> {
pub fn authors(mut self, value: impl Into<Option<Vec<AtIdentifier<S>>>>) -> Self {
self._fields.1 = value.into();
self
}
pub fn maybe_authors(mut self, value: Option<Vec<AtIdentifier<S>>>) -> Self {
self._fields.1 = value;
self
}
}
impl<St: search_posts_v2_state::State, S: BosStr> SearchPostsV2Builder<St, S> {
pub fn cursor(mut self, value: impl Into<Option<S>>) -> Self {
self._fields.2 = value.into();
self
}
pub fn maybe_cursor(mut self, value: Option<S>) -> Self {
self._fields.2 = value;
self
}
}
impl<St: search_posts_v2_state::State, S: BosStr> SearchPostsV2Builder<St, S> {
pub fn domains(mut self, value: impl Into<Option<Vec<S>>>) -> Self {
self._fields.3 = value.into();
self
}
pub fn maybe_domains(mut self, value: Option<Vec<S>>) -> Self {
self._fields.3 = value;
self
}
}
impl<St: search_posts_v2_state::State, S: BosStr> SearchPostsV2Builder<St, S> {
pub fn embedded_at_uris(mut self, value: impl Into<Option<Vec<AtUri<S>>>>) -> Self {
self._fields.4 = value.into();
self
}
pub fn maybe_embedded_at_uris(mut self, value: Option<Vec<AtUri<S>>>) -> Self {
self._fields.4 = value;
self
}
}
impl<St: search_posts_v2_state::State, S: BosStr> SearchPostsV2Builder<St, S> {
pub fn exclude_authors(mut self, value: impl Into<Option<Vec<AtIdentifier<S>>>>) -> Self {
self._fields.5 = value.into();
self
}
pub fn maybe_exclude_authors(mut self, value: Option<Vec<AtIdentifier<S>>>) -> Self {
self._fields.5 = value;
self
}
}
impl<St: search_posts_v2_state::State, S: BosStr> SearchPostsV2Builder<St, S> {
pub fn exclude_domains(mut self, value: impl Into<Option<Vec<S>>>) -> Self {
self._fields.6 = value.into();
self
}
pub fn maybe_exclude_domains(mut self, value: Option<Vec<S>>) -> Self {
self._fields.6 = value;
self
}
}
impl<St: search_posts_v2_state::State, S: BosStr> SearchPostsV2Builder<St, S> {
pub fn exclude_embedded_at_uris(mut self, value: impl Into<Option<Vec<AtUri<S>>>>) -> Self {
self._fields.7 = value.into();
self
}
pub fn maybe_exclude_embedded_at_uris(mut self, value: Option<Vec<AtUri<S>>>) -> Self {
self._fields.7 = value;
self
}
}
impl<St: search_posts_v2_state::State, S: BosStr> SearchPostsV2Builder<St, S> {
pub fn exclude_hashtags(mut self, value: impl Into<Option<Vec<S>>>) -> Self {
self._fields.8 = value.into();
self
}
pub fn maybe_exclude_hashtags(mut self, value: Option<Vec<S>>) -> Self {
self._fields.8 = value;
self
}
}
impl<St: search_posts_v2_state::State, S: BosStr> SearchPostsV2Builder<St, S> {
pub fn exclude_languages(mut self, value: impl Into<Option<Vec<Language>>>) -> Self {
self._fields.9 = value.into();
self
}
pub fn maybe_exclude_languages(mut self, value: Option<Vec<Language>>) -> Self {
self._fields.9 = value;
self
}
}
impl<St: search_posts_v2_state::State, S: BosStr> SearchPostsV2Builder<St, S> {
pub fn exclude_mentions(mut self, value: impl Into<Option<Vec<AtIdentifier<S>>>>) -> Self {
self._fields.10 = value.into();
self
}
pub fn maybe_exclude_mentions(mut self, value: Option<Vec<AtIdentifier<S>>>) -> Self {
self._fields.10 = value;
self
}
}
impl<St: search_posts_v2_state::State, S: BosStr> SearchPostsV2Builder<St, S> {
pub fn exclude_replies(mut self, value: impl Into<Option<bool>>) -> Self {
self._fields.11 = value.into();
self
}
pub fn maybe_exclude_replies(mut self, value: Option<bool>) -> Self {
self._fields.11 = value;
self
}
}
impl<St: search_posts_v2_state::State, S: BosStr> SearchPostsV2Builder<St, S> {
pub fn exclude_urls(mut self, value: impl Into<Option<Vec<UriValue<S>>>>) -> Self {
self._fields.12 = value.into();
self
}
pub fn maybe_exclude_urls(mut self, value: Option<Vec<UriValue<S>>>) -> Self {
self._fields.12 = value;
self
}
}
impl<St: search_posts_v2_state::State, S: BosStr> SearchPostsV2Builder<St, S> {
pub fn following(mut self, value: impl Into<Option<bool>>) -> Self {
self._fields.13 = value.into();
self
}
pub fn maybe_following(mut self, value: Option<bool>) -> Self {
self._fields.13 = value;
self
}
}
impl<St: search_posts_v2_state::State, S: BosStr> SearchPostsV2Builder<St, S> {
pub fn has_media(mut self, value: impl Into<Option<bool>>) -> Self {
self._fields.14 = value.into();
self
}
pub fn maybe_has_media(mut self, value: Option<bool>) -> Self {
self._fields.14 = value;
self
}
}
impl<St: search_posts_v2_state::State, S: BosStr> SearchPostsV2Builder<St, S> {
pub fn has_video(mut self, value: impl Into<Option<bool>>) -> Self {
self._fields.15 = value.into();
self
}
pub fn maybe_has_video(mut self, value: Option<bool>) -> Self {
self._fields.15 = value;
self
}
}
impl<St: search_posts_v2_state::State, S: BosStr> SearchPostsV2Builder<St, S> {
pub fn hashtags(mut self, value: impl Into<Option<Vec<S>>>) -> Self {
self._fields.16 = value.into();
self
}
pub fn maybe_hashtags(mut self, value: Option<Vec<S>>) -> Self {
self._fields.16 = value;
self
}
}
impl<St: search_posts_v2_state::State, S: BosStr> SearchPostsV2Builder<St, S> {
pub fn languages(mut self, value: impl Into<Option<Vec<Language>>>) -> Self {
self._fields.17 = value.into();
self
}
pub fn maybe_languages(mut self, value: Option<Vec<Language>>) -> Self {
self._fields.17 = value;
self
}
}
impl<St: search_posts_v2_state::State, S: BosStr> SearchPostsV2Builder<St, S> {
pub fn limit(mut self, value: impl Into<Option<i64>>) -> Self {
self._fields.18 = value.into();
self
}
pub fn maybe_limit(mut self, value: Option<i64>) -> Self {
self._fields.18 = value;
self
}
}
impl<St: search_posts_v2_state::State, S: BosStr> SearchPostsV2Builder<St, S> {
pub fn mentions(mut self, value: impl Into<Option<Vec<AtIdentifier<S>>>>) -> Self {
self._fields.19 = value.into();
self
}
pub fn maybe_mentions(mut self, value: Option<Vec<AtIdentifier<S>>>) -> Self {
self._fields.19 = value;
self
}
}
impl<St: search_posts_v2_state::State, S: BosStr> SearchPostsV2Builder<St, S> {
pub fn query(mut self, value: impl Into<Option<S>>) -> Self {
self._fields.20 = value.into();
self
}
pub fn maybe_query(mut self, value: Option<S>) -> Self {
self._fields.20 = value;
self
}
}
impl<St: search_posts_v2_state::State, S: BosStr> SearchPostsV2Builder<St, S> {
pub fn query_language(mut self, value: impl Into<Option<S>>) -> Self {
self._fields.21 = value.into();
self
}
pub fn maybe_query_language(mut self, value: Option<S>) -> Self {
self._fields.21 = value;
self
}
}
impl<St: search_posts_v2_state::State, S: BosStr> SearchPostsV2Builder<St, S> {
pub fn replies_only(mut self, value: impl Into<Option<bool>>) -> Self {
self._fields.22 = value.into();
self
}
pub fn maybe_replies_only(mut self, value: Option<bool>) -> Self {
self._fields.22 = value;
self
}
}
impl<St: search_posts_v2_state::State, S: BosStr> SearchPostsV2Builder<St, S> {
pub fn reply_parent_uri(mut self, value: impl Into<Option<AtUri<S>>>) -> Self {
self._fields.23 = value.into();
self
}
pub fn maybe_reply_parent_uri(mut self, value: Option<AtUri<S>>) -> Self {
self._fields.23 = value;
self
}
}
impl<St: search_posts_v2_state::State, S: BosStr> SearchPostsV2Builder<St, S> {
pub fn since(mut self, value: impl Into<Option<S>>) -> Self {
self._fields.24 = value.into();
self
}
pub fn maybe_since(mut self, value: Option<S>) -> Self {
self._fields.24 = value;
self
}
}
impl<St: search_posts_v2_state::State, S: BosStr> SearchPostsV2Builder<St, S> {
pub fn sort(mut self, value: impl Into<Option<S>>) -> Self {
self._fields.25 = value.into();
self
}
pub fn maybe_sort(mut self, value: Option<S>) -> Self {
self._fields.25 = value;
self
}
}
impl<St: search_posts_v2_state::State, S: BosStr> SearchPostsV2Builder<St, S> {
pub fn thread_root_uri(mut self, value: impl Into<Option<AtUri<S>>>) -> Self {
self._fields.26 = value.into();
self
}
pub fn maybe_thread_root_uri(mut self, value: Option<AtUri<S>>) -> Self {
self._fields.26 = value;
self
}
}
impl<St: search_posts_v2_state::State, S: BosStr> SearchPostsV2Builder<St, S> {
pub fn until(mut self, value: impl Into<Option<S>>) -> Self {
self._fields.27 = value.into();
self
}
pub fn maybe_until(mut self, value: Option<S>) -> Self {
self._fields.27 = value;
self
}
}
impl<St: search_posts_v2_state::State, S: BosStr> SearchPostsV2Builder<St, S> {
pub fn urls(mut self, value: impl Into<Option<Vec<UriValue<S>>>>) -> Self {
self._fields.28 = value.into();
self
}
pub fn maybe_urls(mut self, value: Option<Vec<UriValue<S>>>) -> Self {
self._fields.28 = value;
self
}
}
impl<St, S: BosStr> SearchPostsV2Builder<St, S>
where
St: search_posts_v2_state::State,
{
pub fn build(self) -> SearchPostsV2<S> {
SearchPostsV2 {
all_time: self._fields.0,
authors: self._fields.1,
cursor: self._fields.2,
domains: self._fields.3,
embedded_at_uris: self._fields.4,
exclude_authors: self._fields.5,
exclude_domains: self._fields.6,
exclude_embedded_at_uris: self._fields.7,
exclude_hashtags: self._fields.8,
exclude_languages: self._fields.9,
exclude_mentions: self._fields.10,
exclude_replies: self._fields.11,
exclude_urls: self._fields.12,
following: self._fields.13,
has_media: self._fields.14,
has_video: self._fields.15,
hashtags: self._fields.16,
languages: self._fields.17,
limit: self._fields.18,
mentions: self._fields.19,
query: self._fields.20,
query_language: self._fields.21,
replies_only: self._fields.22,
reply_parent_uri: self._fields.23,
since: self._fields.24,
sort: self._fields.25,
thread_root_uri: self._fields.26,
until: self._fields.27,
urls: self._fields.28,
}
}
}