code-moniker-core 0.2.0

Core symbol-graph types and per-language extractors for code-moniker (pure Rust, no pgrx). Consumed by the CLI and the PostgreSQL extension.
Documentation
use std::env;
use std::fs;
use std::time::Instant;

use code_moniker_core::core::moniker::MonikerBuilder;
use code_moniker_core::lang::ts;

fn main() {
	let iters: usize = env::args()
		.nth(1)
		.and_then(|s| s.parse().ok())
		.unwrap_or(50);
	let path = env::args()
		.nth(2)
		.unwrap_or_else(|| "dogfood/ts/zod/src/types.ts".to_string());

	let source = fs::read_to_string(&path).unwrap_or_else(|e| panic!("read {path}: {e}"));
	let anchor = MonikerBuilder::new().project(b"zod").build();
	let presets = ts::Presets::default();

	let _ = ts::extract("types.ts", &source, &anchor, false, &presets);

	let t0 = Instant::now();
	let mut total_defs = 0usize;
	let mut total_refs = 0usize;
	for _ in 0..iters {
		let g = ts::extract("types.ts", &source, &anchor, false, &presets);
		total_defs += g.def_count();
		total_refs += g.ref_count();
	}
	let elapsed = t0.elapsed();
	let per_run = elapsed / iters as u32;

	let defs_per_run = total_defs / iters;
	let refs_per_run = total_refs / iters;
	let kb = source.len() / 1024;

	println!("file:        {path} ({kb} KiB)");
	println!("iterations:  {iters}");
	println!("defs/run:    {defs_per_run}");
	println!("refs/run:    {refs_per_run}");
	println!("total:       {elapsed:?}");
	println!("per-run:     {per_run:?}");
	println!(
		"throughput:  {:.0} files/sec, {:.0} refs/sec",
		iters as f64 / elapsed.as_secs_f64(),
		(refs_per_run * iters) as f64 / elapsed.as_secs_f64()
	);
}