mecha10_cli/services/package/
types.rs

1//! Package service types
2//!
3//! Data types for package creation and manifest generation.
4
5use chrono::{DateTime, Utc};
6use serde::{Deserialize, Serialize};
7use std::collections::HashMap;
8use std::str::FromStr;
9
10/// Supported target architectures
11#[derive(Debug, Clone, Copy, Serialize, Deserialize, PartialEq, Eq)]
12#[serde(rename_all = "kebab-case")]
13pub enum TargetArch {
14    X8664UnknownLinuxGnu,
15    Aarch64UnknownLinuxGnu,
16    ArmV7UnknownLinuxGnueabihf,
17    X8664AppleDarwin,
18    Aarch64AppleDarwin,
19}
20
21impl FromStr for TargetArch {
22    type Err = String;
23
24    fn from_str(s: &str) -> Result<Self, Self::Err> {
25        match s {
26            "x86_64-unknown-linux-gnu" | "x86_64" => Ok(TargetArch::X8664UnknownLinuxGnu),
27            "aarch64-unknown-linux-gnu" | "aarch64" | "arm64" => Ok(TargetArch::Aarch64UnknownLinuxGnu),
28            "armv7-unknown-linux-gnueabihf" | "armv7" | "armhf" => Ok(TargetArch::ArmV7UnknownLinuxGnueabihf),
29            "x86_64-apple-darwin" => Ok(TargetArch::X8664AppleDarwin),
30            "aarch64-apple-darwin" => Ok(TargetArch::Aarch64AppleDarwin),
31            _ => Err(format!("Invalid target architecture: {}", s)),
32        }
33    }
34}
35
36impl TargetArch {
37    pub fn as_str(&self) -> &str {
38        match self {
39            TargetArch::X8664UnknownLinuxGnu => "x86_64-unknown-linux-gnu",
40            TargetArch::Aarch64UnknownLinuxGnu => "aarch64-unknown-linux-gnu",
41            TargetArch::ArmV7UnknownLinuxGnueabihf => "armv7-unknown-linux-gnueabihf",
42            TargetArch::X8664AppleDarwin => "x86_64-apple-darwin",
43            TargetArch::Aarch64AppleDarwin => "aarch64-apple-darwin",
44        }
45    }
46
47    pub fn display_name(&self) -> &str {
48        match self {
49            TargetArch::X8664UnknownLinuxGnu => "x86_64 (Linux)",
50            TargetArch::Aarch64UnknownLinuxGnu => "ARM64 (Linux)",
51            TargetArch::ArmV7UnknownLinuxGnueabihf => "ARMv7 (Linux)",
52            TargetArch::X8664AppleDarwin => "x86_64 (macOS)",
53            TargetArch::Aarch64AppleDarwin => "ARM64 (macOS)",
54        }
55    }
56
57    /// Get default target for current platform
58    pub fn default_for_platform() -> Self {
59        #[cfg(all(target_arch = "x86_64", target_os = "linux"))]
60        return TargetArch::X8664UnknownLinuxGnu;
61
62        #[cfg(all(target_arch = "aarch64", target_os = "linux"))]
63        return TargetArch::Aarch64UnknownLinuxGnu;
64
65        #[cfg(all(target_arch = "x86_64", target_os = "macos"))]
66        return TargetArch::X8664AppleDarwin;
67
68        #[cfg(all(target_arch = "aarch64", target_os = "macos"))]
69        return TargetArch::Aarch64AppleDarwin;
70
71        #[cfg(not(any(
72            all(target_arch = "x86_64", target_os = "linux"),
73            all(target_arch = "aarch64", target_os = "linux"),
74            all(target_arch = "x86_64", target_os = "macos"),
75            all(target_arch = "aarch64", target_os = "macos")
76        )))]
77        return TargetArch::X8664UnknownLinuxGnu;
78    }
79}
80
81/// Package manifest containing metadata about the package
82#[derive(Debug, Clone, Serialize, Deserialize)]
83pub struct PackageManifest {
84    pub format_version: String,
85    pub name: String,
86    pub version: String,
87    pub build_timestamp: DateTime<Utc>,
88    pub target_arch: TargetArch,
89    pub binaries: Vec<BinaryInfo>,
90    pub configs: Vec<ConfigInfo>,
91    pub assets: Vec<AssetInfo>,
92    pub dependencies: HashMap<String, String>,
93    pub metadata: HashMap<String, serde_json::Value>,
94    pub build_profile: String,
95    pub git_commit: Option<String>,
96    pub environment: Option<String>,
97}
98
99impl PackageManifest {
100    pub const FORMAT_VERSION: &'static str = "1.0.0";
101}
102
103#[derive(Debug, Clone, Serialize, Deserialize)]
104pub struct BinaryInfo {
105    pub name: String,
106    pub path: String,
107    pub size_bytes: u64,
108    pub checksum: String,
109}
110
111#[derive(Debug, Clone, Serialize, Deserialize)]
112pub struct ConfigInfo {
113    pub name: String,
114    pub path: String,
115    pub config_type: String,
116    pub checksum: String,
117}
118
119#[derive(Debug, Clone, Serialize, Deserialize)]
120pub struct AssetInfo {
121    pub name: String,
122    pub path: String,
123    pub asset_type: String,
124    pub size_bytes: u64,
125    pub checksum: String,
126}
127
128/// Package configuration
129#[derive(Debug, Clone)]
130pub struct PackageConfig {
131    pub output_dir: std::path::PathBuf,
132    pub target_arch: TargetArch,
133    pub build_profile: String,
134    pub include_assets: bool,
135    pub environment: Option<String>,
136    pub custom_metadata: HashMap<String, serde_json::Value>,
137}
138
139impl Default for PackageConfig {
140    fn default() -> Self {
141        Self {
142            output_dir: std::path::PathBuf::from("target/packages"),
143            target_arch: TargetArch::default_for_platform(),
144            build_profile: "release".to_string(),
145            include_assets: true,
146            environment: None,
147            custom_metadata: HashMap::new(),
148        }
149    }
150}