# Navidrome Host Function Wrappers for Rust This directory contains auto-generated Rust wrappers for Navidrome's host services. These wrappers provide idiomatic Rust APIs for interacting with Navidrome from WASM plugins. ## ⚠️ Auto-Generated Code **Do not edit these files manually.** They are generated by the `ndpgen` tool. To regenerate: ```bash make gen ``` ## Usage Add this crate as a dependency in your plugin's `Cargo.toml`: ```toml [dependencies] nd-host = { path = "../../pdk/rust/host" } ``` Then import the services you need: ```rust use nd_host::{cache, scheduler, library}; use nd_host::library::Library; // Import the typed struct #[plugin_fn] pub fn my_callback(input: String) -> FnResult { // Use the cache service cache::set("my_key", b"my_value", 3600)?; // Schedule a recurring task scheduler::schedule_recurring("@every 5m", "payload", "task_id")?; // Access library data with typed structs let libraries: Vec = library::get_all_libraries()?; for lib in &libraries { info!("Library: {} with {} songs", lib.name, lib.total_songs); } Ok("done".to_string()) } ``` ## Typed Structs Services that work with domain objects provide typed Rust structs instead of `serde_json::Value`. This enables compile-time type checking and IDE autocompletion. For example, the `library` module provides a `Library` struct: ```rust use nd_host::library::Library; let libs: Vec = library::get_all_libraries()?; println!("First library: {} ({} songs)", libs[0].name, libs[0].total_songs); ``` All structs derive `Debug`, `Clone`, `Serialize`, and `Deserialize` for convenient use with logging and serialization. ## Available Services | Module | Description | |---------------|----------------------------------------------------| | `artwork` | Access album and artist artwork | | `cache` | Temporary key-value storage with TTL | | `kvstore` | Persistent key-value storage | | `library` | Access the music library (albums, artists, tracks) | | `scheduler` | Schedule one-time and recurring tasks | | `subsonicapi` | Make Subsonic API calls | | `websocket` | Send real-time messages to clients | ## Building Plugins Rust plugins must be compiled to WebAssembly: ```bash cargo build --target wasm32-wasip1 --release ``` See the [webhook-rs](../../examples/webhook-rs/) example for a complete plugin implementation.