Something went wrong. Try again.
A human-friendly DSL for ATProto Lexicons forked from stavola.xyz/mlf
Something went wrong. Try again.
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495use 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 <namespace> --save"); println!(" 3. Check your lexicons: mlf check"); println!(" 4. Generate code: mlf generate");
Ok(())}
fn prompt_package_name() -> Result<String, std::io::Error> { 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}") }}