#[allow(unused_imports)]
use alloc::collections::BTreeMap;
#[allow(unused_imports)]
use core::marker::PhantomData;
use jacquard_common::{BosStr, CowStr, DefaultStr, FromStaticStr};
#[allow(unused_imports)]
use jacquard_common::deps::codegen::unicode_segmentation::UnicodeSegmentation;
use jacquard_common::deps::smol_str::SmolStr;
use jacquard_common::types::collection::{Collection, RecordError};
use jacquard_common::types::string::{AtUri, Cid, Datetime};
use jacquard_common::types::uri::{RecordUri, UriError};
use jacquard_common::types::value::Data;
use jacquard_common::xrpc::XrpcResp;
use jacquard_derive::{IntoStatic, lexicon};
use jacquard_lexicon::lexicon::LexiconDoc;
use jacquard_lexicon::schema::LexiconSchema;
use crate::com_atproto::repo::strong_ref::StrongRef;
use crate::fyi_frontpage::richtext::block::Block;
#[allow(unused_imports)]
use jacquard_lexicon::validation::{ConstraintError, ValidationPath};
use serde::{Deserialize, Serialize};
#[derive(Serialize, Deserialize, Debug, Clone, PartialEq, Eq, IntoStatic)]
#[serde(
rename_all = "camelCase",
rename = "fyi.frontpage.feed.comment",
tag = "$type",
bound(deserialize = "S: Deserialize<'de> + BosStr")
)]
pub struct Comment<S: BosStr = DefaultStr> {
pub blocks: Vec<Block<S>>,
pub created_at: Datetime,
#[serde(skip_serializing_if = "Option::is_none")]
pub parent: Option<StrongRef<S>>,
pub post: StrongRef<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, IntoStatic)]
#[serde(rename_all = "camelCase")]
pub struct CommentGetRecordOutput<S: BosStr = DefaultStr> {
#[serde(skip_serializing_if = "Option::is_none")]
pub cid: Option<Cid<S>>,
pub uri: AtUri<S>,
pub value: Comment<S>,
}
impl<S: BosStr> Comment<S> {
pub fn uri(uri: S) -> Result<RecordUri<S, CommentRecord>, UriError> {
RecordUri::try_from_uri(AtUri::new(uri)?)
}
}
#[derive(Debug, Serialize, Deserialize)]
pub struct CommentRecord;
impl XrpcResp for CommentRecord {
const NSID: &'static str = "fyi.frontpage.feed.comment";
const ENCODING: &'static str = "application/json";
type Output<S: BosStr> = CommentGetRecordOutput<S>;
type Err = RecordError;
}
impl<S: BosStr> From<CommentGetRecordOutput<S>> for Comment<S> {
fn from(output: CommentGetRecordOutput<S>) -> Self {
output.value
}
}
impl<S: BosStr> Collection for Comment<S> {
const NSID: &'static str = "fyi.frontpage.feed.comment";
type Record = CommentRecord;
}
impl Collection for CommentRecord {
const NSID: &'static str = "fyi.frontpage.feed.comment";
type Record = CommentRecord;
}
impl<S: BosStr> LexiconSchema for Comment<S> {
fn nsid() -> &'static str {
"fyi.frontpage.feed.comment"
}
fn def_name() -> &'static str {
"main"
}
fn lexicon_doc() -> LexiconDoc<'static> {
lexicon_doc_fyi_frontpage_feed_comment()
}
fn validate(&self) -> Result<(), ConstraintError> {
{
let value = &self.blocks;
#[allow(unused_comparisons)]
if value.len() > 200usize {
return Err(ConstraintError::MaxLength {
path: ValidationPath::from_field("blocks"),
max: 200usize,
actual: value.len(),
});
}
}
Ok(())
}
}
pub mod comment_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 {
type Blocks;
type CreatedAt;
type Post;
}
pub struct Empty(());
impl sealed::Sealed for Empty {}
impl State for Empty {
type Blocks = Unset;
type CreatedAt = Unset;
type Post = Unset;
}
pub struct SetBlocks<St: State = Empty>(PhantomData<fn() -> St>);
impl<St: State> sealed::Sealed for SetBlocks<St> {}
impl<St: State> State for SetBlocks<St> {
type Blocks = Set<members::blocks>;
type CreatedAt = St::CreatedAt;
type Post = St::Post;
}
pub struct SetCreatedAt<St: State = Empty>(PhantomData<fn() -> St>);
impl<St: State> sealed::Sealed for SetCreatedAt<St> {}
impl<St: State> State for SetCreatedAt<St> {
type Blocks = St::Blocks;
type CreatedAt = Set<members::created_at>;
type Post = St::Post;
}
pub struct SetPost<St: State = Empty>(PhantomData<fn() -> St>);
impl<St: State> sealed::Sealed for SetPost<St> {}
impl<St: State> State for SetPost<St> {
type Blocks = St::Blocks;
type CreatedAt = St::CreatedAt;
type Post = Set<members::post>;
}
#[allow(non_camel_case_types)]
pub mod members {
pub struct blocks(());
pub struct created_at(());
pub struct post(());
}
}
pub struct CommentBuilder<S: BosStr, St: comment_state::State> {
_state: PhantomData<fn() -> St>,
_fields: (
Option<Vec<Block<S>>>,
Option<Datetime>,
Option<StrongRef<S>>,
Option<StrongRef<S>>,
),
_type: PhantomData<fn() -> S>,
}
impl<S: BosStr> Comment<S> {
pub fn new() -> CommentBuilder<S, comment_state::Empty> {
CommentBuilder::new()
}
}
impl<S: BosStr> CommentBuilder<S, comment_state::Empty> {
pub fn new() -> Self {
CommentBuilder {
_state: PhantomData,
_fields: (None, None, None, None),
_type: PhantomData,
}
}
}
impl<S: BosStr, St> CommentBuilder<S, St>
where
St: comment_state::State,
St::Blocks: comment_state::IsUnset,
{
pub fn blocks(
mut self,
value: impl Into<Vec<Block<S>>>,
) -> CommentBuilder<S, comment_state::SetBlocks<St>> {
self._fields.0 = Option::Some(value.into());
CommentBuilder {
_state: PhantomData,
_fields: self._fields,
_type: PhantomData,
}
}
}
impl<S: BosStr, St> CommentBuilder<S, St>
where
St: comment_state::State,
St::CreatedAt: comment_state::IsUnset,
{
pub fn created_at(
mut self,
value: impl Into<Datetime>,
) -> CommentBuilder<S, comment_state::SetCreatedAt<St>> {
self._fields.1 = Option::Some(value.into());
CommentBuilder {
_state: PhantomData,
_fields: self._fields,
_type: PhantomData,
}
}
}
impl<S: BosStr, St: comment_state::State> CommentBuilder<S, St> {
pub fn parent(mut self, value: impl Into<Option<StrongRef<S>>>) -> Self {
self._fields.2 = value.into();
self
}
pub fn maybe_parent(mut self, value: Option<StrongRef<S>>) -> Self {
self._fields.2 = value;
self
}
}
impl<S: BosStr, St> CommentBuilder<S, St>
where
St: comment_state::State,
St::Post: comment_state::IsUnset,
{
pub fn post(
mut self,
value: impl Into<StrongRef<S>>,
) -> CommentBuilder<S, comment_state::SetPost<St>> {
self._fields.3 = Option::Some(value.into());
CommentBuilder {
_state: PhantomData,
_fields: self._fields,
_type: PhantomData,
}
}
}
impl<S: BosStr, St> CommentBuilder<S, St>
where
St: comment_state::State,
St::Blocks: comment_state::IsSet,
St::CreatedAt: comment_state::IsSet,
St::Post: comment_state::IsSet,
{
pub fn build(self) -> Comment<S> {
Comment {
blocks: self._fields.0.unwrap(),
created_at: self._fields.1.unwrap(),
parent: self._fields.2,
post: self._fields.3.unwrap(),
extra_data: Default::default(),
}
}
pub fn build_with_data(self, extra_data: BTreeMap<SmolStr, Data<S>>) -> Comment<S> {
Comment {
blocks: self._fields.0.unwrap(),
created_at: self._fields.1.unwrap(),
parent: self._fields.2,
post: self._fields.3.unwrap(),
extra_data: Some(extra_data),
}
}
}
fn lexicon_doc_fyi_frontpage_feed_comment() -> LexiconDoc<'static> {
use alloc::collections::BTreeMap;
#[allow(unused_imports)]
use jacquard_common::{CowStr, deps::smol_str::SmolStr, types::blob::MimeType};
use jacquard_lexicon::lexicon::*;
LexiconDoc {
lexicon: Lexicon::Lexicon1,
id: CowStr::new_static("fyi.frontpage.feed.comment"),
defs: {
let mut map = BTreeMap::new();
map.insert(
SmolStr::new_static("main"),
LexUserType::Record(LexRecord {
description: Some(
CowStr::new_static("Record containing a Frontpage comment."),
),
key: Some(CowStr::new_static("tid")),
record: LexRecordRecord::Object(LexObject {
required: Some(
vec![
SmolStr::new_static("createdAt"),
SmolStr::new_static("post"), SmolStr::new_static("blocks")
],
),
properties: {
#[allow(unused_mut)]
let mut map = BTreeMap::new();
map.insert(
SmolStr::new_static("blocks"),
LexObjectProperty::Array(LexArray {
description: Some(
CowStr::new_static(
"The content of the comment. Note, there are additional constraints placed on the total size of the content within the Frontpage AppView that are not possible to express in lexicon. Generally a comment can have a maximum length of 10,000 graphemes, the Frontpage AppView will enforce this limit.",
),
),
items: LexArrayItem::Ref(LexRef {
r#ref: CowStr::new_static("fyi.frontpage.richtext.block"),
..Default::default()
}),
max_length: Some(200usize),
..Default::default()
}),
);
map.insert(
SmolStr::new_static("createdAt"),
LexObjectProperty::String(LexString {
description: Some(
CowStr::new_static(
"Client-declared timestamp when this comment was originally created.",
),
),
format: Some(LexStringFormat::Datetime),
..Default::default()
}),
);
map.insert(
SmolStr::new_static("parent"),
LexObjectProperty::Ref(LexRef {
r#ref: CowStr::new_static("com.atproto.repo.strongRef"),
..Default::default()
}),
);
map.insert(
SmolStr::new_static("post"),
LexObjectProperty::Ref(LexRef {
r#ref: CowStr::new_static("com.atproto.repo.strongRef"),
..Default::default()
}),
);
map
},
..Default::default()
}),
..Default::default()
}),
);
map
},
..Default::default()
}
}