talk-rs 0.7.1

Voice dictation for Linux -- record, transcribe, and paste
use crate::cli::def::Commands;
use std::path::PathBuf;

pub use crate::dictate::{dictate, DictateOpts};
pub use crate::record::ui::record_ui;
pub use crate::record::{record, record_daemon, RecordOpts};
pub use crate::speak::{speak, SpeakOpts};
pub use crate::transcribe::transcribe;

pub async fn dispatch(command: Commands, verbose: u8) -> Result<(), Box<dyn std::error::Error>> {
    match command {
        Commands::Record {
            file,
            monitor,
            no_sounds,
            no_boop,
            no_overlay,
            viz,
            mono,
            ui,
            toggle,
            no_bt_auto_switch,
            daemon,
        } => {
            if ui {
                record_ui().await?;
            } else if toggle {
                crate::record::toggle::toggle_dispatch(&crate::record::toggle::RecordToggleOpts {
                    file: file.map(PathBuf::from),
                    monitor,
                    no_sounds,
                    no_boop,
                    no_overlay,
                    viz,
                    mono,
                    no_bt_auto_switch,
                    verbose,
                })
                .await?;
            } else {
                let args = file.map(|f| vec![f]).unwrap_or_default();
                let opts = RecordOpts {
                    args,
                    monitor,
                    no_sounds,
                    no_boop,
                    no_overlay,
                    viz,
                    mono,
                    no_bt_auto_switch,
                };
                if daemon {
                    record_daemon(opts).await?;
                } else {
                    record(opts).await?;
                }
            }
        }
        Commands::Transcribe {
            input,
            output,
            provider,
            model,
            diarize,
            timestamp,
        } => {
            let mut args = vec![input];
            if let Some(output_file) = output {
                args.push(output_file);
            }
            transcribe(args, provider, model, diarize, timestamp).await?;
        }
        Commands::Speak {
            text,
            file,
            provider,
            voice,
            lang,
            speed,
            output,
            force,
        } => {
            speak(SpeakOpts {
                text,
                file: file.map(PathBuf::from),
                provider,
                voice,
                lang,
                speed,
                output: output.map(PathBuf::from),
                force,
            })
            .await?;
        }
        Commands::Dictate {
            save,
            output_yaml,
            input_audio_file,
            retry_last,
            pick,
            replace_last_paste,
            provider,
            model,
            diarize,
            timestamp,
            realtime,
            toggle,
            no_sounds,
            no_boop,
            no_chunk_paste,
            no_paste,
            monitor,
            no_overlay,
            no_auto_pause,
            viz,
            mono,
            upload_format,
            no_bt_auto_switch,
            daemon,
            target_window,
        } => {
            dictate(DictateOpts {
                save: save.map(PathBuf::from),
                output_yaml: output_yaml.map(PathBuf::from),
                input_audio_file: input_audio_file.map(PathBuf::from),
                retry_last,
                pick,
                replace_last_paste,
                provider,
                model,
                diarize,
                timestamp,
                realtime,
                toggle,
                no_sounds,
                no_boop,
                no_chunk_paste,
                no_paste,
                monitor,
                no_overlay,
                no_auto_pause,
                viz,
                mono,
                upload_format,
                no_bt_auto_switch,
                daemon,
                target_window,
                verbose,
            })
            .await?;
        }
    }
    Ok(())
}