pub struct ContentStorageAdapter { /* private fields */ }Expand description
Adapts DbPool + posting queue to the ContentStorage port trait.
Implementations§
Source§impl ContentStorageAdapter
impl ContentStorageAdapter
pub fn new(pool: DbPool, post_tx: Sender<PostAction>) -> Self
Trait Implementations§
Source§impl ContentStorage for ContentStorageAdapter
impl ContentStorage for ContentStorageAdapter
Source§fn last_tweet_time<'life0, 'async_trait>(
&'life0 self,
) -> Pin<Box<dyn Future<Output = Result<Option<DateTime<Utc>>, ContentLoopError>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
fn last_tweet_time<'life0, 'async_trait>(
&'life0 self,
) -> Pin<Box<dyn Future<Output = Result<Option<DateTime<Utc>>, ContentLoopError>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
Get the timestamp of the most recent posted tweet.
Source§fn todays_tweet_times<'life0, 'async_trait>(
&'life0 self,
) -> Pin<Box<dyn Future<Output = Result<Vec<DateTime<Utc>>, ContentLoopError>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
fn todays_tweet_times<'life0, 'async_trait>(
&'life0 self,
) -> Pin<Box<dyn Future<Output = Result<Vec<DateTime<Utc>>, ContentLoopError>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
Get the timestamps of all tweets posted today (for slot-based scheduling).
Source§fn last_thread_time<'life0, 'async_trait>(
&'life0 self,
) -> Pin<Box<dyn Future<Output = Result<Option<DateTime<Utc>>, ContentLoopError>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
fn last_thread_time<'life0, 'async_trait>(
&'life0 self,
) -> Pin<Box<dyn Future<Output = Result<Option<DateTime<Utc>>, ContentLoopError>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
Get the timestamp of the most recent posted thread.
Source§fn post_tweet<'life0, 'life1, 'life2, 'async_trait>(
&'life0 self,
topic: &'life1 str,
content: &'life2 str,
) -> Pin<Box<dyn Future<Output = Result<(), ContentLoopError>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
'life2: 'async_trait,
fn post_tweet<'life0, 'life1, 'life2, 'async_trait>(
&'life0 self,
topic: &'life1 str,
content: &'life2 str,
) -> Pin<Box<dyn Future<Output = Result<(), ContentLoopError>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
'life2: 'async_trait,
Post a tweet (sends to posting queue and records in DB).
Source§fn create_thread<'life0, 'life1, 'async_trait>(
&'life0 self,
topic: &'life1 str,
tweet_count: usize,
) -> Pin<Box<dyn Future<Output = Result<String, ContentLoopError>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
fn create_thread<'life0, 'life1, 'async_trait>(
&'life0 self,
topic: &'life1 str,
tweet_count: usize,
) -> Pin<Box<dyn Future<Output = Result<String, ContentLoopError>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
Create a thread record in the database. Returns the thread ID.
Source§fn update_thread_status<'life0, 'life1, 'life2, 'life3, 'async_trait>(
&'life0 self,
thread_id: &'life1 str,
status: &'life2 str,
tweet_count: usize,
root_tweet_id: Option<&'life3 str>,
) -> Pin<Box<dyn Future<Output = Result<(), ContentLoopError>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
'life2: 'async_trait,
'life3: 'async_trait,
fn update_thread_status<'life0, 'life1, 'life2, 'life3, 'async_trait>(
&'life0 self,
thread_id: &'life1 str,
status: &'life2 str,
tweet_count: usize,
root_tweet_id: Option<&'life3 str>,
) -> Pin<Box<dyn Future<Output = Result<(), ContentLoopError>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
'life2: 'async_trait,
'life3: 'async_trait,
Update thread status (pending, posting, sent, partial).
Source§fn store_thread_tweet<'life0, 'life1, 'life2, 'life3, 'async_trait>(
&'life0 self,
thread_id: &'life1 str,
position: usize,
tweet_id: &'life2 str,
content: &'life3 str,
) -> Pin<Box<dyn Future<Output = Result<(), ContentLoopError>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
'life2: 'async_trait,
'life3: 'async_trait,
fn store_thread_tweet<'life0, 'life1, 'life2, 'life3, 'async_trait>(
&'life0 self,
thread_id: &'life1 str,
position: usize,
tweet_id: &'life2 str,
content: &'life3 str,
) -> Pin<Box<dyn Future<Output = Result<(), ContentLoopError>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
'life2: 'async_trait,
'life3: 'async_trait,
Record a thread tweet (position in reply chain).
Source§fn log_action<'life0, 'life1, 'life2, 'life3, 'async_trait>(
&'life0 self,
action_type: &'life1 str,
status: &'life2 str,
message: &'life3 str,
) -> Pin<Box<dyn Future<Output = Result<(), ContentLoopError>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
'life2: 'async_trait,
'life3: 'async_trait,
fn log_action<'life0, 'life1, 'life2, 'life3, 'async_trait>(
&'life0 self,
action_type: &'life1 str,
status: &'life2 str,
message: &'life3 str,
) -> Pin<Box<dyn Future<Output = Result<(), ContentLoopError>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
'life2: 'async_trait,
'life3: 'async_trait,
Log an action to the audit trail.
Source§fn next_scheduled_item<'life0, 'async_trait>(
&'life0 self,
) -> Pin<Box<dyn Future<Output = Result<Option<(i64, String, String)>, ContentLoopError>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
fn next_scheduled_item<'life0, 'async_trait>(
&'life0 self,
) -> Pin<Box<dyn Future<Output = Result<Option<(i64, String, String)>, ContentLoopError>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
Check for scheduled content that is due for posting. Read more
Source§fn mark_scheduled_posted<'life0, 'life1, 'async_trait>(
&'life0 self,
id: i64,
tweet_id: Option<&'life1 str>,
) -> Pin<Box<dyn Future<Output = Result<(), ContentLoopError>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
fn mark_scheduled_posted<'life0, 'life1, 'async_trait>(
&'life0 self,
id: i64,
tweet_id: Option<&'life1 str>,
) -> Pin<Box<dyn Future<Output = Result<(), ContentLoopError>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
Mark a scheduled content item as posted.
Source§fn mark_failed_permanent<'life0, 'life1, 'life2, 'async_trait>(
&'life0 self,
thread_id: &'life1 str,
error: &'life2 str,
) -> Pin<Box<dyn Future<Output = Result<(), ContentLoopError>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
'life2: 'async_trait,
fn mark_failed_permanent<'life0, 'life1, 'life2, 'async_trait>(
&'life0 self,
thread_id: &'life1 str,
error: &'life2 str,
) -> Pin<Box<dyn Future<Output = Result<(), ContentLoopError>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
'life2: 'async_trait,
Mark a thread as permanently failed (no more retries).
Stores error reason and failure timestamp.
Source§fn increment_retry<'life0, 'life1, 'life2, 'async_trait>(
&'life0 self,
thread_id: &'life1 str,
error: &'life2 str,
) -> Pin<Box<dyn Future<Output = Result<u32, ContentLoopError>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
'life2: 'async_trait,
fn increment_retry<'life0, 'life1, 'life2, 'async_trait>(
&'life0 self,
thread_id: &'life1 str,
error: &'life2 str,
) -> Pin<Box<dyn Future<Output = Result<u32, ContentLoopError>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
'life2: 'async_trait,
Increment retry count for a thread (for transient failures).
Returns the new retry count; implementation tracks failure_kind=‘transient’.
Auto Trait Implementations§
impl Freeze for ContentStorageAdapter
impl !RefUnwindSafe for ContentStorageAdapter
impl Send for ContentStorageAdapter
impl Sync for ContentStorageAdapter
impl Unpin for ContentStorageAdapter
impl UnsafeUnpin for ContentStorageAdapter
impl !UnwindSafe for ContentStorageAdapter
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Mutably borrows from an owned value. Read more
Source§impl<T> Instrument for T
impl<T> Instrument for T
Source§fn instrument(self, span: Span) -> Instrumented<Self>
fn instrument(self, span: Span) -> Instrumented<Self>
Source§fn in_current_span(self) -> Instrumented<Self>
fn in_current_span(self) -> Instrumented<Self>
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self>
fn into_either(self, into_left: bool) -> Either<Self, Self>
Converts
self into a Left variant of Either<Self, Self>
if into_left is true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
Converts
self into a Left variant of Either<Self, Self>
if into_left(&self) returns true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read more