pite 0.3.0

The Pite 2D scene-tree game engine CLI and visual editor.
// SPDX-License-Identifier: MIT OR Apache-2.0
use std::path::PathBuf;

use anyhow::Result;

pub fn run(
    platform: &str,
    path: Option<&str>,
    out: Option<&str>,
    binary: Option<&str>,
    skip_python_check: bool,
    no_bundle_python: bool,
) -> Result<()> {
    let cwd = std::env::current_dir()?;
    let start = match path {
        Some(p) => {
            let pb = PathBuf::from(p);
            if pb.is_absolute() {
                pb
            } else {
                cwd.join(pb)
            }
        }
        None => cwd,
    };
    let root = pite_project::find_project_root(&start).ok_or_else(|| {
        anyhow::anyhow!(
            "no {} found above {}; run inside a project or pass --path",
            pite_project::MANIFEST_FILE,
            start.display()
        )
    })?;
    let report = pite_export::export_project(
        &root,
        &pite_export::ExportOptions {
            platform: platform.to_string(),
            out_dir: out.map(PathBuf::from),
            binary: binary.map(PathBuf::from),
            skip_python_check,
            bundle_python: !no_bundle_python,
        },
    )?;
    println!("exported to {}", report.out_dir.display());
    println!("binary: {}", report.binary.display());
    println!("files: {}", report.files.len() + 1);
    match &report.python {
        pite_export::PythonChoice::Bundled { zip } => {
            println!("python: bundled ({})", zip.display());
        }
        pite_export::PythonChoice::System => println!("python: system CPython 3.12 required"),
    }
    if platform == "windows" {
        println!("next: run {}\\run.bat", report.out_dir.display());
    } else {
        println!("next: run {}/run.sh", report.out_dir.display());
    }
    Ok(())
}