mecha10_deploy/services/package/
types.rs1use chrono::{DateTime, Utc};
6use mecha10_core::enum_str_method;
7use serde::{Deserialize, Serialize};
8use std::collections::HashMap;
9use std::str::FromStr;
10
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
36enum_str_method!(
37 pub fn as_str(TargetArch) -> &str {
38 X8664UnknownLinuxGnu => "x86_64-unknown-linux-gnu",
39 Aarch64UnknownLinuxGnu => "aarch64-unknown-linux-gnu",
40 ArmV7UnknownLinuxGnueabihf => "armv7-unknown-linux-gnueabihf",
41 X8664AppleDarwin => "x86_64-apple-darwin",
42 Aarch64AppleDarwin => "aarch64-apple-darwin",
43 }
44);
45
46enum_str_method!(
47 pub fn display_name(TargetArch) -> &str {
48 X8664UnknownLinuxGnu => "x86_64 (Linux)",
49 Aarch64UnknownLinuxGnu => "ARM64 (Linux)",
50 ArmV7UnknownLinuxGnueabihf => "ARMv7 (Linux)",
51 X8664AppleDarwin => "x86_64 (macOS)",
52 Aarch64AppleDarwin => "ARM64 (macOS)",
53 }
54);
55
56impl TargetArch {
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)]
82pub struct PackageManifest {
83 pub format_version: String,
84 pub name: String,
85 pub version: String,
86 pub build_timestamp: DateTime<Utc>,
87 pub target_arch: TargetArch,
88 pub binaries: Vec<BinaryInfo>,
89 pub configs: Vec<ConfigInfo>,
90 pub assets: Vec<AssetInfo>,
91 pub dependencies: HashMap<String, String>,
92 pub metadata: HashMap<String, serde_json::Value>,
93 pub build_profile: String,
94 pub git_commit: Option<String>,
95 pub environment: Option<String>,
96}
97
98impl PackageManifest {
99 pub const FORMAT_VERSION: &'static str = "1.0.0";
100}
101
102#[derive(Debug, Clone, Serialize, Deserialize)]
103pub struct BinaryInfo {
104 pub name: String,
105 pub path: String,
106 pub size_bytes: u64,
107 pub checksum: String,
108}
109
110#[derive(Debug, Clone, Serialize, Deserialize)]
111pub struct ConfigInfo {
112 pub name: String,
113 pub path: String,
114 pub config_type: String,
115 pub checksum: String,
116}
117
118#[derive(Debug, Clone, Serialize, Deserialize)]
119pub struct AssetInfo {
120 pub name: String,
121 pub path: String,
122 pub asset_type: String,
123 pub size_bytes: u64,
124 pub checksum: String,
125}
126
127#[derive(Debug, Clone)]
128pub struct PackageConfig {
129 pub output_dir: std::path::PathBuf,
130 pub target_arch: TargetArch,
131 pub build_profile: String,
132 pub include_assets: bool,
133 pub environment: Option<String>,
134 pub custom_metadata: HashMap<String, serde_json::Value>,
135}
136
137impl Default for PackageConfig {
138 fn default() -> Self {
139 Self {
140 output_dir: std::path::PathBuf::from("target/packages"),
141 target_arch: TargetArch::default_for_platform(),
142 build_profile: "release".to_string(),
143 include_assets: true,
144 environment: None,
145 custom_metadata: HashMap::new(),
146 }
147 }
148}