use crate::config::{MlfConfig, init_mlf_cache}; use std::io::Write; pub fn run_init(skip_prompts: bool) -> Result<(), std::io::Error> { let current_dir = std::env::current_dir()?; let config_path = current_dir.join("mlf.toml"); if config_path.exists() { eprintln!("mlf.toml already exists in current directory"); eprintln!("Remove it first if you want to reinitialize"); return Err(std::io::Error::new( std::io::ErrorKind::AlreadyExists, "mlf.toml already exists", )); } if !skip_prompts { println!("Initialize MLF project in {}?", current_dir.display()); println!("This will create:"); println!(" - mlf.toml (project configuration)"); println!(" - .mlf/ (cache directory for fetched lexicons)"); println!(); print!("Continue? (y/n): "); std::io::stdout().flush()?; let mut input = String::new(); std::io::stdin().read_line(&mut input)?; if input.trim().to_lowercase() != "y" { println!("Cancelled"); return Ok(()); } } // Collect the package NSID prefix. let package_name = if skip_prompts { // --yes was passed; derive a best-effort placeholder the user can // edit. Tying this to the directory name is a better starting // point than a magic constant. default_package_name(¤t_dir) } else { prompt_package_name()? }; let config = MlfConfig::create(&config_path, package_name) .map_err(|e| std::io::Error::other(e.to_string()))?; println!("✓ Created mlf.toml (package `{}`)", config.package.name); init_mlf_cache(¤t_dir)?; println!("✓ Initialized .mlf/ directory"); println!(); println!("Project initialized successfully!"); println!(); println!("Next steps:"); println!(" 1. Create MLF files in ./lexicons/"); println!(" 2. Fetch dependencies: mlf fetch --save"); println!(" 3. Check your lexicons: mlf check"); println!(" 4. Generate code: mlf generate"); Ok(()) } fn prompt_package_name() -> Result { loop { print!("Package NSID prefix (e.g. com.example.forum): "); std::io::stdout().flush()?; let mut input = String::new(); std::io::stdin().read_line(&mut input)?; let trimmed = input.trim(); if trimmed.is_empty() { eprintln!("A package name is required (at least two dot-separated segments)."); continue; } if !trimmed.contains('.') { eprintln!("Expected a dot-separated NSID prefix (e.g. com.example.forum)."); continue; } return Ok(trimmed.to_string()); } } fn default_package_name(dir: &std::path::Path) -> String { let dir_name = dir .file_name() .and_then(|s| s.to_str()) .unwrap_or("package"); if dir_name.contains('.') { dir_name.to_string() } else { format!("example.{dir_name}") } }