UNPKG

woaru

Version:

Universal Project Setup Autopilot - Analyze and automatically configure development tools for ANY programming language

160 lines 5.93 kB
import { BasePlugin } from './BasePlugin.js'; export class RustPlugin extends BasePlugin { name = 'Rust'; frameworks = ['rust', 'actix', 'rocket', 'tokio']; canHandle(analysis) { return (analysis.language === 'Rust' || analysis.configFiles.some(file => file.includes('Cargo.toml') || file.includes('Cargo.lock'))); } getRecommendations(analysis) { const recommendations = []; // Clippy for linting (comes with Rust) recommendations.push({ tool: 'clippy', category: 'linting', reason: "Rust's official linter with hundreds of helpful suggestions", packages: [], configFiles: ['clippy.toml'], priority: 'high', }); // rustfmt for formatting (comes with Rust) recommendations.push({ tool: 'rustfmt', category: 'formatting', reason: 'Official Rust code formatter for consistent style', packages: [], configFiles: ['rustfmt.toml'], priority: 'high', }); // Pre-commit hooks if (!this.hasConfigFile(analysis, '.pre-commit-config.yaml')) { recommendations.push({ tool: 'pre-commit-rust', category: 'git-hooks', reason: 'Run Rust checks before committing code', packages: [], configFiles: ['.pre-commit-config.yaml'], priority: 'medium', }); } // cargo-audit for security recommendations.push({ tool: 'cargo-audit', category: 'security', reason: 'Audit Cargo.lock for crates with security vulnerabilities', packages: [], configFiles: [], priority: 'high', }); // cargo-deny for dependency management recommendations.push({ tool: 'cargo-deny', category: 'dependency-management', reason: 'Lint your dependencies for licenses, duplicates, and security', packages: [], configFiles: ['deny.toml'], priority: 'medium', }); // cargo-tarpaulin for test coverage if (!this.hasPackage(analysis, 'tarpaulin')) { recommendations.push({ tool: 'cargo-tarpaulin', category: 'test-coverage', reason: 'Code coverage reporting tool for Rust', packages: [], configFiles: [], priority: 'medium', }); } // cargo-watch for development recommendations.push({ tool: 'cargo-watch', category: 'development', reason: 'Watch for changes and automatically run cargo commands', packages: [], configFiles: [], priority: 'low', }); return recommendations; } getRefactorSuggestions(analysis) { const suggestions = []; const rustFiles = analysis.structure.filter(file => file.endsWith('.rs')); rustFiles.forEach(file => { // Web framework specific suggestions if (analysis.framework.includes('actix')) { if (file.includes('handler') || file.includes('route')) { suggestions.push({ filename: file, suggestion: 'Use actix-web extractors for clean request handling', type: 'best-practice', }); } } if (analysis.framework.includes('rocket')) { if (file.includes('route')) { suggestions.push({ filename: file, suggestion: "Use Rocket's request guards for validation and auth", type: 'best-practice', }); } } // Async suggestions if (analysis.framework.includes('tokio')) { suggestions.push({ filename: file, suggestion: 'Use async/await syntax consistently throughout async functions', type: 'performance', }); } // Test suggestions if (file.includes('test') || file.includes('tests')) { suggestions.push({ filename: file, suggestion: 'Use #[tokio::test] for async tests in tokio applications', type: 'best-practice', }); } // Main file suggestions if (file === 'main.rs') { suggestions.push({ filename: file, suggestion: 'Consider using #[tokio::main] for async main functions', type: 'best-practice', }); } // Error handling suggestions if (file.includes('error') || file.includes('err')) { suggestions.push({ filename: file, suggestion: 'Use the ? operator for clean error propagation', type: 'best-practice', }); suggestions.push({ filename: file, suggestion: 'Consider using thiserror or anyhow for better error handling', type: 'maintainability', }); } }); return suggestions; } getSpecificPackages() { return [ 'serde', 'tokio', 'actix-web', 'rocket', 'clap', 'log', 'env_logger', 'anyhow', 'thiserror', 'reqwest', 'sqlx', 'diesel', ]; } } //# sourceMappingURL=RustPlugin.js.map