website-htmx-rustelo-code/scripts/setup/setup-menus.sh

437 lines
10 KiB
Bash
Raw Permalink Normal View History

2026-07-10 03:44:13 +01:00
#!/bin/bash
# Menu Configuration Setup Script
# This script helps configure and validate menu files for the flexible menu system
set -e
# Colors for output
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m' # No Color
# Default paths
DEFAULT_MENU_DIR="content/menus"
DEFAULT_CONFIG_FILE="content/menu.toml"
# Print colored output
print_info() {
echo -e "${BLUE}[INFO]${NC} $1"
}
print_success() {
echo -e "${GREEN}[SUCCESS]${NC} $1"
}
print_warning() {
echo -e "${YELLOW}[WARNING]${NC} $1"
}
print_error() {
echo -e "${RED}[ERROR]${NC} $1"
}
# Show help
show_help() {
cat << EOF
Menu Configuration Setup Script
USAGE:
$0 [COMMAND] [OPTIONS]
COMMANDS:
setup Set up menu configuration with prompts
validate Validate existing menu files
create Create new menu files from templates
env Show environment variable configuration
test Test menu loading functionality
help Show this help message
OPTIONS:
--menu-dir DIR Custom menu directory (default: $DEFAULT_MENU_DIR)
--config FILE Custom config file (default: $DEFAULT_CONFIG_FILE)
--lang LANG Language code for operations (default: en,es)
--force Force overwrite existing files
--quiet Minimal output
EXAMPLES:
$0 setup # Interactive setup
$0 validate # Validate all menu files
$0 create --lang fr # Create French menu template
$0 env --menu-dir /custom/path # Show env vars for custom path
$0 test --lang es # Test Spanish menu loading
ENVIRONMENT VARIABLES:
MENU_DIR Custom menu directory
MENU_CONFIG_PATH Path to default menu config
EOF
}
# Parse command line arguments
parse_args() {
COMMAND=""
MENU_DIR="$DEFAULT_MENU_DIR"
CONFIG_FILE="$DEFAULT_CONFIG_FILE"
LANGUAGES="en es"
FORCE=false
QUIET=false
while [[ $# -gt 0 ]]; do
case $1 in
setup|validate|create|env|test|help)
COMMAND="$1"
shift
;;
--menu-dir)
MENU_DIR="$2"
shift 2
;;
--config)
CONFIG_FILE="$2"
shift 2
;;
--lang)
LANGUAGES="$2"
shift 2
;;
--force)
FORCE=true
shift
;;
--quiet)
QUIET=true
shift
;;
*)
print_error "Unknown option: $1"
show_help
exit 1
;;
esac
done
if [[ -z "$COMMAND" ]]; then
COMMAND="help"
fi
}
# Check if required tools are available
check_dependencies() {
local missing_deps=()
if ! command -v toml &> /dev/null; then
missing_deps+=("toml")
fi
if [[ ${#missing_deps[@]} -gt 0 ]]; then
print_warning "Missing optional dependencies: ${missing_deps[*]}"
print_info "Install with: cargo install toml-cli"
fi
}
# Create menu directory if it doesn't exist
ensure_menu_dir() {
if [[ ! -d "$MENU_DIR" ]]; then
print_info "Creating menu directory: $MENU_DIR"
mkdir -p "$MENU_DIR"
fi
}
# Create a sample menu file for a language
create_menu_template() {
local lang="$1"
local file_path="$MENU_DIR/$lang.toml"
if [[ -f "$file_path" && "$FORCE" != true ]]; then
print_warning "Menu file already exists: $file_path (use --force to overwrite)"
return 1
fi
local menu_content
case "$lang" in
"en")
menu_content='# English Menu Configuration
[[menu]]
route = "/"
label = "Home"
is_external = false
[[menu]]
route = "/about"
label = "About"
is_external = false
[[menu]]
route = "/services"
label = "Services"
is_external = false
[[menu]]
route = "/contact"
label = "Contact"
is_external = false
[[menu]]
route = "https://github.com/your-repo"
label = "GitHub"
is_external = true'
;;
"es")
menu_content='# Spanish Menu Configuration
[[menu]]
route = "/"
label = "Inicio"
is_external = false
[[menu]]
route = "/about"
label = "Acerca de"
is_external = false
[[menu]]
route = "/services"
label = "Servicios"
is_external = false
[[menu]]
route = "/contact"
label = "Contacto"
is_external = false
[[menu]]
route = "https://github.com/your-repo"
label = "GitHub"
is_external = true'
;;
*)
menu_content="# $lang Menu Configuration
[[menu]]
route = \"/\"
label = \"Home\"
is_external = false
[[menu]]
route = \"/about\"
label = \"About\"
is_external = false"
;;
esac
echo "$menu_content" > "$file_path"
print_success "Created menu template: $file_path"
}
# Validate a TOML file
validate_toml_file() {
local file_path="$1"
if [[ ! -f "$file_path" ]]; then
print_error "File not found: $file_path"
return 1
fi
# Basic TOML validation if toml command is available
if command -v toml &> /dev/null; then
if toml get "$file_path" . &> /dev/null; then
print_success "Valid TOML: $file_path"
else
print_error "Invalid TOML: $file_path"
return 1
fi
else
# Basic check for common issues
if grep -q "^\[\[menu\]\]" "$file_path"; then
print_success "Basic validation passed: $file_path"
else
print_warning "No [[menu]] sections found in: $file_path"
fi
fi
# Check required fields
if ! grep -q "route.*=" "$file_path"; then
print_warning "No 'route' fields found in: $file_path"
fi
if ! grep -q "label.*=" "$file_path"; then
print_warning "No 'label' fields found in: $file_path"
fi
}
# Validate all menu files
validate_menus() {
local valid_count=0
local total_count=0
print_info "Validating menu files in: $MENU_DIR"
if [[ -d "$MENU_DIR" ]]; then
for file in "$MENU_DIR"/*.toml; do
if [[ -f "$file" ]]; then
total_count=$((total_count + 1))
if validate_toml_file "$file"; then
valid_count=$((valid_count + 1))
fi
fi
done
fi
# Validate default config file
if [[ -f "$CONFIG_FILE" ]]; then
total_count=$((total_count + 1))
if validate_toml_file "$CONFIG_FILE"; then
valid_count=$((valid_count + 1))
fi
fi
if [[ $total_count -eq 0 ]]; then
print_warning "No menu files found to validate"
else
print_info "Validation complete: $valid_count/$total_count files valid"
fi
}
# Set up interactive menu configuration
setup_interactive() {
print_info "Menu Configuration Setup"
echo
# Ask for menu directory
read -p "Menu directory [$MENU_DIR]: " user_menu_dir
if [[ -n "$user_menu_dir" ]]; then
MENU_DIR="$user_menu_dir"
fi
# Ask for languages
read -p "Languages to configure [$LANGUAGES]: " user_languages
if [[ -n "$user_languages" ]]; then
LANGUAGES="$user_languages"
fi
# Create directory
ensure_menu_dir
# Create menu files for each language
for lang in $LANGUAGES; do
print_info "Creating menu for language: $lang"
create_menu_template "$lang"
done
# Show environment variables
echo
print_info "Environment variable configuration:"
echo "export MENU_DIR=\"$(realpath "$MENU_DIR")\""
echo "export MENU_CONFIG_PATH=\"$(realpath "$CONFIG_FILE")\""
echo
print_success "Menu setup complete!"
print_info "Next steps:"
echo " 1. Edit the generated menu files in: $MENU_DIR"
echo " 2. Set environment variables (shown above)"
echo " 3. Test with: $0 test"
}
# Show environment variable configuration
show_env_config() {
print_info "Environment Variable Configuration"
echo
echo "# Set custom menu directory"
echo "export MENU_DIR=\"$(realpath "$MENU_DIR")\""
echo
echo "# Set custom default menu config"
echo "export MENU_CONFIG_PATH=\"$(realpath "$CONFIG_FILE")\""
echo
echo "# Current values:"
echo "MENU_DIR=${MENU_DIR:-'(not set)'}"
echo "MENU_CONFIG_PATH=${MENU_CONFIG_PATH:-'(not set)'}"
}
# Test menu loading functionality
test_menu_loading() {
print_info "Testing menu loading functionality"
# Test with cargo if available
if command -v cargo &> /dev/null && [[ -f "Cargo.toml" ]]; then
print_info "Running Rust menu loading test..."
# Create a simple test
cat > /tmp/test_menu_loading.rs << 'EOF'
use shared::{load_menu_for_language, load_menu_toml};
fn main() -> Result<(), Box<dyn std::error::Error>> {
println!("Testing default menu loading...");
match load_menu_toml() {
Ok(menu) => println!("✓ Default menu loaded with {} items", menu.menu.len()),
Err(e) => println!("✗ Failed to load default menu: {}", e),
}
for lang in &["en", "es"] {
println!("Testing {} menu loading...", lang);
match load_menu_for_language(lang) {
Ok(menu) => println!("✓ {} menu loaded with {} items", lang, menu.menu.len()),
Err(e) => println!("✗ Failed to load {} menu: {}", lang, e),
}
}
Ok(())
}
EOF
# Note: This would require the shared crate to be available
print_info "Test file created at /tmp/test_menu_loading.rs"
print_info "To run: cargo run --bin test_menu_loading"
else
print_info "Manual testing steps:"
echo " 1. Set environment variables:"
echo " export MENU_DIR=\"$(realpath "$MENU_DIR")\""
echo " 2. Run your application"
echo " 3. Check logs for menu loading messages"
fi
}
# Create new menu files
create_menus() {
ensure_menu_dir
for lang in $LANGUAGES; do
print_info "Creating menu template for: $lang"
create_menu_template "$lang"
done
}
# Main function
main() {
parse_args "$@"
[[ "$QUIET" != true ]] && check_dependencies
case "$COMMAND" in
"setup")
setup_interactive
;;
"validate")
validate_menus
;;
"create")
create_menus
;;
"env")
show_env_config
;;
"test")
test_menu_loading
;;
"help"|*)
show_help
;;
esac
}
# Run main function with all arguments
main "$@"