apalis-sqlite 1.0.0-rc.7

Background task processing for rust using apalis and sqlite
Documentation
use apalis_sql::{DateTime, DateTimeExt, TaskRow};

#[derive(Debug)]
pub(crate) struct SqliteTaskRow {
    pub(crate) job: Vec<u8>,
    pub(crate) id: Option<String>,
    pub(crate) job_type: Option<String>,
    pub(crate) status: Option<String>,
    pub(crate) attempts: Option<i64>,
    pub(crate) max_attempts: Option<i64>,
    pub(crate) run_at: Option<i64>,
    pub(crate) last_result: Option<String>,
    pub(crate) lock_at: Option<i64>,
    pub(crate) lock_by: Option<String>,
    pub(crate) done_at: Option<i64>,
    pub(crate) priority: Option<i64>,
    pub(crate) metadata: Option<String>,
}

impl TryInto<TaskRow> for SqliteTaskRow {
    type Error = sqlx::Error;

    fn try_into(self) -> Result<TaskRow, Self::Error> {
        Ok(TaskRow {
            job: self.job,
            id: self
                .id
                .ok_or_else(|| sqlx::Error::Protocol("Missing id".into()))?,
            job_type: self
                .job_type
                .ok_or_else(|| sqlx::Error::Protocol("Missing job_type".into()))?,
            status: self
                .status
                .ok_or_else(|| sqlx::Error::Protocol("Missing status".into()))?,
            attempts: self
                .attempts
                .ok_or_else(|| sqlx::Error::Protocol("Missing attempts".into()))?
                as usize,
            max_attempts: self.max_attempts.map(|v| v as usize),
            run_at: self
                .run_at
                .map(<DateTime as DateTimeExt>::from_unix_timestamp),
            last_result: self
                .last_result
                .map(|res| serde_json::from_str(&res).unwrap_or(serde_json::Value::Null)),
            lock_at: self
                .lock_at
                .map(<DateTime as DateTimeExt>::from_unix_timestamp),
            lock_by: self.lock_by,
            done_at: self
                .done_at
                .map(<DateTime as DateTimeExt>::from_unix_timestamp),
            priority: self.priority.map(|v| v as usize),
            metadata: self
                .metadata
                .map(|meta| serde_json::from_str(&meta).unwrap_or(serde_json::Value::Null)),
        })
    }
}