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贡献新的标准库函数,可以按照以下步骤:

  1. 在编辑器(如VS Code)中打开./kcl/src/std目录
  2. 在相应分类文件中找到类似函数作为参考
  3. 添加你的代码,需要包含:
    • 实际的Rust标准库函数实现(pub async)
    • 包含至少一个示例的文档注释
    • stdlib宏提供KCL用户使用的函数名
    • 仅限crate使用的内部函数
  4. 将新函数添加到mod.rs中的CORE_FNS列表
  5. 获取Zoo dev token并设置环境变量
  6. 运行测试: TWENTY_TWENTY=overwrite cargo nextest run --workspace --no-fail-fast
  7. 生成文档: just redo-kcl-stdlib-docs
  8. 创建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应用中。

回到顶部