mecha10_cli/services/package/
types.rs1use chrono::{DateTime, Utc};
6use serde::{Deserialize, Serialize};
7use std::collections::HashMap;
8use std::str::FromStr;
9
10#[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 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#[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#[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}