use colored::Colorize;
use di::{Ref, RefMut, injectable};
use log::{debug, info};
use rogue_logging::Error;
use crate::commands::*;
use crate::options::*;
use crate::utils::*;
#[injectable]
pub(crate) struct SpectrogramCommand {
arg: Ref<SourceArg>,
shared_options: Ref<SharedOptions>,
spectrogram_options: Ref<SpectrogramOptions>,
source_provider: RefMut<SourceProvider>,
paths: Ref<PathManager>,
factory: Ref<SpectrogramJobFactory>,
runner: Ref<JobRunner>,
}
impl SpectrogramCommand {
pub(crate) async fn execute_cli(&self) -> Result<bool, Error> {
if !self.arg.validate()
|| !self.shared_options.validate()
|| !self.spectrogram_options.validate()
{
return Ok(false);
}
let source = self
.source_provider
.write()
.expect("Source provider should be writeable")
.get_from_options()
.await
.map_err(|e| error("get source from options", e.to_string()))?;
let status = self.execute(&source).await;
if let Some(error) = &status.error {
error.log();
}
Ok(status.success)
}
#[must_use]
pub(crate) async fn execute(&self, source: &Source) -> SpectrogramStatus {
let path = self.paths.get_spectrogram_dir(source);
if path.is_dir() {
info!("{} existing spectrograms {source}", "Found".bold());
debug!("in {}", path.display());
return SpectrogramStatus {
success: true,
path: Some(path),
count: 0,
completed: TimeStamp::now(),
error: None,
};
}
info!("{} spectrograms for {}", "Creating".bold(), source);
let collection = Collector::get_flacs(&source.directory);
let jobs = self.factory.create(&collection, source);
let count = jobs.len();
self.runner.add(jobs);
match self.runner.execute().await {
Ok(()) => {
info!("{} {count} spectrograms for {source}", "Created".bold());
debug!("in {}", path.display());
SpectrogramStatus {
success: true,
path: Some(path),
count,
completed: TimeStamp::now(),
error: None,
}
}
Err(error) => SpectrogramStatus {
success: false,
path: None,
count,
completed: TimeStamp::now(),
error: Some(error),
},
}
}
}