Skip to main content

mecha10_deploy/services/package/
types.rs

1//! Package service types
2//!
3//! Data types for package creation and manifest generation.
4
5use 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    /// 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#[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}