Rust KCL配置语言解析库kcl-lib的使用,支持KCL语法解析与配置管理的高效Rust工具
Rust KCL配置语言解析库kcl-lib的使用
kcl-lib是KittyCAD公司开发的用于定义几何图形和处理几何引擎的高效Rust库。它是KittyCAD Design API的一部分。
安装
作为命令行工具安装
cargo install kcl-lib
作为库依赖安装
在Cargo.toml中添加:
kcl-lib = "0.2.87"
标准库函数贡献流程
如果你想为KCL贡献新的标准库函数,可以按照以下步骤:
- 在编辑器(如VS Code)中打开
./kcl/src/std
目录 - 在相应分类文件中找到类似函数作为参考
- 添加你的代码,需要包含:
- 实际的Rust标准库函数实现(
pub async
) - 包含至少一个示例的文档注释
stdlib
宏提供KCL用户使用的函数名- 仅限crate使用的内部函数
- 实际的Rust标准库函数实现(
- 将新函数添加到
mod.rs
中的CORE_FNS
列表 - 获取Zoo dev token并设置环境变量
- 运行测试:
TWENTY_TWENTY=overwrite cargo nextest run --workspace --no-fail-fast
- 生成文档:
just redo-kcl-stdlib-docs
- 创建GitHub PR
创建模拟测试
模拟测试是测试KCL代码的首选方式。
创建新测试:
just new-sim-test foo_bar
编辑生成的foo_bar/input.kcl
文件,然后运行:
just overwrite-sim-test foo_bar
检查生成的输出文件,确保没有意外的execution_error.snap
文件,然后提交所有文件。
完整示例代码
下面是一个使用kcl-lib解析KCL配置的完整示例:
use kcl_lib::parser::Parser;
use kcl_lib::ast::Program;
use kcl_lib::std::StdLib;
fn main() {
// 初始化标准库
let stdlib = StdLib::init();
// KCL配置代码
let kcl_code = r#"
config = {
name = "example"
version = "1.0"
features = ["parser", "validator"]
}
"#;
// 创建解析器
let mut parser = Parser::new(kcl_code, &stdlib);
// 解析KCL代码
match parser.parse() {
Ok(program) => {
// 解析成功,处理AST
println!("Parsed successfully: {:?}", program);
// 遍历AST节点
for stmt in program.statements {
println!("Statement: {:?}", stmt);
}
}
Err(e) => {
// 处理解析错误
eprintln!("Parse error: {}", e);
}
}
}
特性
- 高效的KCL语法解析
- 内置标准库支持
- 详细的错误报告
- AST(抽象语法树)生成
- 测试友好的模拟测试框架
kcl-lib采用MIT许可证,当前版本为0.2.87,大小约466 KiB。
1 回复
Rust KCL配置语言解析库kcl-lib使用指南
概述
kcl-lib是一个用于解析和管理KCL(Kusion Configuration Language)配置的高效Rust库。KCL是一种开源的配置语言,主要用于云原生配置管理场景。kcl-lib提供了完整的KCL语法解析能力,使开发者能够在Rust应用中集成KCL配置处理功能。
主要特性
- 完整的KCL语法解析支持
- 高效的AST(抽象语法树)构建
- 配置数据提取与转换
- 错误处理与语法验证
- 与Rust生态无缝集成
安装方法
在Cargo.toml中添加依赖:
[dependencies]
kcl-lib = "0.1" # 请使用最新版本号
基本使用方法
1. 解析KCL配置
use kcl_lib::parser::{parse_kcl_file, ParseError};
fn main() -> Result<(), ParseError> {
let ast = parse_kcl_file("config.k")?;
println!("AST: {:?}", ast);
Ok(())
}
2. 从字符串解析KCL
use kcl_lib::parser::parse_kcl_string;
let kcl_code = r#"
schema Person:
name: str
age: int
person = Person {
name = "Alice"
age = 25
}
"#;
let ast = parse_kcl_string(kcl_code).unwrap();
3. 遍历和查询AST
use kcl_lib::ast::visitor::{Visitor, walk};
struct MyVisitor;
impl Visitor for MyVisitor {
fn visit_schema(&mut self, schema: &SchemaStmt) {
println!("Found schema: {}", schema.name);
}
}
let mut visitor = MyVisitor;
walk(&mut visitor, &ast);
4. 配置值提取
use kcl_lib::value::extract_config;
let config = extract_config(&ast).unwrap();
let person_name = config.get_path("person.name").unwrap();
println!("Person name: {}", person_name.as_str().unwrap());
高级用法
1. 自定义错误处理
use kcl_lib::error::KclError;
fn process_config(path: &str) -> Result<(), KclError> {
let ast = parse_kcl_file(path)?;
// 处理逻辑...
Ok(())
}
2. 修改AST并生成KCL代码
use kcl_lib::ast::builder::*;
use kcl_lib::generator::generate_kcl;
let mut ast = parse_kcl_string("a = 1").unwrap();
// 添加一个新变量
ast.add_stmt(Stmt::Assign(AssignStmt {
targets: vec!["b".to_string()],
value: Expr::NumberLit(NumberLit { value: 2.0 }),
}));
let new_kcl = generate_kcl(&ast);
println!("Modified KCL:\n{}", new_kcl);
3. 与Serde集成
use serde_json;
use kcl_lib::value::to_value;
let config_value = to_value(&ast).unwrap();
let json_str = serde_json::to_string_pretty(&config_value).unwrap();
println!("JSON representation:\n{}", json_str);
性能提示
- 对于大型KCL文件,考虑使用增量解析
- 重用AST访问器实例以减少分配
- 使用
parse_kcl_file
而非先读文件再parse_kcl_string
以获得更好的性能
错误处理
kcl-lib提供了详细的错误信息,包括语法错误位置和类型:
match parse_kcl_string("invalid kcl code") {
Ok(ast) => { /* 处理成功 */ },
Err(e) => {
eprintln!("Error at line {}:{} - {}",
e.location.line,
e.location.column,
e.message);
}
}
完整示例
下面是一个完整的使用kcl-lib处理KCL配置的示例:
use kcl_lib::{
parser::{parse_kcl_file, ParseError},
ast::visitor::{Visitor, walk},
value::extract_config,
};
// 自定义AST访问器
struct ConfigVisitor {
person_count: usize,
}
impl Visitor for ConfigVisitor {
fn visit_schema(&mut self, schema: &SchemaStmt) {
println!("发现Schema定义: {}", schema.name);
if schema.name == "Person" {
self.person_count += 1;
}
}
}
fn main() -> Result<(), ParseError> {
// 1. 解析KCL文件
let ast = parse_kcl_file("example.k")?;
// 2. 遍历AST
let mut visitor = ConfigVisitor { person_count: 0 };
walk(&mut visitor, &ast);
println!("找到Person schema数量: {}", visitor.person_count);
// 3. 提取配置值
let config = extract_config(&ast)?;
let age = config.get_path("person.age")?.as_int()?;
println!("人物年龄: {}", age);
Ok(())
}
对应的KCL文件内容(example.k):
schema Person:
name: str
age: int
person = Person {
name = "Alice"
age = 25
}
总结
kcl-lib为Rust开发者提供了强大的KCL配置处理能力,无论是简单的配置解析还是复杂的配置管理场景都能胜任。通过其提供的API,可以轻松地将KCL集成到现有的Rust应用中。