# llam
Safe, synchronous Rust bindings for the LLAM C runtime.
`llam` is the only crate users need:
```toml
[dependencies]
llam = "0.1.0"
```
It includes safe wrappers, raw C ABI bindings under `llam::sys`, and a build
script that installs the LLAM C SDK into Cargo's private `OUT_DIR/llam-sdk`
prefix by default.
## Example
```rust
fn main() -> llam::Result<()> {
llam::run(|| {
let (tx, rx) = llam::channel::bounded::<u32>(1)?;
llam::spawn!(move {
tx.send(42).unwrap();
});
assert_eq!(rx.recv()?, 42);
Ok(())
})
}
```
For I/O-heavy code:
```rust
fn main() -> llam::Result<()> {
llam::run_with_profile(llam::Profile::IoLatency, || {
let listener = llam::net::TcpListener::bind("127.0.0.1:9090")?;
let (stream, peer) = listener.accept()?;
println!("accepted {peer}");
drop(stream);
Ok(())
})
}
```
`#[llam::main]` is not provided because LLAM-rs publishes only this single
crate. Rust attribute macros require a separate `proc-macro` crate.
## Build
Default:
```bash
cargo build
```
The build script installs LLAM C into:
```text
target/.../build/llam-*/out/llam-sdk
```
Use a preinstalled SDK:
```bash
LLAM_SYS_PREFIX="$HOME/.local/llam" cargo build
```
Useful environment variables:
- `LLAM_SYS_PREFIX`: installed LLAM SDK prefix.
- `LLAM_SYS_LIB_DIR` and `LLAM_SYS_INCLUDE_DIR`: direct lib/include override.
- `LLAM_SYS_INSTALL_PREFIX`: override automatic SDK install prefix.
- `LLAM_SYS_INSTALL_VERSION`: LLAM release version. Default: `1.0.0`.
- `LLAM_SYS_INSTALL_TARGET`: explicit release target.
- `LLAM_SYS_NO_INSTALL=1`: disable automatic install.
## Modules
- `llam::run`, `llam::run_with_profile`
- `llam::spawn!`, `llam::try_spawn!`, `JoinHandle`, `TaskGroup`
- `llam::channel`, `llam::select!`
- `llam::sync`, `llam::time`, `llam::blocking`
- `llam::net`, `llam::io`, `llam::fs`
- `llam::task_local`, `llam::diagnostics`
- `llam::sys`