rustloclib
A Rust-aware lines-of-code counter library. Unlike generic LOC tools, rustloclib understands that Rust tests live alongside production code and correctly separates them — even in the same file.
Line types
Every line is classified into one of six types:
- code — production logic lines
- tests — test logic lines (
#[test],#[cfg(test)],tests/) - examples — example logic lines (
examples/) - docs — doc comments (
///,//!,/** */,/*! */) - comments — regular comments (
//,/* */) - blanks — whitespace-only lines
Quick start
[]
= "0.8"
Count a workspace
use ;
let result = count_workspace?;
println!;
Count a single file
use count_file;
let stats = count_file?;
println!;
Filter by crate or glob
use ;
let filter = new.exclude?;
let result = count_workspace?;
Diff between commits
use ;
let diff = diff_commits?;
println!;
Working directory diff
use ;
let diff = diff_workdir?;
Data pipeline
The library is organized into four stages:
source → data → query → output
Find Parse Filter Format
files & count & sort strings
Full pipeline example
use ;
// Stages 1–2: discover and count
let result = count_workspace?;
// Stage 3: query (filter line types, aggregate, sort)
let queryset = from_result;
// Stage 4: format for display
let table = from_count_queryset;
Key types
| Type | Description |
|---|---|
Locs |
Counts for a single item: code, tests, examples, docs, comments, blanks, total |
CountResult |
Result from counting: total, crates, modules, files |
DiffResult |
Result from diffing: total, crates, files (each with LocsDiff) |
LocsDiff |
Added/removed Locs with net_*() helpers |
CountOptions |
Builder for counting: .crates(), .filter(), .aggregation(), .line_types() |
DiffOptions |
Builder for diffing: same API as CountOptions |
Aggregation |
Total, ByCrate, ByModule, ByFile |
LineTypes |
Which columns to include: default(), everything(), code_only(), etc. |
Ordering |
Sort control: by_code(), by_tests(), by_total(), by_label() |
FilterConfig |
Glob-based file filtering: .include(), .exclude() |
All data types implement serde::Serialize and serde::Deserialize.
Acknowledgments
The parsing logic is adapted from cargo-warloc by Maxim Gritsenko (MIT licensed).
License
MIT License