hitomi 0.8.1

A CLI application that builds and updates playlists on a Plex server using json-based profiles.
Documentation
use anyhow::Result;
use sqlx::{Encode, Sqlite};

use crate::config::{Config as AppConfig, ConfigBuilder};
use crate::db;

#[derive(sqlx::FromRow)]
struct DbConfig {
    name: String,
    value: String,
}

pub async fn have_config() -> Result<bool> {
    let result: Option<(i32,)> = sqlx::query_as("select count(*) from config")
        .fetch_optional(db::get_pool()?)
        .await?;

    let result = if let Some(result) = result {
        result.0 > 0
    } else {
        false
    };

    Ok(result)
}

async fn add_config_setting<'q, T: 'q + Send + Encode<'q, Sqlite> + sqlx::Type<Sqlite>>(
    name: &'q str,
    value: T,
) -> Result<()> {
    sqlx::query(
        r#"
        insert into config
        values (?, ?)
    "#,
    )
    .bind(name)
    .bind(value)
    .execute(db::get_pool()?)
    .await?;

    Ok(())
}

pub async fn save_config(config: &AppConfig) -> Result<()> {
    add_config_setting("plex_token", config.get_plex_token()?.as_str()).await?;
    add_config_setting("plex_url", config.get_plex_url_str()).await?;
    add_config_setting("primary_section_id", config.get_primary_section_id()).await?;

    Ok(())
}

pub async fn fetch_config() -> Result<AppConfig> {
    let rows = sqlx::query_as::<_, DbConfig>(
        r#"
        select * from config
    "#,
    )
    .fetch_all(db::get_pool()?)
    .await?;

    let mut config = ConfigBuilder::default();
    for row in rows {
        if row.name == "plex_token" {
            config.plex_token(row.value);
            continue;
        }

        if row.name == "plex_url" {
            config.plex_url(row.value);
            continue;
        }

        if row.name == "primary_section_id" {
            config.primary_section_id(row.value.parse()?);
            continue;
        }
    }

    Ok(config.build()?)
}