aide_de_camp_sqlite/
types.rs

1use aide_de_camp::core::{Bytes, DateTime, Xid};
2use sqlx::sqlite::SqliteRow;
3use sqlx::{Error, FromRow, Row};
4use std::str::FromStr;
5
6#[derive(Debug)]
7pub(crate) struct JobRow {
8    pub jid: Xid,
9    pub job_type: String,
10    pub payload: Bytes,
11    pub retries: u32,
12    pub scheduled_at: DateTime,
13    pub enqueued_at: DateTime,
14}
15
16impl<'r> FromRow<'r, SqliteRow> for JobRow {
17    fn from_row(row: &'r SqliteRow) -> Result<Self, Error> {
18        let jid = row
19            .try_get("jid")
20            .map(Xid::from_str)?
21            .map_err(|xid_err| Error::Decode(Box::new(xid_err)))?;
22        let job_type = row.try_get("job_type")?;
23        let payload = row.try_get::<Vec<u8>, _>("payload").map(Bytes::from)?;
24        // Retry count is incremented every time job is checked out from the queue.
25        // We decrement it by one to “real” retry count.
26        let retries: u32 = row.try_get("retries").map(|r: u32| r - 1)?;
27        let scheduled_at = row.try_get("scheduled_at")?;
28        let enqueued_at = row.try_get("enqueued_at")?;
29        Ok(Self {
30            jid,
31            job_type,
32            payload,
33            retries,
34            scheduled_at,
35            enqueued_at,
36        })
37    }
38}