// Code generated by ndpgen. DO NOT EDIT. // // This file contains client wrappers for the Task host service. // It is intended for use in Navidrome plugins built with extism-pdk. use extism_pdk::*; use serde::{Deserialize, Serialize}; use base64::Engine as _; use base64::engine::general_purpose::STANDARD as BASE64; mod base64_bytes { use serde::{self, Deserialize, Deserializer, Serializer}; use base64::Engine as _; use base64::engine::general_purpose::STANDARD as BASE64; pub fn serialize(bytes: &Vec, serializer: S) -> Result where S: Serializer, { serializer.serialize_str(&BASE64.encode(bytes)) } pub fn deserialize<'de, D>(deserializer: D) -> Result, D::Error> where D: Deserializer<'de>, { let s = String::deserialize(deserializer)?; BASE64.decode(&s).map_err(serde::de::Error::custom) } } /// QueueConfig holds configuration for a task queue. #[derive(Debug, Clone, Serialize, Deserialize)] #[serde(rename_all = "camelCase")] pub struct QueueConfig { pub concurrency: i32, pub max_retries: i32, pub backoff_ms: i64, pub delay_ms: i64, pub retention_ms: i64, } /// TaskInfo holds the current state of a task. #[derive(Debug, Clone, Serialize, Deserialize)] #[serde(rename_all = "camelCase")] pub struct TaskInfo { pub status: String, pub message: String, pub attempt: i32, } #[derive(Debug, Clone, Serialize)] #[serde(rename_all = "camelCase")] struct TaskCreateQueueRequest { name: String, config: QueueConfig, } #[derive(Debug, Clone, Deserialize)] #[serde(rename_all = "camelCase")] struct TaskCreateQueueResponse { #[serde(default)] error: Option, } #[derive(Debug, Clone, Serialize)] #[serde(rename_all = "camelCase")] struct TaskEnqueueRequest { queue_name: String, #[serde(with = "base64_bytes")] payload: Vec, } #[derive(Debug, Clone, Deserialize)] #[serde(rename_all = "camelCase")] struct TaskEnqueueResponse { #[serde(default)] result: String, #[serde(default)] error: Option, } #[derive(Debug, Clone, Serialize)] #[serde(rename_all = "camelCase")] struct TaskGetRequest { task_id: String, } #[derive(Debug, Clone, Deserialize)] #[serde(rename_all = "camelCase")] struct TaskGetResponse { #[serde(default)] result: Option, #[serde(default)] error: Option, } #[derive(Debug, Clone, Serialize)] #[serde(rename_all = "camelCase")] struct TaskCancelRequest { task_id: String, } #[derive(Debug, Clone, Deserialize)] #[serde(rename_all = "camelCase")] struct TaskCancelResponse { #[serde(default)] error: Option, } #[derive(Debug, Clone, Serialize)] #[serde(rename_all = "camelCase")] struct TaskClearQueueRequest { queue_name: String, } #[derive(Debug, Clone, Deserialize)] #[serde(rename_all = "camelCase")] struct TaskClearQueueResponse { #[serde(default)] result: i64, #[serde(default)] error: Option, } #[host_fn] extern "ExtismHost" { fn task_createqueue(input: Json) -> Json; fn task_enqueue(input: Json) -> Json; fn task_get(input: Json) -> Json; fn task_cancel(input: Json) -> Json; fn task_clearqueue(input: Json) -> Json; } /// CreateQueue creates a named task queue with the given configuration. /// Zero-value fields in config use sensible defaults. /// If a queue with the same name already exists, returns an error. /// On startup, this also recovers any stale "running" tasks from a previous crash. /// /// # Arguments /// * `name` - String parameter. /// * `config` - QueueConfig parameter. /// /// # Errors /// Returns an error if the host function call fails. pub fn create_queue(name: &str, config: QueueConfig) -> Result<(), Error> { let response = unsafe { task_createqueue(Json(TaskCreateQueueRequest { name: name.to_owned(), config: config, }))? }; if let Some(err) = response.0.error { return Err(Error::msg(err)); } Ok(()) } /// Enqueue adds a task to the named queue. Returns the task ID. /// payload is opaque bytes passed back to the plugin on execution. /// /// # Arguments /// * `queue_name` - String parameter. /// * `payload` - Vec parameter. /// /// # Returns /// The result value. /// /// # Errors /// Returns an error if the host function call fails. pub fn enqueue(queue_name: &str, payload: Vec) -> Result { let response = unsafe { task_enqueue(Json(TaskEnqueueRequest { queue_name: queue_name.to_owned(), payload: payload, }))? }; if let Some(err) = response.0.error { return Err(Error::msg(err)); } Ok(response.0.result) } /// Get returns the current state of a task including its status, /// message, and attempt count. /// /// # Arguments /// * `task_id` - String parameter. /// /// # Returns /// The result value. /// /// # Errors /// Returns an error if the host function call fails. pub fn get(task_id: &str) -> Result, Error> { let response = unsafe { task_get(Json(TaskGetRequest { task_id: task_id.to_owned(), }))? }; if let Some(err) = response.0.error { return Err(Error::msg(err)); } Ok(response.0.result) } /// Cancel cancels a pending task. Returns error if already /// running, completed, or failed. /// /// # Arguments /// * `task_id` - String parameter. /// /// # Errors /// Returns an error if the host function call fails. pub fn cancel(task_id: &str) -> Result<(), Error> { let response = unsafe { task_cancel(Json(TaskCancelRequest { task_id: task_id.to_owned(), }))? }; if let Some(err) = response.0.error { return Err(Error::msg(err)); } Ok(()) } /// ClearQueue removes all pending tasks from the named queue. /// Running tasks are not affected. Returns the number of tasks removed. /// /// # Arguments /// * `queue_name` - String parameter. /// /// # Returns /// The result value. /// /// # Errors /// Returns an error if the host function call fails. pub fn clear_queue(queue_name: &str) -> Result { let response = unsafe { task_clearqueue(Json(TaskClearQueueRequest { queue_name: queue_name.to_owned(), }))? }; if let Some(err) = response.0.error { return Err(Error::msg(err)); } Ok(response.0.result) }