Correction des tests unitaires

This commit is contained in:
2025-10-09 22:36:33 +02:00
parent 982e5317fb
commit 4431a3b50b
13 changed files with 71 additions and 61 deletions

View File

@@ -99,14 +99,13 @@
//!
//! ### Exemple basique
//!
//! ```rust,no_run
//! ```rust,ignore
//! use pmoapp::Webapp;
//! use pmoserver::ServerBuilder;
//!
//! #[tokio::main]
//! async fn main() {
//! let mut server = ServerBuilder::new("MyApp")
//! .http_port(8080)
//! let mut server = ServerBuilder::new("MyApp", "http://localhost", 8080)
//! .build();
//!
//! // Ajouter la webapp comme Single Page Application
@@ -122,7 +121,7 @@
//!
//! ### Exemple avec logs SSE
//!
//! ```rust,no_run
//! ```rust,ignore
//! use pmoapp::Webapp;
//! use pmoserver::{ServerBuilder, logs::{LogState, SseLayer}};
//! use tracing_subscriber::{layer::SubscriberExt, util::SubscriberInitExt};
@@ -136,7 +135,7 @@
//! .with(SseLayer::new(log_state.clone()))
//! .init();
//!
//! let mut server = ServerBuilder::new("MyApp").build();
//! let mut server = ServerBuilder::new("MyApp", "http://localhost", 8080).build();
//!
//! // Endpoints SSE pour les logs
//! server.add_handler_with_state("/log-sse", pmoserver::logs::log_sse, log_state.clone()).await;
@@ -193,7 +192,7 @@
//!
//! Le composant LogView détecte automatiquement le XML dans les messages :
//!
//! ```
//! ```text
//! Input: "INFO: <?xml version=\"1.0\"?><scpd>...</scpd>"
//! Output: Bloc de code avec coloration syntaxique XML
//! ```
@@ -249,12 +248,12 @@ use std::pin::Pin;
///
/// ## Exemple
///
/// ```rust,no_run
/// ```rust,ignore
/// use pmoapp::{Webapp, WebAppExt};
/// use pmoserver::ServerBuilder;
///
/// # async fn example() {
/// let mut server = ServerBuilder::new("MyApp").build();
/// let mut server = ServerBuilder::new("MyApp", "http://localhost", 8080).build();
///
/// // Ajouter la webapp via le trait WebAppExt
/// server.add_webapp::<Webapp>("/app").await;

View File

@@ -12,12 +12,12 @@
//!
//! ## Exemple d'utilisation
//!
//! ```rust,no_run
//! ```rust,ignore
//! use pmoapp::{Webapp, WebAppExt};
//! use pmoserver::ServerBuilder;
//!
//! # async fn example() {
//! let mut server = ServerBuilder::new("MyApp").build();
//! let mut server = ServerBuilder::new("MyApp", "http://localhost", 8080).build();
//!
//! // Le trait WebAppExt est automatiquement disponible
//! server.add_webapp::<Webapp>("/app").await;

View File

@@ -23,21 +23,20 @@
//!
//! ## Exemple d'utilisation
//!
//! ```rust,no_run
//! ```rust,ignore
//! use pmoserver::{ServerBuilder, logs::{LogState, SseLayer}};
//! use tracing_subscriber::{layer::SubscriberExt, util::SubscriberInitExt};
//!
//! #[tokio::main]
//! async fn main() {
//! // Configuration des logs avec SSE
//! let log_state = LogState::new();
//! let log_state = LogState::new(1000);
//! tracing_subscriber::registry()
//! .with(SseLayer::new(log_state.clone()))
//! .init();
//!
//! // Création et démarrage du serveur
//! let mut server = ServerBuilder::new("MyServer")
//! .http_port(8080)
//! let mut server = ServerBuilder::new("MyServer", "http://localhost", 8080)
//! .build();
//!
//! // Ajout d'une route JSON
@@ -56,12 +55,12 @@
//! L'implémentation est fournie par `pmoupnp` (feature `pmoserver`), permettant
//! de connecter des devices UPnP sans que `pmoserver` dépende de `pmoupnp` :
//!
//! ```rust,no_run
//! ```rust,ignore
//! use pmoupnp::{UpnpServer, mediarenderer::MEDIA_RENDERER};
//! use pmoserver::ServerBuilder;
//!
//! # async fn example() {
//! let mut server = ServerBuilder::new("MediaRenderer").build();
//! let mut server = ServerBuilder::new("MediaRenderer", "http://localhost", 8080).build();
//! let device = MEDIA_RENDERER.create_instance();
//!
//! // Le trait UpnpServer est automatiquement disponible (implémenté dans pmoupnp)

View File

@@ -60,7 +60,7 @@ impl Server {
/// # Exemple
///
/// ```rust
/// # use pmoupnp::server::Server;
/// # use pmoserver::Server;
/// let server = Server::new("MyAPI", "http://localhost:3000", 3000);
/// ```
pub fn new(name: impl Into<String>, base_url: impl Into<String>, http_port: u16) -> Self {
@@ -94,8 +94,8 @@ impl Server {
///
/// # Exemple
///
/// ```rust,no_run
/// # use pmoupnp::server::Server;
/// ```rust,ignore
/// # use pmoserver::Server;
/// # #[tokio::main]
/// # async fn main() {
/// # let mut server = Server::new("Test", "http://localhost:3000", 3000);
@@ -218,8 +218,8 @@ impl Server {
///
/// # Exemple avec Vue.js
///
/// ```rust,no_run
/// # use pmoupnp::server::Server;
/// ```rust,ignore
/// # use pmoserver::Server;
/// # use rust_embed::RustEmbed;
/// #[derive(RustEmbed, Clone)]
/// #[folder = "webapp/dist"] // Build output de Vue.js
@@ -273,8 +273,8 @@ impl Server {
///
/// # Exemple
///
/// ```rust,no_run
/// # use pmoupnp::server::Server;
/// ```rust,ignore
/// # use pmoserver::Server;
/// # #[tokio::main]
/// # async fn main() {
/// # let mut server = Server::new("Test", "http://localhost:3000", 3000);
@@ -417,8 +417,8 @@ impl Server {
///
/// # Exemple
///
/// ```rust,no_run
/// # use pmoupnp::server::Server;
/// ```rust,ignore
/// # use pmoserver::Server;
/// # #[tokio::main]
/// # async fn main() {
/// # let mut server = Server::new("Test", "http://localhost:3000", 3000);
@@ -480,7 +480,7 @@ impl Server {
///
/// # Exemple
///
/// ```rust,no_run
/// ```rust,ignore
/// # use pmoserver::{ServerBuilder, logs::LoggingOptions};
/// # #[tokio::main]
/// # async fn main() {
@@ -550,7 +550,7 @@ impl ServerBuilder {
/// # Exemple
///
/// ```rust
/// # use pmoupnp::server::ServerBuilder;
/// # use pmoserver::ServerBuilder;
/// let mut server = ServerBuilder::new("MyAPI", "http://localhost:3000", 3000)
/// .build();
/// ```

View File

@@ -20,20 +20,21 @@
//!
//! ```rust
//! use pmoupnp::action_handler;
//! use pmoupnp::actions::ActionError;
//! use std::collections::HashMap;
//! use std::sync::Arc;
//!
//! // Créer un handler avec la macro
//! let handler = action_handler!(|data| {
//! let handler = action_handler!(|instance, data| {
//! // Traiter les données
//! data
//! Ok::<(), ActionError>(())
//! });
//!
//! // Ou manuellement
//! use pmoupnp::actions::{ActionData, ActionHandler};
//! let manual_handler: ActionHandler = Arc::new(|data| {
//! use pmoupnp::actions::{ActionData, ActionHandler, ActionInstance};
//! let manual_handler: ActionHandler = Arc::new(|instance, data| {
//! Box::pin(async move {
//! data
//! Ok::<(), ActionError>(())
//! })
//! });
//! ```
@@ -144,22 +145,24 @@ pub type ActionFuture = Pin<Box<dyn Future<Output = Result<(), crate::actions::A
///
/// ```rust
/// use pmoupnp::action_handler;
/// use pmoupnp::actions::ActionError;
///
/// let handler = action_handler!(|instance, data| {
/// // Logique métier - pas besoin de retourner quoi que ce soit
/// // Logique métier
/// Ok::<(), ActionError>(())
/// });
/// ```
///
/// ## Manuellement
///
/// ```rust,no_run
/// use pmoupnp::actions::{ActionData, ActionHandler, ActionInstance};
/// ```rust
/// use pmoupnp::actions::{ActionData, ActionHandler, ActionInstance, ActionError};
/// use std::sync::Arc;
///
/// let handler: ActionHandler = Arc::new(|instance, data| {
/// Box::pin(async move {
/// // Votre logique async
/// // Pas de return nécessaire
/// Ok::<(), ActionError>(())
/// })
/// });
/// ```

View File

@@ -122,8 +122,8 @@ impl ActionInstance {
///
/// # Examples
///
/// ```rust,no_run
/// # use pmoupnp::actions::Action;
/// ```rust
/// # use pmoupnp::actions::{Action, ActionInstance};
/// # use pmoupnp::UpnpInstance;
/// # use std::sync::Arc;
/// let action = Action::new("GetVolume".to_string());
@@ -192,7 +192,7 @@ impl ActionInstance {
/// # Examples
///
/// ```rust,no_run
/// # use pmoupnp::actions::{Action, ActionData};
/// # use pmoupnp::actions::{Action, ActionData, ActionInstance};
/// # use pmoupnp::UpnpInstance;
/// # use std::collections::HashMap;
/// # use std::sync::Arc;

View File

@@ -146,14 +146,14 @@ impl Action {
///
/// # Examples
///
/// ```rust,no_run
/// # use pmoupnp::actions::Action;
/// ```rust,ignore
/// # use pmoupnp::actions::{Action, ActionError};
/// # use pmoupnp::action_handler;
/// let mut action = Action::new("Play".to_string());
///
/// let custom_handler = action_handler!(|instance, data| {
/// // Logique personnalisée
/// data
/// Ok::<(), ActionError>(())
/// });
///
/// action.set_handler(custom_handler);

View File

@@ -66,6 +66,7 @@
//!
//! ```rust
//! use pmoupnp::mediarenderer::avtransport::AVTTRANSPORT;
//! use pmoupnp::UpnpTyped;
//!
//! // Accéder au service
//! let service = &*AVTTRANSPORT;

View File

@@ -51,7 +51,7 @@ impl<T: UpnpTypedObject> UpnpObjectSet<T> {
///
/// # Examples
///
/// ```
/// ```ignore
/// let set: UpnpObjectSet<MyObject> = UpnpObjectSet::new();
/// ```
pub fn new() -> Self {
@@ -73,7 +73,7 @@ impl<T: UpnpTypedObject> UpnpObjectSet<T> {
///
/// # Examples
///
/// ```
/// ```ignore
/// let mut set = UpnpObjectSet::new();
/// let obj = Arc::new(MyObject::new("test"));
/// set.insert(obj)?;
@@ -100,7 +100,7 @@ impl<T: UpnpTypedObject> UpnpObjectSet<T> {
///
/// # Examples
///
/// ```
/// ```ignore
/// let mut set = UpnpObjectSet::new();
/// let obj1 = Arc::new(MyObject::new("test"));
/// let obj2 = Arc::new(MyObject::new("test")); // Même nom
@@ -129,7 +129,7 @@ impl<T: UpnpTypedObject> UpnpObjectSet<T> {
///
/// # Examples
///
/// ```
/// ```ignore
/// let set = UpnpObjectSet::new();
/// let obj = Arc::new(MyObject::new("test"));
///
@@ -157,7 +157,7 @@ impl<T: UpnpTypedObject> UpnpObjectSet<T> {
///
/// # Examples
///
/// ```
/// ```ignore
/// let set = UpnpObjectSet::new();
///
/// if let Some(obj) = set.get_by_name("test") {
@@ -178,7 +178,7 @@ impl<T: UpnpTypedObject> UpnpObjectSet<T> {
///
/// # Examples
///
/// ```
/// ```ignore
/// let set = UpnpObjectSet::new();
///
/// for obj in set.all() {

View File

@@ -24,6 +24,7 @@
//! use pmoupnp::services::Service;
//! use pmoupnp::state_variables::StateVariable;
//! use pmoupnp::variable_types::StateVarType;
//! use pmoupnp::UpnpModel;
//! use std::sync::Arc;
//!
//! // Créer un service
@@ -306,6 +307,7 @@ impl Service {
///
/// ```rust
/// # use pmoupnp::services::Service;
/// # use pmoupnp::UpnpTyped;
/// let service = Service::new("AVTransport".to_string());
/// for var in service.variables() {
/// println!("Variable: {}", var.get_name());
@@ -347,6 +349,7 @@ impl Service {
///
/// ```rust
/// # use pmoupnp::services::Service;
/// # use pmoupnp::UpnpTyped;
/// let service = Service::new("AVTransport".to_string());
/// for action in service.actions() {
/// println!("Action: {}", action.get_name());

View File

@@ -77,9 +77,10 @@ pub const METHOD_UNSUBSCRIBE: &str = "UNSUBSCRIBE";
///
/// # Examples
///
/// ```rust,no_run
/// ```rust,ignore
/// # use pmoupnp::services::Service;
/// # use pmoupnp::server::Server;
/// # use pmoupnp::UpnpModel;
/// # use pmoserver::Server;
/// # use std::time::Duration;
/// # #[tokio::main]
/// # async fn main() {
@@ -337,9 +338,9 @@ impl ServiceInstance {
///
/// # Examples
///
/// ```rust,no_run
/// ```rust
/// # use pmoupnp::services::Service;
/// # use pmoupnp::UpnpModel;
/// # use pmoupnp::{UpnpModel, UpnpTyped};
/// # let service = Service::new("AVTransport".to_string());
/// # let instance = service.create_instance();
/// if let Some(action) = instance.get_action("Play") {
@@ -361,15 +362,15 @@ impl ServiceInstance {
///
/// # Examples
///
/// ```rust,no_run
/// ```rust
/// # use pmoupnp::services::Service;
/// # use pmoupnp::devices::Device;
/// # use pmoupnp::UpnpModel;
/// # use std::sync::Arc;
/// # let service = Service::new("AVTransport".to_string());
/// # let device = Device::new("MediaRenderer".to_string());
/// # let device = Device::new("MediaRenderer".to_string(), "urn:schemas-upnp-org:device:MediaRenderer:1".to_string(), "My MediaRenderer".to_string());
/// let service_instance = service.create_instance();
/// let device_instance = Arc::new(device.create_instance());
/// let device_instance = device.create_instance();
/// service_instance.set_device(device_instance);
/// ```
pub fn set_device(&self, device: Arc<DeviceInstance>) {

View File

@@ -21,6 +21,8 @@ use std::net::UdpSocket;
/// # Examples
///
/// ```
/// use pmoutils::guess_local_ip;
///
/// let ip = guess_local_ip();
/// println!("IP locale détectée: {}", ip);
/// // Affiche par exemple: "IP locale détectée: 192.168.1.42"
@@ -62,6 +64,8 @@ pub fn guess_local_ip() -> String {
/// # Examples
///
/// ```
/// use pmoutils::ip_utils::list_all_ips;
///
/// let ips = list_all_ips();
/// for (interface, addresses) in ips {
/// println!("Interface {}: {:?}", interface, addresses);

View File

@@ -10,12 +10,12 @@
/// # Examples
///
/// ```
/// use votre_crate::guess_local_ip;
/// use pmoutils::guess_local_ip;
///
/// let ip = guess_local_ip();
/// println!("Adresse IP locale: {}", ip);
/// ```
mod ip_utils;
pub mod ip_utils;
pub use ip_utils::guess_local_ip;