Files
navidrome/plugins/pdk/rust/nd-pdk-capabilities/src/websocket.rs
T
Deluan Quintão fda35dd8ce feat(plugins): add similar songs retrieval functions and improve duration consistency (#4933)
* feat: add duration filtering for similar songs matching

Signed-off-by: Deluan <deluan@navidrome.org>

* test: refactor expectations for similar songs in provider matching tests

Signed-off-by: Deluan <deluan@navidrome.org>

* feat(plugins): add functions to retrieve similar songs by track, album, and artist

Signed-off-by: Deluan <deluan@navidrome.org>

* fix(plugins): support uint32 in ndpgen

Signed-off-by: Deluan <deluan@navidrome.org>

* fix(plugins): update duration field to use seconds as float instead of milliseconds as uint32

Signed-off-by: Deluan <deluan@navidrome.org>

* fix: add helper functions for Rust's skip_serializing_if with numeric types

Signed-off-by: Deluan <deluan@navidrome.org>

* feat(provider): enhance track matching logic to fallback to title match when duration-filtered tracks fail

---------

Signed-off-by: Deluan <deluan@navidrome.org>
2026-01-26 18:28:41 -05:00

173 lines
6.0 KiB
Rust

// Code generated by ndpgen. DO NOT EDIT.
//
// This file contains export wrappers for the WebSocketCallback capability.
// It is intended for use in Navidrome plugins built with extism-pdk.
use serde::{Deserialize, Serialize};
// Helper functions for skip_serializing_if with numeric types
#[allow(dead_code)]
fn is_zero_i32(value: &i32) -> bool { *value == 0 }
#[allow(dead_code)]
fn is_zero_u32(value: &u32) -> bool { *value == 0 }
#[allow(dead_code)]
fn is_zero_i64(value: &i64) -> bool { *value == 0 }
#[allow(dead_code)]
fn is_zero_u64(value: &u64) -> bool { *value == 0 }
#[allow(dead_code)]
fn is_zero_f32(value: &f32) -> bool { *value == 0.0 }
#[allow(dead_code)]
fn is_zero_f64(value: &f64) -> bool { *value == 0.0 }
/// OnBinaryMessageRequest is the request provided when a binary message is received.
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct OnBinaryMessageRequest {
/// ConnectionID is the unique identifier for the WebSocket connection that received the message.
#[serde(default)]
pub connection_id: String,
/// Data is the binary data received from the WebSocket, encoded as base64.
#[serde(default)]
pub data: String,
}
/// OnCloseRequest is the request provided when a WebSocket connection is closed.
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct OnCloseRequest {
/// ConnectionID is the unique identifier for the WebSocket connection that was closed.
#[serde(default)]
pub connection_id: String,
/// Code is the WebSocket close status code (e.g., 1000 for normal closure,
/// 1001 for going away, 1006 for abnormal closure).
#[serde(default)]
pub code: i32,
/// Reason is the human-readable reason for the connection closure, if provided.
#[serde(default)]
pub reason: String,
}
/// OnErrorRequest is the request provided when an error occurs on a WebSocket connection.
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct OnErrorRequest {
/// ConnectionID is the unique identifier for the WebSocket connection where the error occurred.
#[serde(default)]
pub connection_id: String,
/// Error is the error message describing what went wrong.
#[serde(default)]
pub error: String,
}
/// OnTextMessageRequest is the request provided when a text message is received.
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct OnTextMessageRequest {
/// ConnectionID is the unique identifier for the WebSocket connection that received the message.
#[serde(default)]
pub connection_id: String,
/// Message is the text message content received from the WebSocket.
#[serde(default)]
pub message: String,
}
/// Error represents an error from a capability method.
#[derive(Debug)]
pub struct Error {
pub message: String,
}
impl std::fmt::Display for Error {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
write!(f, "{}", self.message)
}
}
impl std::error::Error for Error {}
impl Error {
pub fn new(message: impl Into<String>) -> Self {
Self { message: message.into() }
}
}
/// TextMessageProvider provides the OnTextMessage function.
pub trait TextMessageProvider {
fn on_text_message(&self, req: OnTextMessageRequest) -> Result<(), Error>;
}
/// Register the on_text_message export.
/// This macro generates the WASM export function for this method.
#[macro_export]
macro_rules! register_websocket_text_message {
($plugin_type:ty) => {
#[extism_pdk::plugin_fn]
pub fn nd_websocket_on_text_message(
req: extism_pdk::Json<$crate::websocket::OnTextMessageRequest>
) -> extism_pdk::FnResult<()> {
let plugin = <$plugin_type>::default();
$crate::websocket::TextMessageProvider::on_text_message(&plugin, req.into_inner())?;
Ok(())
}
};
}
/// BinaryMessageProvider provides the OnBinaryMessage function.
pub trait BinaryMessageProvider {
fn on_binary_message(&self, req: OnBinaryMessageRequest) -> Result<(), Error>;
}
/// Register the on_binary_message export.
/// This macro generates the WASM export function for this method.
#[macro_export]
macro_rules! register_websocket_binary_message {
($plugin_type:ty) => {
#[extism_pdk::plugin_fn]
pub fn nd_websocket_on_binary_message(
req: extism_pdk::Json<$crate::websocket::OnBinaryMessageRequest>
) -> extism_pdk::FnResult<()> {
let plugin = <$plugin_type>::default();
$crate::websocket::BinaryMessageProvider::on_binary_message(&plugin, req.into_inner())?;
Ok(())
}
};
}
/// ErrorProvider provides the OnError function.
pub trait ErrorProvider {
fn on_error(&self, req: OnErrorRequest) -> Result<(), Error>;
}
/// Register the on_error export.
/// This macro generates the WASM export function for this method.
#[macro_export]
macro_rules! register_websocket_error {
($plugin_type:ty) => {
#[extism_pdk::plugin_fn]
pub fn nd_websocket_on_error(
req: extism_pdk::Json<$crate::websocket::OnErrorRequest>
) -> extism_pdk::FnResult<()> {
let plugin = <$plugin_type>::default();
$crate::websocket::ErrorProvider::on_error(&plugin, req.into_inner())?;
Ok(())
}
};
}
/// CloseProvider provides the OnClose function.
pub trait CloseProvider {
fn on_close(&self, req: OnCloseRequest) -> Result<(), Error>;
}
/// Register the on_close export.
/// This macro generates the WASM export function for this method.
#[macro_export]
macro_rules! register_websocket_close {
($plugin_type:ty) => {
#[extism_pdk::plugin_fn]
pub fn nd_websocket_on_close(
req: extism_pdk::Json<$crate::websocket::OnCloseRequest>
) -> extism_pdk::FnResult<()> {
let plugin = <$plugin_type>::default();
$crate::websocket::CloseProvider::on_close(&plugin, req.into_inner())?;
Ok(())
}
};
}