graphile_worker 0.13.2

High performance Rust/PostgreSQL job queue (also suitable for getting jobs generated by PostgreSQL triggers/functions out into a different work queue)
Documentation
use chrono::{DateTime, Local, Utc};
use graphile_worker::{DbJob, DbJobData};
use graphile_worker_crontab_runner::KnownCrontab;
use sqlx::postgres::{PgArguments, PgRow};
use sqlx::query::{Query, QueryAs, QueryScalar};
use sqlx::{FromRow, Postgres, Row};

pub fn safe_query(sql: impl Into<String>) -> Query<'static, Postgres, PgArguments> {
    sqlx::query(sqlx::AssertSqlSafe(sql.into()))
}

pub fn safe_query_as<T>(sql: impl Into<String>) -> QueryAs<'static, Postgres, T, PgArguments>
where
    T: for<'row> FromRow<'row, PgRow>,
{
    sqlx::query_as(sqlx::AssertSqlSafe(sql.into()))
}

pub fn safe_query_scalar<T>(
    sql: impl Into<String>,
) -> QueryScalar<'static, Postgres, T, PgArguments>
where
    (T,): for<'row> FromRow<'row, PgRow>,
{
    sqlx::query_scalar(sqlx::AssertSqlSafe(sql.into()))
}

pub(super) fn db_job_from_sqlx_row(row: PgRow) -> DbJob {
    DbJob::from_data(DbJobData {
        id: row.get("id"),
        job_queue_id: row.get("job_queue_id"),
        payload: row.get("payload"),
        priority: row.get("priority"),
        run_at: row.get("run_at"),
        attempts: row.get("attempts"),
        max_attempts: row.get("max_attempts"),
        last_error: row.get("last_error"),
        created_at: row.get("created_at"),
        updated_at: row.get("updated_at"),
        key: row.get("key"),
        revision: row.get("revision"),
        locked_at: row.get("locked_at"),
        locked_by: row.get("locked_by"),
        flags: row.get("flags"),
        task_id: row.get("task_id"),
    })
}

pub(super) fn known_crontab_from_sqlx_row(row: PgRow) -> KnownCrontab {
    let known_since: DateTime<Utc> = row.get("known_since");
    let last_execution: Option<DateTime<Utc>> = row.get("last_execution");

    KnownCrontab::new(
        row.get("identifier"),
        known_since.with_timezone(&Local),
        last_execution.map(|value| value.with_timezone(&Local)),
    )
}