(args: &[String], cwd: &Path)
| 232 | } |
| 233 | |
| 234 | pub(crate) fn new_command(args: &[String], cwd: &Path) -> Result<(), String> { |
| 235 | if args |
| 236 | .iter() |
| 237 | .any(|a| a == "--build-scripts" || a == "--open" || a == "--no-open") |
| 238 | { |
| 239 | return Err("`perro new` only accepts --path and --name".to_string()); |
| 240 | } |
| 241 | let mut project_name = parse_flag_value(args, "--name"); |
| 242 | let mut base_dir_input = parse_flag_value(args, "--path"); |
| 243 | |
| 244 | if project_name.is_none() && base_dir_input.is_none() { |
| 245 | if !io::stdin().is_terminal() { |
| 246 | return Err( |
| 247 | "`perro new` without --name/--path needs interactive terminal input".to_string(), |
| 248 | ); |
| 249 | } |
| 250 | let input_name = prompt_text( |
| 251 | &format!("Project name [{DEFAULT_PROJECT_NAME}]: "), |
| 252 | Some(DEFAULT_PROJECT_NAME), |
| 253 | )?; |
| 254 | let input_root = prompt_text( |
| 255 | &format!("Project root folder [{}]: ", normalize_powershell_path(cwd)), |
| 256 | Some(&normalize_powershell_path(cwd)), |
| 257 | )?; |
| 258 | project_name = Some(input_name); |
| 259 | base_dir_input = Some(input_root); |
| 260 | } |
| 261 | |
| 262 | let base_dir = base_dir_input |
| 263 | .map(|p| resolve_local_path(&p, cwd)) |
| 264 | .unwrap_or_else(|| cwd.to_path_buf()); |
| 265 | let base_dir = base_dir.canonicalize().unwrap_or(base_dir); |
| 266 | let project_name = project_name.unwrap_or_else(|| DEFAULT_PROJECT_NAME.to_string()); |
| 267 | let project_dir = base_dir.join(sanitize_project_dir_name(&project_name)); |
| 268 | |
| 269 | create_new_project(&project_dir, &project_name).map_err(|err| { |
| 270 | format!( |
| 271 | "failed to create project at {}: {err}", |
| 272 | project_dir.display() |
| 273 | ) |
| 274 | })?; |
| 275 | update_workspace_vscode_linked_projects(&workspace_root(), &project_dir)?; |
| 276 | update_project_vscode_linked_projects(&project_dir)?; |
| 277 | |
| 278 | println!( |
| 279 | "created project `{}` at {}", |
| 280 | project_name, |
| 281 | normalize_powershell_path(&project_dir) |
| 282 | ); |
| 283 | maybe_open_project_in_new_window(&project_dir)?; |
| 284 | Ok(()) |
| 285 | } |
| 286 | |
| 287 | pub(crate) fn new_dlc_command(args: &[String], cwd: &Path) -> Result<(), String> { |
| 288 | let Some(raw_name) = parse_flag_value(args, "--name") else { |
no test coverage detected