rustorm-core 0.1.2

Core traits, types and utilities for RustORM
Documentation
use crate::error::{OrmError, OrmResult};
use sqlx::postgres::{PgPool, PgPoolOptions};
use std::time::Duration;

/// Обёртка над sqlx::PgPool с удобными методами подключения.
pub struct OrmPool;

impl OrmPool {
    /// Подключиться к БД по URL.
    ///
    /// ```rust
    /// let pool = OrmPool::connect("postgres://user:pass@localhost/mydb").await?;
    /// ```
    pub async fn connect(url: &str) -> OrmResult<PgPool> {
        PgPoolOptions::new()
            .max_connections(20)
            .min_connections(2)
            .acquire_timeout(Duration::from_secs(30))
            .idle_timeout(Duration::from_secs(600))
            .connect(url)
            .await
            .map_err(OrmError::from_sqlx)
    }

    /// Читает `DATABASE_URL` из переменных окружения.
    ///
    /// ```rust
    /// let pool = OrmPool::from_env().await?;
    /// ```
    pub async fn from_env() -> OrmResult<PgPool> {
        let url = std::env::var("DATABASE_URL")
            .map_err(|_| OrmError::Config("DATABASE_URL не задан".into()))?;
        Self::connect(&url).await
    }

    /// Подключение с явными параметрами пула.
    pub async fn connect_with_options(url: &str, options: PoolOptions) -> OrmResult<PgPool> {
        PgPoolOptions::new()
            .max_connections(options.max_connections)
            .min_connections(options.min_connections)
            .acquire_timeout(Duration::from_secs(options.acquire_timeout_secs))
            .idle_timeout(Duration::from_secs(options.idle_timeout_secs))
            .connect(url)
            .await
            .map_err(OrmError::from_sqlx)
    }
}

#[derive(Debug, Clone)]
pub struct PoolOptions {
    pub max_connections: u32,
    pub min_connections: u32,
    pub acquire_timeout_secs: u64,
    pub idle_timeout_secs: u64,
}

impl Default for PoolOptions {
    fn default() -> Self {
        Self {
            max_connections: 20,
            min_connections: 2,
            acquire_timeout_secs: 30,
            idle_timeout_secs: 600,
        }
    }
}