Skip to main content

typed_eval/
typed_eval.rs

1/// Typed evaluation — deserialize PKL into Rust structs via serde.
2use pklrust::{EvaluatorManager, EvaluatorOptions, ModuleSource};
3use serde::Deserialize;
4
5#[derive(Debug, Deserialize)]
6struct AppConfig {
7    name: String,
8    version: String,
9    server: ServerConfig,
10    features: Vec<String>,
11}
12
13#[derive(Debug, Deserialize)]
14struct ServerConfig {
15    host: String,
16    port: u16,
17    #[serde(rename = "maxConnections")]
18    max_connections: u32,
19}
20
21fn main() -> Result<(), Box<dyn std::error::Error>> {
22    let mut manager = EvaluatorManager::new()?;
23    let evaluator = manager.new_evaluator(EvaluatorOptions::preconfigured())?;
24
25    let source = ModuleSource::text(
26        r#"
27        name = "my-service"
28        version = "2.1.0"
29        server {
30            host = "0.0.0.0"
31            port = 8443
32            maxConnections = 100
33        }
34        features = new Listing {
35            "auth"
36            "logging"
37            "metrics"
38        }
39        "#,
40    );
41
42    let config: AppConfig = manager.evaluate_module_typed(&evaluator, source)?;
43    println!("App: {} v{}", config.name, config.version);
44    println!("Server: {}:{}", config.server.host, config.server.port);
45    println!("Max connections: {}", config.server.max_connections);
46    println!("Features: {:?}", config.features);
47
48    manager.close_evaluator(&evaluator)?;
49    Ok(())
50}