refactor: split oversized modules into focused components#48
Merged
Conversation
Split the oversized ssh/client.rs (1,394 lines) into 6 focused modules: - config.rs (27 lines) - Connection configuration structures - core.rs (44 lines) - Core SshClient struct and constructor - result.rs (86 lines) - CommandResult struct and helper methods - command.rs (155 lines) - Command execution functionality - connection.rs (308 lines) - Connection management and authentication - file_transfer.rs (691 lines) - File and directory transfer operations - mod.rs (35 lines) - Public API exports Benefits: - Each module has a single, clear responsibility - Improved maintainability and testability - Easier code navigation and review - All files now under 700 lines (target: <500 for most) Also exported CommandExecutedResult from tokio_client module to support the refactored command execution logic. Related to #33 (Phase 1, file 1 of 4)
Split the 1,383-line interactive.rs file into 7 focused modules: - types.rs (142 lines): Core types (InteractiveCommand, InteractiveResult, NodeSession) - connection.rs (363 lines): SSH connection establishment logic - execution.rs (158 lines): Main execute() methods coordinating PTY and traditional modes - single_node.rs (228 lines): Single node interactive session handling - multiplex.rs (331 lines): Multi-node multiplexed session handling - commands.rs (152 lines): Special command parsing and handling - utils.rs (135 lines): Utility functions for prompts, paths, PTY detection - mod.rs (64 lines): Module exports and documentation Benefits: - Each module now under 400 lines for better maintainability - Clear separation of concerns (types, connection, execution, session modes) - Improved testability with isolated components - Better code navigation and understanding - Preserved all functionality and API compatibility Part of Phase 1.2 of the refactoring effort (issue #33).
Phase 1.3 of issue #33 refactoring effort. Split src/jump/chain.rs (1,113 lines) into focused modules: - chain/types.rs - JumpConnection, JumpInfo types and methods - chain/chain_connection.rs - Direct connection establishment - chain/tunnel.rs - SSH tunnel management for jump hosts - chain/auth.rs - Authentication handling for jump hosts - chain/cleanup.rs - Connection pool cleanup and management This modularization improves code maintainability and makes each component's responsibility clearer while preserving all existing functionality. Related to #33
Split the monolithic client.rs (1,079 lines) into focused, maintainable modules: - authentication.rs (378 lines): Authentication methods and server verification * AuthMethod enum with all authentication types * ServerCheckMethod for host key verification * authenticate() function for handling all auth types - connection.rs (293 lines): Connection establishment and management * Client struct with connection state * connect() and connect_with_config() methods * ClientHandler for server key verification * Connection lifecycle management (disconnect, is_closed) - channel_manager.rs (230 lines): SSH channel operations * get_channel() for opening new channels * execute() for command execution * request_interactive_shell() for PTY sessions * resize_pty() for terminal resizing * open_direct_tcpip_channel() for port forwarding * CommandExecutedResult struct - file_transfer.rs (285 lines): SFTP operations * upload_file() and download_file() * upload_dir() and download_dir() with recursion * Buffer pool integration for efficient transfers - mod.rs (32 lines): Public API exports * Re-exports all public types for backward compatibility * Maintains existing API surface All public APIs preserved for backward compatibility. Updated imports in jump host chain modules (auth.rs, tunnel.rs) to use new module structure. Fixes #33 Phase 1.4
- Split 823-line executor.rs into focused modules: - parallel.rs: Core ParallelExecutor logic (411 lines) - execution_strategy.rs: Task spawning and progress bars (256 lines) - connection_manager.rs: SSH connection setup (167 lines) - result_types.rs: ExecutionResult, UploadResult, DownloadResult (118 lines) - mod.rs: Public API exports (24 lines) - Maintains full API backward compatibility - All 150 tests continue to pass - No new clippy warnings in pedantic mode - Clear separation of concerns with focused module boundaries
- Split 926-line config.rs into focused modules: - types.rs: Configuration structs and enums (165 lines) - loader.rs: Loading and priority logic (235 lines) - resolver.rs: Node resolution and cluster handling (123 lines) - interactive.rs: Interactive config management (134 lines) - utils.rs: Utility functions (127 lines) - tests.rs: Test suite (241 lines) - mod.rs: Public API exports (29 lines) - Maintains full API backward compatibility - All tests continue to pass - Clear separation of concerns with logical module boundaries - Better organization of configuration functionality
…ents (Phase 2) ## main.rs refactoring (976 → 69 lines) Split the monolithic main.rs into focused modules: - app/mod.rs: Module exports and documentation - app/utils.rs: Utility functions (usage, duration formatting) - app/query.rs: SSH query options handler (-Q option) - app/cache.rs: Cache statistics and management - app/nodes.rs: Node resolution and filtering logic - app/initialization.rs: Application initialization and configuration - app/dispatcher.rs: Command routing and dispatch logic ## forwarding/dynamic.rs refactoring (830 → modular structure) Split the dynamic forwarding implementation into: - dynamic/mod.rs: Module exports and tests - dynamic/stats.rs: Statistics tracking (80 lines) - dynamic/socks.rs: SOCKS4/5 protocol handlers (256 lines) - dynamic/connection.rs: Connection management (173 lines) - dynamic/forwarder.rs: Main forwarder logic (279 lines) All tests pass and functionality remains fully backward compatible. This completes Phase 2 of the oversized module refactoring.
- Split 757-line file into focused modules: - config.rs: Cache configuration (74 lines) - entry.rs: Cache entry management (111 lines) - stats.rs: Statistics tracking (138 lines) - manager.rs: Core cache manager (492 lines) - maintenance.rs: Cache maintenance operations (136 lines) - global.rs: Global instance management (29 lines) - mod.rs: Module exports (27 lines) - Maintained full API backward compatibility - All tests passing, zero clippy errors - Part of Phase 3: Medium Priority files refactoring
- Split 717-line file into focused modules: - constants.rs: Terminal key sequences and buffers (105 lines) - terminal_modes.rs: Terminal mode configuration (91 lines) - input.rs: Input event handling (193 lines) - session_manager.rs: Core session management (381 lines) - mod.rs: Module exports (22 lines) - Maintained full API backward compatibility - All existing tests passing, zero clippy errors - Part of Phase 3: Medium Priority files refactoring
- ssh/ssh_config/env_cache.rs (656 lines) → 7 modules (avg ~100 lines each) - Core caching logic, configuration, entry management, global instance - Statistics tracking, validation, and maintenance operations - ssh/ssh_config/security.rs (653 lines) → 5 modules (avg ~150 lines each) - String validation for preventing command injection - Path validation with security checks - Separate checks for different file types - jump/parser.rs (613 lines) → 6 modules (avg ~120 lines each) - Configuration management, host structure, host parsing - Main parser logic separated from utilities - Renamed parser.rs to main_parser.rs to avoid module inception All tests pass, zero clippy errors. Maintains full backward compatibility.
- Remove unused imports in env_cache and security modules - Fix module_inception issues in test files by removing nested mod tests - Add conditional compilation for test-only exports - Ensure all 232+ tests pass with zero clippy warnings
- Add comprehensive "Issue #33 Refactoring Details" section documenting the large-scale refactoring of 13 critical/high/medium priority files - Update "Code Structure Evolution" with Phase 2 refactoring timeline - Document all refactored module structures in component sections: - CLI Interface (main.rs, app/*) - Configuration Management (config/*) - Parallel Executor (executor/*) - SSH Client (client/*, tokio_client/*) - SSH Configuration Caching (config_cache/*) - Environment Variable Caching (env_cache/*) - Interactive Mode (interactive/*) - PTY Session (session/*) - Jump Host Support (parser/*, chain/*) - Port Forwarding Dynamic (dynamic/*) - Add Phase 1-4 detailed breakdown with metrics and impact analysis - Document refactoring principles and lessons learned - Add 2025-10-17 entry to Development Timeline - Correct all dates to reflect actual PR timeline (2025-10-17)
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
This PR implements Phase 1, Phase 2, and Phase 3 of the large-scale refactoring effort to address issue #33. Thirteen critical and high-priority files have been successfully split into focused, maintainable modules while maintaining full API backward compatibility.
Phase 4 has been intentionally skipped based on thorough analysis showing that the remaining files (500-600 lines) are already well-structured and do not require refactoring.
Changes
Phase 1: Critical Priority Files (>1000 lines) ✅
ssh/client.rs (1,394 → 6 modules)
client/core.rs- Client struct and core functionality (44 lines)client/connection.rs- Connection establishment and management (308 lines)client/command.rs- Command execution logic (155 lines)client/file_transfer.rs- SFTP operations (691 lines)client/config.rs- Configuration types (27 lines)client/result.rs- Result types and implementations (86 lines)commands/interactive.rs (1,383 → 7 modules)
interactive/types.rs- Type definitions and enums (142 lines)interactive/connection.rs- Connection establishment (363 lines)interactive/single_node.rs- Single node interactive mode (228 lines)interactive/multiplex.rs- Multi-node multiplexing (331 lines)interactive/commands.rs- Command processing (152 lines)interactive/execution.rs- Command execution (158 lines)interactive/utils.rs- Helper functions (135 lines)jump/chain.rs (1,113 → 5 modules + 436 lines main)
chain/types.rs- Type definitions (133 lines)chain/chain_connection.rs- Chain connection logic (69 lines)chain/auth.rs- Authentication handling (260 lines)chain/tunnel.rs- Tunnel management (256 lines)chain/cleanup.rs- Resource cleanup (75 lines)chain.rs- Main chain orchestration (436 lines)ssh/tokio_client/client.rs (1,079 → 5 modules)
tokio_client/connection.rs- Connection management (293 lines)tokio_client/authentication.rs- Authentication methods (378 lines)tokio_client/channel_manager.rs- Channel operations (230 lines)tokio_client/file_transfer.rs- SFTP file operations (285 lines)tokio_client/mod.rs- Module exportsPhase 2: High Priority Files (800-1000 lines) ✅
executor.rs (823 → 5 modules)
executor/parallel.rs- ParallelExecutor core logic (412 lines)executor/execution_strategy.rs- Task spawning and progress bars (257 lines)executor/connection_manager.rs- SSH connection setup (168 lines)executor/result_types.rs- Result types (119 lines)executor/mod.rs- Public API exports (25 lines)config.rs (926 → 7 modules)
config/types.rs- Configuration structs and enums (166 lines)config/loader.rs- Loading and priority logic (236 lines)config/resolver.rs- Node resolution (124 lines)config/interactive.rs- Interactive config management (135 lines)config/utils.rs- Utility functions (125 lines)config/tests.rs- Test suite (239 lines)config/mod.rs- Public API exports (30 lines)main.rs (976 → 69 lines + 7 app modules)
main.rs- Clean entry point (69 lines)app/dispatcher.rs- Command routing and dispatch (368 lines)app/initialization.rs- App initialization and config loading (206 lines)app/nodes.rs- Node resolution and filtering (242 lines)app/cache.rs- Cache statistics and management (142 lines)app/query.rs- SSH query options handler (58 lines)app/utils.rs- Utility functions (62 lines)app/mod.rs- Module exports (25 lines)forwarding/dynamic.rs (830 → 5 modules)
dynamic/forwarder.rs- Main forwarder logic and retry mechanism (280 lines)dynamic/socks.rs- SOCKS4/5 protocol handlers (257 lines)dynamic/connection.rs- Connection management and lifecycle (174 lines)dynamic/stats.rs- Statistics tracking (83 lines)dynamic/mod.rs- Module exports and tests (173 lines)Phase 3: Medium Priority Files (600-800 lines) ✅
ssh/config_cache.rs (757 → 7 modules)
config_cache/manager.rs- Core cache manager (491 lines)config_cache/maintenance.rs- Cache maintenance operations (136 lines)config_cache/stats.rs- Statistics tracking (138 lines)config_cache/entry.rs- Cache entry management (111 lines)config_cache/config.rs- Cache configuration (74 lines)config_cache/global.rs- Global instance management (29 lines)config_cache/mod.rs- Module exports (27 lines)pty/session.rs (717 → 5 modules)
session/session_manager.rs- Core session management (381 lines)session/input.rs- Input event handling (193 lines)session/constants.rs- Terminal key sequences and buffers (105 lines)session/terminal_modes.rs- Terminal mode configuration (91 lines)session/mod.rs- Module exports (22 lines)ssh/ssh_config/env_cache.rs (656 → 8 modules)
env_cache/cache.rs- Core caching logic (237 lines)env_cache/tests.rs- Test suite (239 lines)env_cache/maintenance.rs- Maintenance operations (120 lines)env_cache/entry.rs- Cache entry management (58 lines)env_cache/validation.rs- Variable validation (51 lines)env_cache/global.rs- Global instance management (49 lines)env_cache/stats.rs- Statistics tracking (42 lines)env_cache/config.rs- Configuration structure (37 lines)env_cache/mod.rs- Module exportsssh/ssh_config/security.rs (653 → 5 modules)
security/string_validation.rs- Command injection prevention (286 lines)security/checks.rs- File type specific security checks (175 lines)security/tests.rs- Test suite (140 lines)security/path_validation.rs- Path security checks (115 lines)security/mod.rs- Module exports (28 lines)jump/parser.rs (613 → 6 modules)
parser/tests.rs- Test suite (343 lines)parser/host_parser.rs- Host and port parsing (141 lines)parser/main_parser.rs- Main parsing logic (79 lines)parser/host.rs- JumpHost data structure (63 lines)parser/config.rs- Jump host limits configuration (61 lines)parser/mod.rs- Module exports (29 lines)Phase 4: Lower Priority Files (500-600 lines) - Skipped ⏭️
Decision: Phase 4 refactoring has been intentionally skipped after thorough analysis.
Files evaluated but NOT refactored:
src/ssh/auth.rs(564 lines)src/forwarding/local.rs(543 lines)src/forwarding/remote.rs(542 lines)src/cli.rs(538 lines)src/forwarding/manager.rs(537 lines)src/ssh/ssh_config/parser.rs(535 lines)Rationale for skipping Phase 4:
Well-Structured Code: All Phase 4 files are already well-organized with clear single responsibilities:
cli.rs: 95% declarative clap macro code - splitting would reduce clarityssh/auth.rs: Cohesive authentication module with excellent documentationforwarding/*.rs: Each file handles one forwarding type (local/remote/dynamic/manager)Industry Standards: 500-600 lines is within acceptable range:
Risk vs Benefit Analysis:
Sufficient Improvement Already Achieved:
Maintaining Code Cohesion:
Conclusion: The codebase has reached an optimal balance between modularity and maintainability. Further splitting would introduce unnecessary complexity without meaningful benefits.
Key Achievements
client/file_transfer.rsat 691 lines)File Size Improvements
Phase 1 Results:
ssh/client.rs: 1,394 → largest module 691 lines (-50%)commands/interactive.rs: 1,383 → largest module 363 lines (-74%)jump/chain.rs: 1,113 → 436 lines + sub-modules (-61%)ssh/tokio_client/client.rs: 1,079 → largest module 378 lines (-65%)Phase 2 Results:
executor.rs: 823 → largest module 412 lines (-50%)config.rs: 926 → largest module 239 lines (-74%)main.rs: 976 → 69 lines + largest module 368 lines (-92% main, -62% overall)forwarding/dynamic.rs: 830 → largest module 280 lines (-66%)Phase 3 Results:
ssh/config_cache.rs: 757 → largest module 491 lines (-35%)pty/session.rs: 717 → largest module 381 lines (-47%)ssh/ssh_config/env_cache.rs: 656 → largest module 239 lines (-64%)ssh/ssh_config/security.rs: 653 → largest module 286 lines (-56%)jump/parser.rs: 613 → largest module 343 lines (tests) / 141 lines (code) (-77%)Testing
Code Statistics
Related Issues
Closes #33
Refactoring complete - All oversized modules (>800 lines) have been successfully split into maintainable components. Files in the 500-600 line range have been evaluated and determined to be well-structured with no refactoring needed.
Impact
Architecture
Each split follows clear architectural principles: