flagrant 0.0.2

CLI powered feature-flagging
Documentation
use hugsqlx::{params, HugSqlx};
use sqlx::{Pool, Sqlite};

use crate::errors::FlagrantError;
use flagrant_types::{Environment, Project};

#[derive(HugSqlx)]
#[queries = "resources/db/queries/environments.sql"]
struct Environments {}

pub async fn create(
    pool: &Pool<Sqlite>,
    project: &Project,
    name: String,
    description: Option<String>,
) -> anyhow::Result<Environment> {
    let env = Environments::create_environment::<_, Environment>(
        pool,
        params![project.id, name, description],
    )
    .await
    .map_err(|e| FlagrantError::QueryFailed("Could not create an environment", e))?;

    Ok(env)
}

pub async fn fetch(pool: &Pool<Sqlite>, environment_id: u16) -> anyhow::Result<Environment> {
    let env = Environments::fetch_environment::<_, Environment>(pool, params![environment_id])
        .await
        .map_err(|e| FlagrantError::QueryFailed("Could not fetch environment", e))?;

    Ok(env)
}

pub async fn fetch_by_name(
    pool: &Pool<Sqlite>,
    project: &Project,
    name: String,
) -> anyhow::Result<Environment> {
    let env =
        Environments::fetch_environment_by_name::<_, Environment>(pool, params![project.id, name])
            .await
            .map_err(|e| {
                FlagrantError::QueryFailed("Could not fetch environment", e)
            })?;

    Ok(env)
}

pub async fn fetch_by_prefix(
    pool: &Pool<Sqlite>,
    project: &Project,
    prefix: String,
) -> anyhow::Result<Vec<Environment>> {
    let envs = Environments::fetch_environments_by_pattern::<_, Environment>(
        pool,
        params![project.id, format!("{}%", prefix)],
    )
    .await
    .map_err(|e| {
        FlagrantError::QueryFailed("Could not fetch list of environments", e)
    })?;

    Ok(envs)
}

pub async fn fetch_for_project(
    pool: &Pool<Sqlite>,
    project: &Project,
) -> anyhow::Result<Vec<Environment>> {
    let envs =
        Environments::fetch_environments_for_project::<_, Environment>(pool, params![project.id])
            .await
            .map_err(|e| {
                FlagrantError::QueryFailed("Could not fetch list of environments", e)
            })?;

    Ok(envs)
}