use std::path::PathBuf;
use std::time::{Duration, Instant};
use tokei::{Config, Languages};
use tokio::sync::oneshot;
use crate::model::{Tree, build_tree};
pub struct ScanOutcome {
pub tree: Tree,
pub duration: Duration,
pub inaccurate: bool,
}
pub fn spawn(root: PathBuf, root_label: String) -> oneshot::Receiver<ScanOutcome> {
let (tx, rx) = oneshot::channel();
tokio::task::spawn_blocking(move || {
let started = Instant::now();
let mut languages = Languages::new();
let ignored: &[&str] = &[];
languages.get_statistics(&[&root], ignored, &Config::default());
let inaccurate = languages.values().any(|language| language.inaccurate);
let tree = build_tree(&languages, &root, root_label);
let _ = tx.send(ScanOutcome {
tree,
duration: started.elapsed(),
inaccurate,
});
});
rx
}