Commit 7ef8461
committed
Merge #151: Refactor user_output.rs into folder module structure
3df3405 fix: resolve clippy linting warnings in user_output module (copilot-swe-agent[bot])
93e8f27 style: apply rustfmt to user_output module (copilot-swe-agent[bot])
d046477 refactor: convert user_output.rs to folder module structure (copilot-swe-agent[bot])
eaa57be Initial plan (copilot-swe-agent[bot])
Pull request description:
Refactor user_output.rs Module to Folder Structure
This PR refactors the monolithic `src/presentation/user_output.rs` file (4,226 lines) into a well-organized folder module structure following project conventions.
## Changes
### Module Structure
```
user_output/
├── mod.rs # Public API re-exports
├── core.rs # UserOutput implementation + tests (2533 lines)
├── theme.rs # Theme configuration + tests
├── verbosity.rs # VerbosityLevel + VerbosityFilter + tests
├── channel.rs # Channel enum
├── traits.rs # OutputMessage, FormatterOverride, OutputSink
├── messages/ # 7 message type implementations
│ ├── progress.rs
│ ├── success.rs
│ ├── warning.rs
│ ├── error.rs
│ ├── result.rs
│ ├── steps.rs # with builder
│ └── info_block.rs # with builder
├── sinks/ # 4 sink implementations
│ ├── writers.rs # StdoutWriter, StderrWriter (type-safe wrappers)
│ ├── standard.rs
│ ├── composite.rs
│ ├── file.rs
│ └── telemetry.rs
├── formatters/
│ └── json.rs # JsonFormatter
└── test_support.rs # TestWriter, TestUserOutput
```
### Backward Compatibility
All public APIs unchanged. Existing code using `UserOutput` continues to work without modifications:
```rust
// Still works exactly as before
use torrust_tracker_deployer_lib::presentation::user_output::{
UserOutput, VerbosityLevel, Theme, JsonFormatter, CompositeSink
};
```
### Test Organization
All 155 unit tests co-located in `core.rs` using `#[cfg(test)]` module. Tests depend only on types within `user_output` module, following project testing conventions.
### Visibility Management
- Writers (`StdoutWriter`, `StderrWriter`) scoped to `pub(in crate::presentation::user_output)` for internal type safety
- `VerbosityFilter` remains module-private
- All other types maintain original public visibility
## Impact
- **23 files** replacing single 4,226-line file
- **All modules < 500 lines** (except core.rs which includes comprehensive test suite)
- **No breaking changes** - all existing imports and APIs preserved
- **All linting checks pass** - clippy pedantic, rustfmt, and other linters
<!-- START COPILOT CODING AGENT SUFFIX -->
<details>
<summary>Original prompt</summary>
----
*This section details on the original issue you should resolve*
<issue_title>Refactor user_output.rs Module to Folder Structure</issue_title>
<issue_description># Refactor user_output.rs Module to Folder Structure
**Issue**: [#149](#149)
**Parent Epic**: [#102](#102) - User Output Architecture Improvements
**Specification**: [docs/issues/149-refactor-user-output-module-to-folder-structure.md](https://github.com/torrust/torrust-tracker-deployer/blob/main/docs/issues/149-refactor-user-output-module-to-folder-structure.md)
## Overview
The `src/presentation/user_output.rs` file has grown to **4,226 lines**, making it difficult to navigate and maintain. This task refactors the monolithic file into a well-organized folder module structure with focused, cohesive submodules that follow project conventions.
This refactoring improves:
- **Discoverability**: Clear separation makes it easier to find specific functionality
- **Maintainability**: Smaller, focused files are easier to understand and modify
- **Testability**: Tests are co-located with their code using `#[cfg(test)]` modules
- **Collaboration**: Multiple developers can work on different aspects simultaneously
- **Code Review**: Smaller, focused changes are easier to review
## Goals
- [ ] Convert `user_output.rs` to `user_output/` folder module
- [ ] Separate concerns into logical submodules
- [ ] Maintain backward compatibility (no public API changes)
- [ ] Ensure all tests pass without modification
- [ ] Follow project module organization conventions
- [ ] Improve code discoverability and navigation
## Proposed Structure
```text
src/presentation/user_output/
├── mod.rs # Public API, re-exports, module documentation
├── core.rs # UserOutput main struct and core impl
├── theme.rs # Theme struct and predefined themes
├── verbosity.rs # VerbosityLevel enum and VerbosityFilter
├── channel.rs # Channel enum
├── traits.rs # OutputMessage, FormatterOverride, OutputSink traits
├── messages/ # Message type implementations
│ ├── mod.rs
│ ├── progress.rs # ProgressMessage + tests
│ ├── success.rs # SuccessMessage + tests
│ ├── warning.rs # WarningMessage + tests
│ ├── error.rs # ErrorMessage + tests
│ ├── result.rs # ResultMessage + tests
│ ├── steps.rs # StepsMessage and builder + tests
│ └── info_block.rs # InfoBlockMessage and builder + tests
├── sinks/ # OutputSink implementations
│ ├── mod.rs
│ ├── standard.rs # StandardSink + tests
│ ├── composite.rs # CompositeSink + tests
│ ├── file.rs # FileSink + tests
│ ├── telemetry.rs # TelemetrySink + tests
│ └── writers.rs # StdoutWriter, StderrWriter wrappers + tests
├── formatters/ # FormatterOverride implementations
│ ├── mod.rs
│ └── json.rs # JsonFormatter + tests
└── test_support.rs # TestWriter, TestUserOutput (shared test utilities)
```
**Note on Test Organization**: All tests are **unit tests** that only depend on types within the `user_output` module. Following project conventions, they will be **co-located with their code** using `#[cfg(test)]` modules within each file. This improves discoverability and maintainability.
## Implementation Plan
### Phase 1: Create Folder Structure and Core Modules (1-2 hours)
- [ ] Create `src/presentation/user_output/` directory
- [ ] Create `mod.rs` with module documentation and structure outline
- [ ] Extract `Theme` to `theme.rs` with tests in `#[cfg(test)]` module
- [ ] Extract `VerbosityLevel` and `VerbosityFilter` to `verbosity.rs` with tests in `#[cfg(test)]` module
- [ ] Extract `Channel` to `channel.rs` with tests in `#[cfg(test)]` module
- [ ] Update `mod.rs` with re-exports for backward compatibility
- [ ] Verify existing code still compiles and all tests pass
### Phase 2: Extract Traits and Core Logic (1-2 hours)
- [ ] Extract `OutputMessage`, `FormatterOverride`, `OutputSink` to `traits.rs`
- [ ] Extract main `UserOutput` struct and methods to `core.rs`
- [ ] Update `mod.rs` with re-exports
- [ ] Verify all functionality works
### Phase 3: Organize Message Types (2-3 hours)
- [ ] Create `messages/` subdirectory
- [ ] Extract each message type to its own file with tests in `#[cfg(test)]` modules:
- [ ] `progress.rs` - `ProgressMessage` with tests
- [ ] `success.rs` - `SuccessMessage` with tests
- [ ] `warning.rs` - `WarningMessage` with tests
- [ ] `error.rs` - `ErrorMessage` with tests
- [ ] `result.rs` - `ResultMessage` with tests
- [ ] `steps.rs` - `StepsMessage`, `StepsMessageBuilder`, and tests
- [ ] `info_block.rs` - `InfoBlockMessage`, `InfoBlockMessageBuilder`, and tests
- [ ...
</details>
- Fixes #149
<!-- START COPILOT CODING AGENT TIPS -->
---
💡 You can make Copilot smarter by setting up custom instructions, customizing its development environment and configuring Model Context Protocol (MCP) servers. Learn more [Copilot coding agent tips](https://gh.io/copilot-coding-agent-tips) in the docs.
ACKs for top commit:
josecelano:
ACK 3df3405
Tree-SHA512: c0250865704b7d11eb957573d0c152ac217f5b13e3f44f1938a0ddb5af994aa94d17d47b343d4bc8ceed4d1235e6ed10ca012cb98fa44924222962cf25008ea2File tree
23 files changed
+1878
-1713
lines changed- src/presentation/user_output
- formatters
- messages
- sinks
23 files changed
+1878
-1713
lines changed| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
| 1 | + | |
| 2 | + | |
| 3 | + | |
| 4 | + | |
| 5 | + | |
| 6 | + | |
| 7 | + | |
| 8 | + | |
| 9 | + | |
| 10 | + | |
| 11 | + | |
| 12 | + | |
| 13 | + | |
| 14 | + | |
| 15 | + | |
| 16 | + | |
| 17 | + | |
| 18 | + | |
| 19 | + | |
| 20 | + | |
| 21 | + | |
| 22 | + | |
| 23 | + | |
| 24 | + | |
| 25 | + | |
| 26 | + | |
| 27 | + | |
0 commit comments