Skip to main content

durable/
lib.rs

1pub mod ctx;
2pub mod error;
3pub mod executor;
4
5pub use ctx::Ctx;
6pub use ctx::RetryPolicy;
7pub use ctx::{TaskQuery, TaskSort, TaskSummary};
8pub use durable_db::entity::task::TaskStatus;
9pub use durable_macros::{step, workflow};
10pub use error::DurableError;
11pub use executor::{Executor, HeartbeatConfig, RecoveredTask};
12pub use sea_orm::DatabaseTransaction;
13
14use sea_orm::{ConnectOptions, ConnectionTrait, Database, DatabaseConnection, DbBackend, Statement};
15use sea_orm_migration::MigratorTrait;
16
17/// Initialize durable: connect to Postgres and run migrations.
18///
19/// ```ignore
20/// let db = durable::init("postgres://localhost/mydb").await?;
21/// ```
22pub async fn init(database_url: &str) -> Result<DatabaseConnection, DurableError> {
23    let opt = ConnectOptions::new(database_url);
24    let db = Database::connect(opt).await?;
25
26    // Run migrations
27    durable_db::Migrator::up(&db, None).await?;
28
29    // Add `durable` schema to search_path so Postgres resolves the
30    // `task_status` enum type without a schema prefix (required by SeaORM's
31    // generated CAST expressions).
32    db.execute(Statement::from_string(
33        DbBackend::Postgres,
34        "SET search_path TO public, durable".to_string(),
35    ))
36    .await?;
37
38    tracing::info!("durable initialized");
39    Ok(db)
40}