feat: atualiza status do progresso de implementação e resolve warnings de código não utilizado

This commit is contained in:
2026-02-28 15:11:19 -03:00
parent 7c9da9626a
commit de747368a3
11 changed files with 27 additions and 13 deletions
+7 -7
View File
@@ -1,7 +1,7 @@
# Progresso de Implementação # Progresso de Implementação
**Data:** 28/02/2026 **Data:** 28/02/2026
**Status:** Fases 16 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 16 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 **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, 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`. 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: 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 - 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 - [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 ### Qualidade
- [ ] Corrigir 14 warnings de `unused`/`dead_code` identificados por `cargo build`: - [x] 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`) - `next_input_idx += 1` removido do loop externo em `command_builder.rs` (assignment nunca lido)
- `RealFileSystem` nunca construído; `FileSystemPort` nunca usado na UI - Lifetime explícito `Cow<'_, str>` adicionado em `FilePath::to_string_lossy`
- `AdjustSync`, `GenerateOutput`, `SetTrackLanguage` nunca instanciados diretamente (UI usa chamadas diretas nos métodos) - `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` declarados mas não chamados - 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 integração com FFmpeg real (requer ffmpeg instalado no CI)
- [ ] Testes de snapshot para o `FfmpegCommandBuilder` com projetos mais complexos - [ ] Testes de snapshot para o `FfmpegCommandBuilder` com projetos mais complexos
-1
View File
@@ -54,7 +54,6 @@ impl FfmpegCommandBuilder {
Track::Subtitle(t) => t.path.to_string_lossy().to_string(), Track::Subtitle(t) => t.path.to_string_lossy().to_string(),
}; };
args.push(path); args.push(path);
next_input_idx += 1;
} }
// ── Maps ──────────────────────────────────────────────────────────────── // ── Maps ────────────────────────────────────────────────────────────────
+2
View File
@@ -5,8 +5,10 @@ pub mod file_picker;
pub use file_picker::FilePickerAdapter; pub use file_picker::FilePickerAdapter;
/// Implementação concreta do FileSystemPort. /// Implementação concreta do FileSystemPort.
#[allow(dead_code)]
pub struct RealFileSystem; pub struct RealFileSystem;
#[allow(dead_code)]
impl FileSystemPort for RealFileSystem { impl FileSystemPort for RealFileSystem {
fn exists(&self, path: &FilePath) -> bool { fn exists(&self, path: &FilePath) -> bool {
path.as_path().exists() path.as_path().exists()
+2 -1
View File
@@ -1,6 +1,6 @@
use anyhow::Result;
use crate::domain::entities::MediaTrackInfo; use crate::domain::entities::MediaTrackInfo;
use crate::domain::value_objects::FilePath; use crate::domain::value_objects::FilePath;
use anyhow::Result;
/// Port para inspecionar faixas de um arquivo de mídia (implementado pelo FfprobeGateway). /// Port para inspecionar faixas de um arquivo de mídia (implementado pelo FfprobeGateway).
pub trait MediaInfoPort { pub trait MediaInfoPort {
@@ -13,6 +13,7 @@ pub trait MediaProcessorPort {
} }
/// Port para abstrair acesso ao sistema de arquivos. /// Port para abstrair acesso ao sistema de arquivos.
#[allow(dead_code)]
pub trait FileSystemPort { pub trait FileSystemPort {
fn exists(&self, path: &FilePath) -> bool; fn exists(&self, path: &FilePath) -> bool;
} }
+3 -1
View File
@@ -1,11 +1,13 @@
use anyhow::{anyhow, Result};
use crate::domain::entities::Project; use crate::domain::entities::Project;
use crate::domain::value_objects::{SyncOffset, TrackId}; use crate::domain::value_objects::{SyncOffset, TrackId};
use anyhow::{Result, anyhow};
/// Ajusta o offset de sincronização de uma faixa externa existente pelo TrackId. /// Ajusta o offset de sincronização de uma faixa externa existente pelo TrackId.
#[allow(dead_code)]
pub struct AdjustSync; pub struct AdjustSync;
impl AdjustSync { impl AdjustSync {
#[allow(dead_code)]
pub fn execute(project: &mut Project, id: TrackId, offset: SyncOffset) -> Result<()> { pub fn execute(project: &mut Project, id: TrackId, offset: SyncOffset) -> Result<()> {
let track = project let track = project
.find_track_mut(id) .find_track_mut(id)
+4 -2
View File
@@ -1,11 +1,13 @@
use anyhow::Result;
use crate::application::ports::MediaProcessorPort; use crate::application::ports::MediaProcessorPort;
use crate::domain::entities::Project; use crate::domain::entities::Project;
use anyhow::Result;
/// Constrói o comando FFmpeg a partir do Project e delega a execução ao MediaProcessorPort. /// Constrói o comando FFmpeg a partir do Project e delega a execução ao MediaProcessorPort.
#[allow(dead_code)]
pub struct GenerateOutput; pub struct GenerateOutput;
impl GenerateOutput { impl GenerateOutput {
#[allow(dead_code)]
pub fn execute(project: &Project, port: &dyn MediaProcessorPort) -> Result<()> { pub fn execute(project: &Project, port: &dyn MediaProcessorPort) -> Result<()> {
use crate::adapters::ffmpeg::command_builder::FfmpegCommandBuilder; use crate::adapters::ffmpeg::command_builder::FfmpegCommandBuilder;
let args = FfmpegCommandBuilder::build(project); let args = FfmpegCommandBuilder::build(project);
@@ -16,11 +18,11 @@ impl GenerateOutput {
#[cfg(test)] #[cfg(test)]
mod tests { mod tests {
use super::*; use super::*;
use anyhow::Result;
use crate::application::ports::MediaProcessorPort; use crate::application::ports::MediaProcessorPort;
use crate::application::use_cases::add_audio_track::AddAudioTrack; use crate::application::use_cases::add_audio_track::AddAudioTrack;
use crate::domain::entities::{MkvOutput, Project, VideoFile}; use crate::domain::entities::{MkvOutput, Project, VideoFile};
use crate::domain::value_objects::{FilePath, SyncOffset, TrackLanguage}; use crate::domain::value_objects::{FilePath, SyncOffset, TrackLanguage};
use anyhow::Result;
use std::cell::RefCell; use std::cell::RefCell;
struct MockProcessor { struct MockProcessor {
@@ -3,9 +3,11 @@ use crate::domain::entities::Project;
use crate::domain::value_objects::{TrackId, TrackLanguage}; use crate::domain::value_objects::{TrackId, TrackLanguage};
/// Altera o idioma de uma faixa externa pelo TrackId. /// Altera o idioma de uma faixa externa pelo TrackId.
#[allow(dead_code)]
pub struct SetTrackLanguage; pub struct SetTrackLanguage;
impl SetTrackLanguage { impl SetTrackLanguage {
#[allow(dead_code)]
pub fn execute(project: &mut Project, id: TrackId, language: TrackLanguage) -> Result<()> { pub fn execute(project: &mut Project, id: TrackId, language: TrackLanguage) -> Result<()> {
let track = project let track = project
.find_track_mut(id) .find_track_mut(id)
+1
View File
@@ -39,6 +39,7 @@ impl Project {
} }
/// Busca uma faixa externa pelo TrackId. /// Busca uma faixa externa pelo TrackId.
#[allow(dead_code)]
pub fn find_track_mut(&mut self, id: TrackId) -> Option<&mut Track> { pub fn find_track_mut(&mut self, id: TrackId) -> Option<&mut Track> {
self.tracks.iter_mut().find(|t| t.id() == id) self.tracks.iter_mut().find(|t| t.id() == id)
} }
+3
View File
@@ -24,6 +24,7 @@ impl Track {
} }
} }
#[allow(dead_code)]
pub fn language(&self) -> &TrackLanguage { pub fn language(&self) -> &TrackLanguage {
match self { match self {
Track::Audio(t) => &t.language, Track::Audio(t) => &t.language,
@@ -31,6 +32,7 @@ impl Track {
} }
} }
#[allow(dead_code)]
pub fn set_offset(&mut self, offset: SyncOffset) { pub fn set_offset(&mut self, offset: SyncOffset) {
match self { match self {
Track::Audio(t) => t.offset = offset, Track::Audio(t) => t.offset = offset,
@@ -38,6 +40,7 @@ impl Track {
} }
} }
#[allow(dead_code)]
pub fn set_language(&mut self, language: TrackLanguage) { pub fn set_language(&mut self, language: TrackLanguage) {
match self { match self {
Track::Audio(t) => t.language = language, Track::Audio(t) => t.language = language,
+2 -1
View File
@@ -6,6 +6,7 @@ use std::path::PathBuf;
pub struct FilePath(PathBuf); pub struct FilePath(PathBuf);
impl FilePath { impl FilePath {
#[allow(dead_code)]
pub fn new(path: impl Into<PathBuf>) -> Self { pub fn new(path: impl Into<PathBuf>) -> Self {
FilePath(path.into()) FilePath(path.into())
} }
@@ -18,7 +19,7 @@ impl FilePath {
self.0.to_str() self.0.to_str()
} }
pub fn to_string_lossy(&self) -> std::borrow::Cow<str> { pub fn to_string_lossy(&self) -> std::borrow::Cow<'_, str> {
self.0.to_string_lossy() self.0.to_string_lossy()
} }
} }
+1
View File
@@ -8,6 +8,7 @@ pub struct SyncOffset(i64);
impl SyncOffset { impl SyncOffset {
/// Cria um SyncOffset a partir de milissegundos. /// Cria um SyncOffset a partir de milissegundos.
#[allow(dead_code)]
pub fn from_ms(ms: i64) -> Self { pub fn from_ms(ms: i64) -> Self {
SyncOffset(ms) SyncOffset(ms)
} }