Skip to main content

zoi_cli/cmd/package/
inspect.rs

1//! Inspection of package files.
2
3use std::path::PathBuf;
4
5use anyhow::{Result, anyhow};
6use clap::Parser;
7
8/// Command to inspect a package file and display its metadata.
9#[derive(Parser, Debug)]
10pub struct InspectCommand {
11    /// Path to the package file (e.g. path/to/name.pkg.lua)
12    #[arg(required = true)]
13    pub package_file: PathBuf,
14
15    /// Output the metadata as JSON
16    #[arg(long)]
17    pub json: bool,
18
19    /// Validate as this target platform (defaults to current platform)
20    #[arg(long)]
21    pub platform: Option<String>,
22
23    /// Override package version while inspecting
24    #[arg(long)]
25    pub version_override: Option<String>
26}
27
28/// Runs the package inspection command.
29///
30/// This parses the package's Lua definition and displays metadata such as name,
31/// version, repository, and description. It can also output the metadata in
32/// JSON format.
33///
34/// # Errors
35///
36/// Returns an error if the package definition cannot be parsed or the platform
37/// is invalid.
38pub fn run(args: InspectCommand) -> Result<()> {
39    let platform = match args.platform {
40        Some(p) => p,
41        None => crate::pkg::utils::get_platform()?
42    };
43
44    let file_path = args.package_file.to_str().ok_or_else(|| {
45        anyhow!(
46            "Path contains invalid UTF-8 characters: {}",
47            args.package_file.display()
48        )
49    })?;
50
51    let package = crate::pkg::lua::parser::parse_lua_package_for_platform(
52        file_path,
53        &platform,
54        args.version_override.as_deref(),
55        None,
56        true
57    )?;
58
59    if args.json {
60        let json = serde_json::to_string_pretty(&package)?;
61        println!("{json}");
62    } else {
63        println!(
64            "{} {} - {}",
65            package.name,
66            package.version.as_deref().unwrap_or("latest"),
67            package.repo
68        );
69        println!("{}", package.description);
70    }
71
72    Ok(())
73}