#![doc = include_str!("../README.md")]
mod arguments;
mod plain;
use crate::arguments::Arguments;
use clap::Parser;
use rsynko_manager::SubmissionAlg;
use rsynko_media::OutputTarget;
use rsynko_memory::{MemoryManager, SourceRequest};
use rsynko_ratatui::{Application, terminal};
use std::error::Error;
use std::io::{self, IsTerminal};
const RSYNKO: Application<'static> = Application { name: env!("CARGO_BIN_NAME"), version: env!("CARGO_PKG_VERSION") };
fn main() -> Result<(), Box<dyn Error>> {
let arguments = Arguments::parse();
if arguments.no_tui || !io::stdin().is_terminal() || !io::stdout().is_terminal() {
return plain::run(&arguments);
}
if arguments.output.is_some() && arguments.sources.len() > 1 {
return Err("--output can be used only with one source".into());
}
terminal::run(RSYNKO, requested(&arguments))
}
fn requested(arguments: &Arguments) -> Vec<SourceRequest> {
arguments
.sources
.iter()
.enumerate()
.map(|(index, source)| {
let output = match arguments.target(index) {
OutputTarget::Path(path) => Some(path),
OutputTarget::MediaId | OutputTarget::Title => None,
};
let mut request = MemoryManager.submitted(source);
if let Some(output) = output {
request.output = Some(output);
}
request
})
.collect()
}