pklrust 0.9.0

Rust bindings for Apple Pkl configuration language
Documentation

pklrust

Pronounced "Pickles" -- as in the food.

Rust bindings for Apple Pkl — a configuration-as-code language.

This library communicates with pkl server via MessagePack IPC, providing a native Rust interface to evaluate Pkl modules and deserialize results into Rust types through serde.

Crates

Crate Description
pklrust Core library — IPC protocol, pkl-binary decoder, serde Deserializer
pklrust-derive #[derive(FromPkl)] and pkl! proc-macros
pklrust-codegen CLI tool (pkl-gen-rust) to generate Rust structs from .pkl schemas

Quick Start

[dependencies]
pklrust = "0.2"
serde = { version = "1", features = ["derive"] }
use pklrust::{EvaluatorManager, EvaluatorOptions, ModuleSource};
use serde::Deserialize;

#[derive(Debug, Deserialize)]
struct Server {
    host: String,
    port: i64,
}

fn main() -> Result<(), pklrust::Error> {
    let mut manager = EvaluatorManager::new()?;
    let evaluator = manager.new_evaluator(EvaluatorOptions::preconfigured())?;

    let source = ModuleSource::text(r#"
        host = "localhost"
        port = 8080
    "#);

    let server: Server = manager.evaluate_module_typed(&evaluator, source)?;
    println!("{server:?}"); // Server { host: "localhost", port: 8080 }

    manager.close_evaluator(&evaluator)?;
    Ok(())
}

pkl! macro

Write PKL configuration as tokens directly in Rust — no string literals needed:

use pklrust::pkl;

fn main() -> Result<(), pklrust::Error> {
    let value = pkl! {
        host = "localhost"
        port = 8080
        database {
            url = "postgres://localhost/mydb"
            maxConnections = 10
        }
    }?;

    println!("{value:#?}");
    Ok(())
}

The macro supports most PKL constructs:

let value = pkl! {
    // Classes and type annotations
    class Server {
        host: String
        port: UInt16
    }

    // Functions
    function double(x) = x * 2

    // Modifiers
    local basePort = 8000

    // Duration and data size units
    timeout = 30.s
    maxSize = 512.mb

    // Control flow
    port = if (debug) 3000 else 8080

    // Operators
    items = data |> filter(it > 0)
    name = input ?? "default"
    valid = value is String
}?;

Limitations: PKL raw strings (#"..."#), string interpolation (\(expr)), and multi-line strings ("""...""") are not supported in the macro. Use ModuleSource::text(...) with a raw string literal for these cases.

You can also evaluate .pkl files directly:

let source = ModuleSource::file("config.pkl");

Or evaluate a specific expression:

let value = manager.evaluate_expression(&evaluator, source, Some("output.host"))?;

Prerequisites

The pkl CLI must be installed and available on your PATH.

# macOS
brew install pkl

# or download from https://pkl-lang.org

Code Generation

Generate Rust types from Pkl schema files:

cargo install pklrust-codegen
pkl-gen-rust schema.pkl -o src/generated/

License

MIT