| Crates.io | rustloclib |
| lib.rs | rustloclib |
| version | 0.7.0 |
| created_at | 2026-01-09 23:44:29.412094+00 |
| updated_at | 2026-01-16 02:36:11.418859+00 |
| description | A Rust-aware lines of code counter that separates code, tests, comments, and blanks |
| homepage | |
| repository | https://github.com/arthur-debert/rustloc |
| max_upload_size | |
| id | 2033174 |
| size | 211,826 |
A Rust-aware lines of code counter library that separates code, tests, comments, and blank lines.
Unlike generic LOC counters, this library understands Rust's unique structure where tests live alongside production code. It uses syntax-aware parsing to distinguish:
#[test] or #[cfg(test)] blocks, or in tests/ directoriesexamples/ directories///, //!, /** */, /*! */)//, /* */)#[cfg(test)], #[test] attributesAdd to your Cargo.toml:
[dependencies]
rustloclib = "0.1"
use rustloclib::{count_workspace, CountOptions};
let result = count_workspace(".", CountOptions::new())?;
println!("Files: {}", result.total.file_count);
println!("Main code: {}", result.total.main.code);
println!("Test code: {}", result.total.tests.code);
println!("Total: {}", result.total.total());
use rustloclib::{count_workspace, CountOptions};
let result = count_workspace(".", CountOptions::new()
.crates(vec!["my-lib".to_string(), "my-cli".to_string()]))?;
use rustloclib::{count_workspace, CountOptions, FilterConfig};
let filter = FilterConfig::new()
.exclude("**/generated/**")?
.exclude("**/vendor/**")?;
let result = count_workspace(".", CountOptions::new().filter(filter))?;
use rustloclib::count_file;
let stats = count_file("src/main.rs")?;
println!("Code: {}, Docs: {}", stats.main.code, stats.main.docs);
use rustloclib::{parse_string, VisitorContext};
let source = r#"
fn main() {
println!("Hello");
}
#[test]
fn test_main() {
assert!(true);
}
"#;
let stats = parse_string(source, VisitorContext::Main);
assert_eq!(stats.main.code, 3); // fn, println, }
assert_eq!(stats.tests.code, 4); // #[test], fn, assert, }
Aggregated statistics for a collection of files:
pub struct LocStats {
pub file_count: u64,
pub main: Locs, // Production code
pub tests: Locs, // Test code
pub examples: Locs, // Example code
}
Line counts for a single context:
pub struct Locs {
pub blank: u64, // Whitespace-only lines
pub code: u64, // Code lines
pub docs: u64, // Doc comment lines
pub comments: u64, // Regular comment lines
}
Result from counting operations:
pub struct CountResult {
pub total: LocStats, // Aggregated stats
pub crates: Vec<CrateStats>, // Per-crate breakdown
pub files: Vec<FileStats>, // Per-file breakdown (if requested)
}
The parsing logic is adapted from cargo-warloc by Maxim Gritsenko (MIT licensed).
MIT License