Rustelo/scripts/config_wizard.rhai

338 lines
13 KiB
Plaintext
Raw Normal View History

2025-07-07 23:53:50 +01:00
// Configuration Wizard Script for Rustelo Template
// This script interactively generates config.toml and sets Cargo.toml features
// Configuration structure
let config = #{
features: #{},
server: #{},
database: #{},
auth: #{},
oauth: #{},
email: #{},
security: #{},
monitoring: #{},
ssl: #{},
cache: #{},
build_info: #{}
};
// Available features with descriptions
let available_features = #{
auth: "Authentication and authorization system",
tls: "TLS/SSL support for secure connections",
rbac: "Role-based access control",
crypto: "Cryptographic utilities and encryption",
content_db: "Content management and database features",
email: "Email sending capabilities",
metrics: "Prometheus metrics collection",
examples: "Include example code and documentation",
production: "Production-ready configuration (includes: auth, content-db, crypto, email, metrics, tls)"
};
// Helper function to ask yes/no questions
fn ask_yes_no(question) {
print(question + " (y/n): ");
let answer = input();
return answer.to_lower() == "y" || answer.to_lower() == "yes";
}
// Helper function to ask for string input
fn ask_string(question, default_value) {
if default_value != "" {
print(question + " [" + default_value + "]: ");
} else {
print(question + ": ");
}
let answer = input();
return if answer == "" { default_value } else { answer };
}
// Helper function to ask for numeric input
fn ask_number(question, default_value) {
print(question + " [" + default_value + "]: ");
let answer = input();
return if answer == "" { default_value } else { parse_int(answer) };
}
// Main configuration wizard
fn run_wizard() {
print("=== Rustelo Configuration Wizard ===\n");
print("This wizard will help you configure your Rustelo application.\n");
// Ask about features
print("\n--- Feature Selection ---");
print("Select the features you want to enable:\n");
let selected_features = [];
for feature in available_features.keys() {
let description = available_features[feature];
if ask_yes_no("Enable " + feature + "? (" + description + ")") {
selected_features.push(feature);
}
}
config.features = selected_features;
// Basic server configuration
print("\n--- Server Configuration ---");
config.server.host = ask_string("Server host", "127.0.0.1");
config.server.port = ask_number("Server port", 3030);
config.server.environment = ask_string("Environment (dev/prod/test)", "dev");
config.server.workers = ask_number("Number of workers", 4);
// Database configuration (if content-db feature is enabled)
if selected_features.contains("content-db") {
print("\n--- Database Configuration ---");
config.database.url = ask_string("Database URL", "sqlite:rustelo.db");
config.database.max_connections = ask_number("Max database connections", 10);
config.database.enable_logging = ask_yes_no("Enable database query logging");
}
// Authentication configuration (if auth feature is enabled)
if selected_features.contains("auth") {
print("\n--- Authentication Configuration ---");
config.auth.jwt_secret = ask_string("JWT secret (leave empty for auto-generation)", "");
config.auth.session_timeout = ask_number("Session timeout (minutes)", 60);
config.auth.max_login_attempts = ask_number("Max login attempts", 5);
config.auth.require_email_verification = ask_yes_no("Require email verification");
// OAuth configuration
if ask_yes_no("Enable OAuth providers?") {
config.oauth.enabled = true;
if ask_yes_no("Enable Google OAuth?") {
config.oauth.google = #{
client_id: ask_string("Google OAuth Client ID", ""),
client_secret: ask_string("Google OAuth Client Secret", ""),
redirect_uri: ask_string("Google OAuth Redirect URI", "http://localhost:3030/auth/google/callback")
};
}
if ask_yes_no("Enable GitHub OAuth?") {
config.oauth.github = #{
client_id: ask_string("GitHub OAuth Client ID", ""),
client_secret: ask_string("GitHub OAuth Client Secret", ""),
redirect_uri: ask_string("GitHub OAuth Redirect URI", "http://localhost:3030/auth/github/callback")
};
}
}
}
// Email configuration (if email feature is enabled)
if selected_features.contains("email") {
print("\n--- Email Configuration ---");
config.email.smtp_host = ask_string("SMTP host", "localhost");
config.email.smtp_port = ask_number("SMTP port", 587);
config.email.smtp_username = ask_string("SMTP username", "");
config.email.smtp_password = ask_string("SMTP password", "");
config.email.from_email = ask_string("From email address", "noreply@localhost");
config.email.from_name = ask_string("From name", "Rustelo App");
}
// Security configuration
print("\n--- Security Configuration ---");
config.security.enable_csrf = ask_yes_no("Enable CSRF protection");
config.security.rate_limit_requests = ask_number("Rate limit requests per minute", 100);
config.security.bcrypt_cost = ask_number("BCrypt cost (4-31)", 12);
// SSL/TLS configuration (if tls feature is enabled)
if selected_features.contains("tls") {
print("\n--- SSL/TLS Configuration ---");
config.ssl.force_https = ask_yes_no("Force HTTPS");
config.ssl.cert_path = ask_string("SSL certificate path", "");
config.ssl.key_path = ask_string("SSL private key path", "");
}
// Monitoring configuration (if metrics feature is enabled)
if selected_features.contains("metrics") {
print("\n--- Monitoring Configuration ---");
config.monitoring.enabled = ask_yes_no("Enable monitoring");
if config.monitoring.enabled {
config.monitoring.metrics_port = ask_number("Metrics port", 9090);
config.monitoring.prometheus_enabled = ask_yes_no("Enable Prometheus metrics");
}
}
// Cache configuration
print("\n--- Cache Configuration ---");
config.cache.enabled = ask_yes_no("Enable caching");
if config.cache.enabled {
config.cache.type = ask_string("Cache type (memory/redis)", "memory");
config.cache.default_ttl = ask_number("Default TTL (seconds)", 3600);
}
// Build information
config.build_info.environment = config.server.environment;
config.build_info.config_version = "1.0.0";
return config;
}
// Generate TOML configuration
fn generate_toml(config) {
let toml_content = "";
// Root configuration
toml_content += "# Rustelo Configuration File\n";
toml_content += "# Generated by Configuration Wizard\n\n";
toml_content += "root_path = \".\"\n\n";
// Features section
toml_content += "[features]\n";
if config.features.contains("auth") {
toml_content += "auth = true\n";
}
toml_content += "\n";
// Server section
toml_content += "[server]\n";
toml_content += "protocol = \"http\"\n";
toml_content += "host = \"" + config.server.host + "\"\n";
toml_content += "port = " + config.server.port + "\n";
toml_content += "environment = \"" + config.server.environment + "\"\n";
toml_content += "workers = " + config.server.workers + "\n";
toml_content += "\n";
// Database section
if config.database != () {
toml_content += "[database]\n";
toml_content += "url = \"" + config.database.url + "\"\n";
toml_content += "max_connections = " + config.database.max_connections + "\n";
toml_content += "enable_logging = " + config.database.enable_logging + "\n";
toml_content += "\n";
}
// Authentication section
if config.auth != () {
toml_content += "[auth]\n";
if config.auth.jwt_secret != "" {
toml_content += "jwt_secret = \"" + config.auth.jwt_secret + "\"\n";
}
toml_content += "session_timeout = " + config.auth.session_timeout + "\n";
toml_content += "max_login_attempts = " + config.auth.max_login_attempts + "\n";
toml_content += "require_email_verification = " + config.auth.require_email_verification + "\n";
toml_content += "\n";
}
// OAuth section
if config.oauth != () && config.oauth.enabled {
toml_content += "[oauth]\n";
toml_content += "enabled = true\n\n";
if config.oauth.google != () {
toml_content += "[oauth.google]\n";
toml_content += "client_id = \"" + config.oauth.google.client_id + "\"\n";
toml_content += "client_secret = \"" + config.oauth.google.client_secret + "\"\n";
toml_content += "redirect_uri = \"" + config.oauth.google.redirect_uri + "\"\n\n";
}
if config.oauth.github != () {
toml_content += "[oauth.github]\n";
toml_content += "client_id = \"" + config.oauth.github.client_id + "\"\n";
toml_content += "client_secret = \"" + config.oauth.github.client_secret + "\"\n";
toml_content += "redirect_uri = \"" + config.oauth.github.redirect_uri + "\"\n\n";
}
}
// Email section
if config.email != () {
toml_content += "[email]\n";
toml_content += "smtp_host = \"" + config.email.smtp_host + "\"\n";
toml_content += "smtp_port = " + config.email.smtp_port + "\n";
toml_content += "smtp_username = \"" + config.email.smtp_username + "\"\n";
toml_content += "smtp_password = \"" + config.email.smtp_password + "\"\n";
toml_content += "from_email = \"" + config.email.from_email + "\"\n";
toml_content += "from_name = \"" + config.email.from_name + "\"\n";
toml_content += "\n";
}
// Security section
toml_content += "[security]\n";
toml_content += "enable_csrf = " + config.security.enable_csrf + "\n";
toml_content += "rate_limit_requests = " + config.security.rate_limit_requests + "\n";
toml_content += "bcrypt_cost = " + config.security.bcrypt_cost + "\n";
toml_content += "\n";
// SSL section
if config.ssl != () {
toml_content += "[ssl]\n";
toml_content += "force_https = " + config.ssl.force_https + "\n";
if config.ssl.cert_path != "" {
toml_content += "cert_path = \"" + config.ssl.cert_path + "\"\n";
}
if config.ssl.key_path != "" {
toml_content += "key_path = \"" + config.ssl.key_path + "\"\n";
}
toml_content += "\n";
}
// Monitoring section
if config.monitoring != () && config.monitoring.enabled {
toml_content += "[monitoring]\n";
toml_content += "enabled = true\n";
toml_content += "metrics_port = " + config.monitoring.metrics_port + "\n";
toml_content += "prometheus_enabled = " + config.monitoring.prometheus_enabled + "\n";
toml_content += "\n";
}
// Cache section
if config.cache != () && config.cache.enabled {
toml_content += "[cache]\n";
toml_content += "enabled = true\n";
toml_content += "type = \"" + config.cache.type + "\"\n";
toml_content += "default_ttl = " + config.cache.default_ttl + "\n";
toml_content += "\n";
}
// Build info section
toml_content += "[build_info]\n";
toml_content += "environment = \"" + config.build_info.environment + "\"\n";
toml_content += "config_version = \"" + config.build_info.config_version + "\"\n";
return toml_content;
}
// Generate Cargo.toml features
fn generate_cargo_features(selected_features) {
let features_line = "default = [";
for i in 0..selected_features.len() {
features_line += "\"" + selected_features[i] + "\"";
if i < selected_features.len() - 1 {
features_line += ", ";
}
}
features_line += "]";
return features_line;
}
// Main execution
fn main() {
let config = run_wizard();
print("\n=== Configuration Summary ===");
print("Selected features: " + config.features);
print("Server: " + config.server.host + ":" + config.server.port);
print("Environment: " + config.server.environment);
if ask_yes_no("\nGenerate configuration files?") {
let toml_content = generate_toml(config);
let cargo_features = generate_cargo_features(config.features);
print("\n=== Generated config.toml ===");
print(toml_content);
print("\n=== Cargo.toml default features ===");
print(cargo_features);
print("\nConfiguration generated successfully!");
print("Copy the above content to your config.toml and update your Cargo.toml accordingly.");
}
}
// Run the wizard
main();