use std::sync::Arc;
use axum::{routing::get, Router};
use rust_viewflow::{
api::axum::create_router, migrate_sqlite, DefaultWorkflowApi, DefaultWorkflowEngine,
LeaveRequestWorkflow, SqliteDatabase,
};
use sqlx::SqlitePool;
use tokio::net::TcpListener;
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error + Send + Sync>> {
let pool = SqlitePool::connect("sqlite::memory:").await?;
migrate_sqlite(&pool).await?;
let db = Arc::new(SqliteDatabase::new(pool.clone()));
let engine = Arc::new(DefaultWorkflowEngine::new(db.clone()));
let leave_workflow = Arc::new(LeaveRequestWorkflow::new(db));
engine.register_workflow(leave_workflow);
let api = DefaultWorkflowApi::new(engine);
let app = Router::new()
.route("/", get(|| async { "Rust Viewflow Leave Request Example" }))
.merge(create_router(Arc::new(api)));
println!("Server starting on http://localhost:3000");
let listener = TcpListener::bind("0.0.0.0:3000").await?;
axum::serve(listener, app.into_make_service()).await?;
Ok(())
}