- Remplacer les Arc+Box::pin manuels par la macro action_handler!(captures(...)) - Supprimer helpers locaux dupliqués dans renderer.rs (add_var, add_action) - Extraire handlers génériques pour GET requests - Factoriser extraction metadata dans set_uri_handler /set_next_uriHandler - Simplifier build_renderingcontrol en retirant pipeline inutile - Mettre à jour edition Rust de 2021 vers 2024 dans tous les Cargo.toml - Corriger pattern matching inutile `ref` sur déréférencement dans pmoaudio et pmoflac
3.2 KiB
3.2 KiB
Plan: Suppression des duplications dans @pmowebrenderer
Objectif
Éliminer les redondances de code identifiées lors de l'audit.
Duplication 1: Helper functions dupliquées dans renderer.rs
Fichiers affectés: src/renderer.rs
Problème:
- Lignes 17-54:
add_arg_in,add_arg_out,add_var,add_actiondéfinies - Lignes 150-181: Dans
build_avtransport(), réimplémentation locale avec closures|svc, var| { ... } - Répétition de 20+ appels
add_var(&mut svc, &VAR)?etadd_action(&mut svc, Arc::new(action))?
Solution:
- Supprimer les closures locales redéclarées (lignes 150-181)
- Utiliser directement les fonctions helpers du haut du fichier
- Créer une macro ou fonction utilitaire pour les appels répétés:
macro_rules! add_vars { ($svc:expr, $($var:expr),*) => { $({ add_var($svc, &$var)?; })* }; }
Duplication 2: Pattern handlers boilerplate dans handlers.rs
Fichiers affectés: src/handlers.rs
Problème:
play_handler,stop_handler,pause_handler(lignes 23-71): structure identiquenext_handler,previous_handler(lignes 74-95): clones- Handlers GET (lignes 166-317): pattern
state.clone()+Box::pin(async move { ... set!() ... })dupliqué
Solution:
- Créer un helper générique:
fn make_state_handler<F>(state: SharedState, f: F) -> ActionHandler where F: FnOnce(&mut ActionData, &RendererState) -> Result<ActionData, ActionError> + Send + 'static - Factoriser les closures
let state = state.clone()dans chaque handler
Duplication 3: Extraction metadata dupliquée
Fichiers affectés: src/handlers.rs
Problème:
- Lignes 118-123:
set_uri_handlerextraction metadata - Lignes 146-151:
set_next_uri_handlerextraction metadata (identique)
Solution:
- Extraire en fonction utilitaire:
fn extract_metadata(data: &ActionData, key: &str) -> String { ... }
Duplication 4: Méthodes pipeline dans registry.rs
Fichiers affectés: src/registry.rs
Problème:
send_pipeline_command(lignes 272-279) appelleget_pipeline(lignes 281-283)load_uri(lignes 286-290),send_play_command(lignes 293-296),send_pause_command(lignes 299-301) sont des wrappers quasi-identiques
Solution: Consolider en méthodes génériques:
pub async fn send_command(&self, instance_id: &str, cmd: PipelineControl) {
if let Some(pipeline) = self.get_pipeline(instance_id) {
pipeline.send(cmd).await;
}
}
Duplication 5: Feature flags avec code dupliqué
Fichiers affectés: src/registry.rs
Problème:
- Lignes 51-68 et 334-395: double impl de
create_instanceselon feature
Solution:
- Extraire la logique commune dans une fonction privée
- Utiliser
#[cfg]seulement pour les différences (appel à pmoserver)
Ordre de traitement suggéré
- Phase 1: Helpers dans
renderer.rs(les plus simples) - Phase 2: Handlers dans
handlers.rs(plus complexe, nécessite macro) - Phase 3: Méthodes pipeline dans
registry.rs - Phase 4: Feature flags
Vérification
Après chaque phase, exécuter:
cargo check --package pmowebrenderer