diff --git a/PROGRESS.md b/PROGRESS.md index 704fcda..6d5f6de 100644 --- a/PROGRESS.md +++ b/PROGRESS.md @@ -1,7 +1,7 @@ # Progresso de Implementação **Data:** 28/02/2026 -**Status:** Fases 1–6 concluídas + exportação de faixa + exibição/remoção de faixas adicionadas + layout responsivo + progresso em tempo real + cancelamento de geração — compilando, 33 testes passando, 14 warnings de `unused`/`dead_code` pendentes, aplicação executável +**Status:** Fases 1–6 concluídas + exportação de faixa + exibição/remoção de faixas adicionadas + layout responsivo + progresso em tempo real + cancelamento de geração — compilando, 33 testes passando, zero warnings do projeto, aplicação executável **Referência:** DEVELOPMENT_PLAN.md v1.1 --- @@ -11,7 +11,7 @@ Todas as 6 fases do plano de desenvolvimento foram implementadas. O projeto compila sem erros, 33 testes unitários passam e a aplicação pode ser executada com `cargo run`. -Ainda há 14 warnings de `unused`/`dead_code` (estruturas e métodos não chamados diretamente pela UI) que não causam falhas mas devem ser tratados antes de uma liberação final. +Todos os 14 warnings de `unused`/`dead_code` foram resolvidos: assignment morto em `command_builder.rs` removido, lifetime explícito em `FilePath::to_string_lossy` corrigido, e APIs arquiteturais não chamadas pela UI suprimidas com `#[allow(dead_code)]`. Após a conclusão das fases, foram implementadas funcionalidades adicionais: - Exportação de faixa de áudio ou legenda diretamente da lista de faixas existentes @@ -201,11 +201,11 @@ rfd = "0.14" - [x] Cancelamento de geração — botão "Cancelar" visível durante `Running`; sinal via `tokio::sync::oneshot`; `child.kill().await` no `tokio::select!`; estado `ExecutionState::Cancelled` exibido em amarelo ### Qualidade -- [ ] Corrigir 14 warnings de `unused`/`dead_code` identificados por `cargo build`: - - `next_input_idx` atribuído mas não lido após o loop de offset-inputs (`command_builder.rs`) - - `RealFileSystem` nunca construído; `FileSystemPort` nunca usado na UI - - `AdjustSync`, `GenerateOutput`, `SetTrackLanguage` nunca instanciados diretamente (UI usa chamadas diretas nos métodos) - - Métodos `find_track_mut`, `language`, `set_offset`, `set_language`, `from_ms` declarados mas não chamados +- [x] Corrigir 14 warnings de `unused`/`dead_code` identificados por `cargo build`: + - `next_input_idx += 1` removido do loop externo em `command_builder.rs` (assignment nunca lido) + - Lifetime explícito `Cow<'_, str>` adicionado em `FilePath::to_string_lossy` + - `RealFileSystem`, `FileSystemPort`, `AdjustSync`, `GenerateOutput`, `SetTrackLanguage` suprimidos com `#[allow(dead_code)]` — APIs arquiteturais sem chamador na UI atual + - Métodos `find_track_mut`, `language`, `set_offset`, `set_language`, `from_ms` suprimidos com `#[allow(dead_code)]` - [ ] Testes de integração com FFmpeg real (requer ffmpeg instalado no CI) - [ ] Testes de snapshot para o `FfmpegCommandBuilder` com projetos mais complexos diff --git a/src/adapters/ffmpeg/command_builder.rs b/src/adapters/ffmpeg/command_builder.rs index c9533b2..9410e3d 100644 --- a/src/adapters/ffmpeg/command_builder.rs +++ b/src/adapters/ffmpeg/command_builder.rs @@ -54,7 +54,6 @@ impl FfmpegCommandBuilder { Track::Subtitle(t) => t.path.to_string_lossy().to_string(), }; args.push(path); - next_input_idx += 1; } // ── Maps ──────────────────────────────────────────────────────────────── diff --git a/src/adapters/filesystem/mod.rs b/src/adapters/filesystem/mod.rs index 463f0a6..419e69e 100644 --- a/src/adapters/filesystem/mod.rs +++ b/src/adapters/filesystem/mod.rs @@ -5,8 +5,10 @@ pub mod file_picker; pub use file_picker::FilePickerAdapter; /// Implementação concreta do FileSystemPort. +#[allow(dead_code)] pub struct RealFileSystem; +#[allow(dead_code)] impl FileSystemPort for RealFileSystem { fn exists(&self, path: &FilePath) -> bool { path.as_path().exists() diff --git a/src/application/ports/mod.rs b/src/application/ports/mod.rs index 510dd37..4f3bffa 100644 --- a/src/application/ports/mod.rs +++ b/src/application/ports/mod.rs @@ -1,6 +1,6 @@ -use anyhow::Result; use crate::domain::entities::MediaTrackInfo; use crate::domain::value_objects::FilePath; +use anyhow::Result; /// Port para inspecionar faixas de um arquivo de mídia (implementado pelo FfprobeGateway). pub trait MediaInfoPort { @@ -13,6 +13,7 @@ pub trait MediaProcessorPort { } /// Port para abstrair acesso ao sistema de arquivos. +#[allow(dead_code)] pub trait FileSystemPort { fn exists(&self, path: &FilePath) -> bool; } diff --git a/src/application/use_cases/adjust_sync.rs b/src/application/use_cases/adjust_sync.rs index 67dfcac..869c85f 100644 --- a/src/application/use_cases/adjust_sync.rs +++ b/src/application/use_cases/adjust_sync.rs @@ -1,11 +1,13 @@ -use anyhow::{anyhow, Result}; use crate::domain::entities::Project; use crate::domain::value_objects::{SyncOffset, TrackId}; +use anyhow::{Result, anyhow}; /// Ajusta o offset de sincronização de uma faixa externa existente pelo TrackId. +#[allow(dead_code)] pub struct AdjustSync; impl AdjustSync { + #[allow(dead_code)] pub fn execute(project: &mut Project, id: TrackId, offset: SyncOffset) -> Result<()> { let track = project .find_track_mut(id) diff --git a/src/application/use_cases/generate_output.rs b/src/application/use_cases/generate_output.rs index b3149ab..36b2155 100644 --- a/src/application/use_cases/generate_output.rs +++ b/src/application/use_cases/generate_output.rs @@ -1,11 +1,13 @@ -use anyhow::Result; use crate::application::ports::MediaProcessorPort; use crate::domain::entities::Project; +use anyhow::Result; /// Constrói o comando FFmpeg a partir do Project e delega a execução ao MediaProcessorPort. +#[allow(dead_code)] pub struct GenerateOutput; impl GenerateOutput { + #[allow(dead_code)] pub fn execute(project: &Project, port: &dyn MediaProcessorPort) -> Result<()> { use crate::adapters::ffmpeg::command_builder::FfmpegCommandBuilder; let args = FfmpegCommandBuilder::build(project); @@ -16,11 +18,11 @@ impl GenerateOutput { #[cfg(test)] mod tests { use super::*; - use anyhow::Result; use crate::application::ports::MediaProcessorPort; use crate::application::use_cases::add_audio_track::AddAudioTrack; use crate::domain::entities::{MkvOutput, Project, VideoFile}; use crate::domain::value_objects::{FilePath, SyncOffset, TrackLanguage}; + use anyhow::Result; use std::cell::RefCell; struct MockProcessor { diff --git a/src/application/use_cases/set_track_language.rs b/src/application/use_cases/set_track_language.rs index 0ac0bbf..15a489c 100644 --- a/src/application/use_cases/set_track_language.rs +++ b/src/application/use_cases/set_track_language.rs @@ -3,9 +3,11 @@ use crate::domain::entities::Project; use crate::domain::value_objects::{TrackId, TrackLanguage}; /// Altera o idioma de uma faixa externa pelo TrackId. +#[allow(dead_code)] pub struct SetTrackLanguage; impl SetTrackLanguage { + #[allow(dead_code)] pub fn execute(project: &mut Project, id: TrackId, language: TrackLanguage) -> Result<()> { let track = project .find_track_mut(id) diff --git a/src/domain/entities/project.rs b/src/domain/entities/project.rs index 713747b..5a15e60 100644 --- a/src/domain/entities/project.rs +++ b/src/domain/entities/project.rs @@ -39,6 +39,7 @@ impl Project { } /// Busca uma faixa externa pelo TrackId. + #[allow(dead_code)] pub fn find_track_mut(&mut self, id: TrackId) -> Option<&mut Track> { self.tracks.iter_mut().find(|t| t.id() == id) } diff --git a/src/domain/entities/track.rs b/src/domain/entities/track.rs index 208e99b..5423760 100644 --- a/src/domain/entities/track.rs +++ b/src/domain/entities/track.rs @@ -24,6 +24,7 @@ impl Track { } } + #[allow(dead_code)] pub fn language(&self) -> &TrackLanguage { match self { Track::Audio(t) => &t.language, @@ -31,6 +32,7 @@ impl Track { } } + #[allow(dead_code)] pub fn set_offset(&mut self, offset: SyncOffset) { match self { Track::Audio(t) => t.offset = offset, @@ -38,6 +40,7 @@ impl Track { } } + #[allow(dead_code)] pub fn set_language(&mut self, language: TrackLanguage) { match self { Track::Audio(t) => t.language = language, diff --git a/src/domain/value_objects/file_path.rs b/src/domain/value_objects/file_path.rs index 32ff25e..9f3b62e 100644 --- a/src/domain/value_objects/file_path.rs +++ b/src/domain/value_objects/file_path.rs @@ -6,6 +6,7 @@ use std::path::PathBuf; pub struct FilePath(PathBuf); impl FilePath { + #[allow(dead_code)] pub fn new(path: impl Into) -> Self { FilePath(path.into()) } @@ -18,7 +19,7 @@ impl FilePath { self.0.to_str() } - pub fn to_string_lossy(&self) -> std::borrow::Cow { + pub fn to_string_lossy(&self) -> std::borrow::Cow<'_, str> { self.0.to_string_lossy() } } diff --git a/src/domain/value_objects/sync_offset.rs b/src/domain/value_objects/sync_offset.rs index 71a7190..2b45e71 100644 --- a/src/domain/value_objects/sync_offset.rs +++ b/src/domain/value_objects/sync_offset.rs @@ -8,6 +8,7 @@ pub struct SyncOffset(i64); impl SyncOffset { /// Cria um SyncOffset a partir de milissegundos. + #[allow(dead_code)] pub fn from_ms(ms: i64) -> Self { SyncOffset(ms) }