♻️ refactor(pmowebrenderer): factoriser handlers et supprimer duplications
- 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
This commit is contained in:
108
.kilo/plans/1775386308232-quick-orchid.md
Normal file
108
.kilo/plans/1775386308232-quick-orchid.md
Normal file
@@ -0,0 +1,108 @@
|
||||
# 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_action` dé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)?` et `add_action(&mut svc, Arc::new(action))?`
|
||||
|
||||
**Solution**:
|
||||
1. Supprimer les closures locales redéclarées (lignes 150-181)
|
||||
2. Utiliser directement les fonctions helpers du haut du fichier
|
||||
3. Créer une macro ou fonction utilitaire pour les appels répétés:
|
||||
```rust
|
||||
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 identique
|
||||
- `next_handler`, `previous_handler` (lignes 74-95): clones
|
||||
- Handlers GET (lignes 166-317): pattern `state.clone()` + `Box::pin(async move { ... set!() ... })` dupliqué
|
||||
|
||||
**Solution**:
|
||||
1. Créer un helper générique:
|
||||
```rust
|
||||
fn make_state_handler<F>(state: SharedState, f: F) -> ActionHandler
|
||||
where F: FnOnce(&mut ActionData, &RendererState) -> Result<ActionData, ActionError> + Send + 'static
|
||||
```
|
||||
2. 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_handler` extraction metadata
|
||||
- Lignes 146-151: `set_next_uri_handler` extraction metadata (identique)
|
||||
|
||||
**Solution**:
|
||||
1. Extraire en fonction utilitaire:
|
||||
```rust
|
||||
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) appelle `get_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:
|
||||
```rust
|
||||
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_instance` selon 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é
|
||||
|
||||
1. **Phase 1**: Helpers dans `renderer.rs` (les plus simples)
|
||||
2. **Phase 2**: Handlers dans `handlers.rs` (plus complexe, nécessite macro)
|
||||
3. **Phase 3**: Méthodes pipeline dans `registry.rs`
|
||||
4. **Phase 4**: Feature flags
|
||||
|
||||
## Vérification
|
||||
Après chaque phase, exécuter:
|
||||
```bash
|
||||
cargo check --package pmowebrenderer
|
||||
```
|
||||
Reference in New Issue
Block a user