fum-player 1.3.1

A tui-based mpris music client.
use clap::{Parser, Subcommand};
use expanduser::expanduser;

use crate::{config::{Align, Config}, fum::FumResult};

#[derive(Subcommand)]
pub enum Commands {
    ListPlayers
}

#[derive(Parser)]
#[command(name = "fum", version, about)]
pub struct FumCli {
    #[arg(short, long, value_name = "config file", default_value = "~/.config/fum/config.jsonc")]
    config: Option<String>,

    #[arg(short, long, value_name = "string[]", value_delimiter = ',')]
    players: Option<Vec<String>>,

    #[arg(long, value_name = "boolean")]
    use_active_player: Option<bool>,

    #[arg(long, value_name = "number")]
    fps: Option<u64>,

    #[arg(short, long, value_name = "center,top,left,bottom,right,top-left,top-right,bottom-left,bottom-right")]
    align: Option<String>,

    #[command(subcommand)]
    pub command: Option<Commands>
}

pub fn run() -> FumResult<(FumCli, Config)> {
    let fum_cli = FumCli::parse();

    let config_path = expanduser(fum_cli.config.as_ref().unwrap())
        .map_err(|err| format!("Failed to expand path: {err}"))?;

    let mut config = Config::load(&config_path)?;

    if let Some(players) = fum_cli.players.as_ref() {
        config.players = players.to_owned();
    }

    if let Some(use_active_player) = fum_cli.use_active_player.as_ref() {
        config.use_active_player = use_active_player.to_owned();
    }

    if let Some(fps) = fum_cli.fps.as_ref() {
        config.fps = fps.to_owned();
    }

    if let Some(align) = fum_cli.align.as_ref() {
        let align = Align::from_str(align.as_str())
            .ok_or("Invalid value for 'align'".to_string())?;

        config.align = align;
    }

    Ok((fum_cli, config))
}