2 个版本
0.1.1 | 2024年5月23日 |
---|---|
0.1.0 | 2024年5月23日 |
#779 in 解析器实现
65KB
2K SLoC
gomod-rs
带有位置信息的 go.mod 文件解析器。
使用 nom 和 nom_locate 实现。
解析过程中不进行字符串复制/克隆。
(除了解释字符串 ,它们生成 Identifier::Interpreted(String)
类型)
示例用法
以下是一个示例,打印 go.mod 文件中定义的所有要求,包括它们的位置和相关内容。
use gomod_rs::{parse_gomod, Context, Directive};
let contents = r#"module example.com/my/thing
go 1.12
require (
example.com/other/thing v1.0.2
example.com/new/thing/v2 v2.3.4
)
exclude example.com/old/thing v1.2.3
replace example.com/bad/thing v1.4.5 => example.com/good/thing v1.4.5
retract [v1.9.0, v1.9.5]"#;
let gomod = parse_gomod(&contents)?;
gomod
.iter()
.filter_map(|i| match i {
Context {
value: Directive::Require { specs },
..
} => Some(specs),
_ => None,
})
.for_each(|require_specs| {
require_specs.iter().for_each(|spec| {
println!(
"Requirement {{name: {}, version: {}}} at line {}, fragment: {}",
spec.value.0,
&spec.value.1 as &str,
spec.range.0.line,
&contents[spec.range.0.offset..spec.range.1.offset]
);
});
});
以上将输出
Requirement {name: example.com/other/thing, version: v1.0.2} at line 6, fragment: example.com/other/thing v1.0.2
Requirement {name: example.com/new/thing/v2, version: v2.3.4} at line 7, fragment: example.com/new/thing/v2 v2.3.4
您也可以使用 cargo run --example parse -- /path/to/go.mod
。
依赖项
~1MB
~21K SLoC