in rust-code-analysis-cli/src/main.rs [243:356]
fn main() {
let opts = Opts::parse();
let count_lock = if !opts.count.is_empty() {
Some(Arc::new(Mutex::new(Count::default())))
} else {
None
};
let (preproc_lock, preproc) = match opts.preproc.len().cmp(&1) {
Ordering::Equal => {
let data = read_file(&opts.preproc[0]).unwrap();
eprintln!("Load preproc data");
let x = (
None,
Some(Arc::new(
serde_json::from_slice::<PreprocResults>(&data).unwrap(),
)),
);
eprintln!("Load preproc data: finished");
x
}
Ordering::Greater => (Some(Arc::new(Mutex::new(PreprocResults::default()))), None),
Ordering::Less => (None, None),
};
let output_is_dir = opts.output.as_ref().map(|p| p.is_dir()).unwrap_or(false);
if (opts.metrics || opts.ops) && opts.output.is_some() && !output_is_dir {
eprintln!("Error: The output parameter must be a directory");
process::exit(1);
}
let typ = opts.language_type.unwrap_or_default();
let language = if preproc_lock.is_some() {
Some(LANG::Preproc)
} else if typ.is_empty() {
None
} else if typ == "ccomment" {
Some(LANG::Ccomment)
} else if typ == "preproc" {
Some(LANG::Preproc)
} else {
get_from_ext(&typ)
};
let num_jobs = opts
.num_jobs
.map(|num_jobs| std::cmp::max(2, num_jobs) - 1)
.unwrap_or_else(|| {
std::cmp::max(
2,
available_parallelism()
.expect("Unrecoverable: Failed to get thread count")
.get(),
) - 1
});
let include = mk_globset(opts.include);
let exclude = mk_globset(opts.exclude);
let cfg = Config {
dump: opts.dump,
in_place: opts.in_place,
comments: opts.comments,
find_filter: opts.find,
count_filter: opts.count,
language,
function: opts.function,
metrics: opts.metrics,
ops: opts.ops,
output_format: opts.output_format,
pretty: opts.pretty,
output: opts.output.clone(),
line_start: opts.line_start,
line_end: opts.line_end,
preproc_lock: preproc_lock.clone(),
preproc,
count_lock: count_lock.clone(),
};
let files_data = FilesData {
include,
exclude,
paths: opts.paths,
};
let all_files = match ConcurrentRunner::new(num_jobs, act_on_file)
.set_proc_dir_paths(process_dir_path)
.run(cfg, files_data)
{
Ok(all_files) => all_files,
Err(e) => {
eprintln!("{e:?}");
process::exit(1);
}
};
if let Some(count) = count_lock {
let count = Arc::try_unwrap(count).unwrap().into_inner().unwrap();
println!("{count}");
}
if let Some(preproc) = preproc_lock {
let mut data = Arc::try_unwrap(preproc).unwrap().into_inner().unwrap();
fix_includes(&mut data.files, &all_files);
let data = serde_json::to_string(&data).unwrap();
if let Some(output_path) = opts.output {
write_file(&output_path, data.as_bytes()).unwrap();
} else {
println!("{data}");
}
}
}