///|
fn ensure_workspace_file(project_root : String) -> Result[String?, String] {
  let path = join_path(project_root, "moon.work")
  if @fs.path_exists(path) {
    return Ok(None)
  }
  match
    replace_file_atomic(path, @utf8.encode(moon_work_text()[:], bom=false)) {
    Ok(_) => Ok(Some("created moon.work"))
    Err(message) => Err(message)
  }
}

///|
fn ensure_readme_file(project_root : String) -> Result[String?, String] {
  let path = join_path(project_root, "README.md")
  if @fs.path_exists(path) {
    return Ok(None)
  }
  let manifest = match read_project_manifest(project_root) {
    Ok(value) => value
    Err(_) => return Ok(None)
  }
  let options : ProjectOptions = {
    target: project_root,
    id: manifest.id,
    module_name: manifest.module_name,
    title: manifest.title,
    moui_version: manifest.moui_version,
    moui_skia_renderer_version: default_moui_skia_renderer_dependency_version,
    template: "counter",
    platforms: manifest.platforms.copy(),
    bundle_id: manifest.bundle_id,
  }
  match
    replace_file_atomic(path, @utf8.encode(readme_text(options)[:], bom=false)) {
    Ok(_) => Ok(Some("created README.md"))
    Err(message) => Err(message)
  }
}

///|
fn apply_doctor_fixes(options : DoctorOptions) -> Result[Array[String], String] {
  let actions : Array[String] = []
  match ensure_workspace_file(options.project_root) {
    Ok(Some(action)) => actions.push(action)
    Ok(None) => ()
    Err(message) => return Err(message)
  }
  match ensure_readme_file(options.project_root) {
    Ok(Some(action)) => actions.push(action)
    Ok(None) => ()
    Err(message) => return Err(message)
  }
  Ok(actions)
}