338 lines
13 KiB
Plaintext
338 lines
13 KiB
Plaintext
![]() |
// 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();
|