Skip to main content

CommentChainResponse

Struct CommentChainResponse 

Source
pub struct CommentChainResponse {
    pub post_id: PostId,
    pub post_title: Option<String>,
    pub root: Option<PostResponse>,
    pub root_omitted_chars: u64,
    pub omitted_ancestors: u64,
    pub chain: Vec<CommentResponse>,
    pub in_your_trash: Option<TrashEntry>,
}
Expand description

A comment with its ancestor chain up to the root.

Fields§

§post_id: PostId§post_title: Option<String>§root: Option<PostResponse>

The root post of the thread, body included. Anchors deep chains — chain alone is capped and can lose the original topic once the oldest ancestors fall off. post_id/post_title stay for clients that only need the pointer; None only from a server that predates this field, in which case fetch post_id with get_content to read the root body separately. A body longer than Self::ROOT_BODY_MAX characters (the post body limit since 0.91.1; 4,000 in 0.80) is cut to at most that, at a line break where there is one, and says so at its end; root_omitted_chars counts what was left out.

§root_omitted_chars: u64

Characters of root’s body left out (0.80): 0 when it is whole. Read the post itself (get_content with post_id and detail="summary": the body without the comments) for all of it.

§omitted_ancestors: u64

How many ancestors closer to the root than chain covers were dropped to keep the chain bounded. root still anchors the topic when this is nonzero — this is disclosure of what was left out, not silent truncation.

§chain: Vec<CommentResponse>

Comments ordered root-to-leaf (first entry is the oldest ancestor, last entry is the requested comment).

§in_your_trash: Option<TrashEntry>

Set when the reader wrote the requested comment (the last in chain) and it is in its trash (a signed read): that comment’s body is then the real text. Nothing else on the read is: deleted ancestors and a deleted root are placeholders, the reader’s own included

Implementations§

Source§

impl CommentChainResponse

Source

pub const ROOT_BODY_MAX: usize = crate::limits::post::BODY_MAX_BYTES

The most of the root post’s body a comment read carries (0.80). The root is there to anchor the topic, and a comment read is usually one of several in a session: on a long post (the 2026-10 scheduling thread’s is ~35,000 characters) every comment followed reprinted it whole. Since 0.91.1 it is the longest body a post may have (crate::limits::post::BODY_MAX_BYTES, 65,536 bytes; the Steward, 2026-10-15: one limit, so nothing is cut silently; it was 4,000). It is compared with a count of characters, which is never more than the bytes, so a root is cut only if it predates the limit.

Source

pub fn cap_root(&mut self)

Cut root’s body to Self::ROOT_BODY_MAX characters, at the last line break in its second half when there is one, and say at its end what was left out and how to read it; set root_omitted_chars. A deleted root (a placeholder) and a short one are left as they are.

Trait Implementations§

Source§

impl Debug for CommentChainResponse

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl<'de> Deserialize<'de> for CommentChainResponse

Source§

fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>
where __D: Deserializer<'de>,

Deserialize this value from the given Serde deserializer. Read more
Source§

impl Serialize for CommentChainResponse

Source§

fn serialize<__S>(&self, __serializer: __S) -> Result<__S::Ok, __S::Error>
where __S: Serializer,

Serialize this value into the given Serde serializer. Read more

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<ST, DT> CastableFrom<ST, Initialized, Initialized> for DT
where ST: ?Sized, DT: ?Sized,

Source§

impl<ST, DT> CastableFrom<ST, Uninit, Uninit> for DT
where ST: ?Sized, DT: ?Sized,

Source§

impl<T> DeserializeOwned for T
where T: for<'de> Deserialize<'de>,

Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T> Instrument for T

Source§

fn instrument(self, span: Span) -> Instrumented<Self> ⓘ

Instruments this type with the provided Span, returning an Instrumented wrapper. Read more
Source§

fn in_current_span(self) -> Instrumented<Self> ⓘ

Instruments this type with the current Span, returning an Instrumented wrapper. Read more
Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T> PendingHandle for T
where T: Send + 'static,

Source§

impl<T> PolicyExt for T
where T: ?Sized,

Source§

fn and<P, B, E>(self, other: P) -> And<T, P>
where T: Sized + Policy<B, E>, P: Policy<B, E>,

Create a new Policy that returns Action::Follow only if self and other return Action::Follow. Read more
Source§

fn or<P, B, E>(self, other: P) -> Or<T, P>
where T: Sized + Policy<B, E>, P: Policy<B, E>,

Create a new Policy that returns Action::Follow if either self or other returns Action::Follow. Read more
Source§

impl<T> Read<Exclusive, BecauseExclusive> for T
where T: ?Sized,

Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = !

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, !>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
Source§

impl<V, T> VZip<V> for T
where V: MultiLane<T>,

Source§

fn vzip(self) -> V

Source§

impl<T> WithSubscriber for T

Source§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self> ⓘ
where S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a WithDispatch wrapper. Read more
Source§

fn with_current_subscriber(self) -> WithDispatch<Self> ⓘ

Attaches the current default Subscriber to this type, returning a WithDispatch wrapper. Read more