1use std::collections::BTreeMap;
2
3use serde::{Deserialize, Serialize};
4
5pub fn schema_version_for(asset_version: &str) -> u32 {
10 asset_version
11 .split('.')
12 .next()
13 .and_then(|s| s.parse().ok())
14 .unwrap_or(0)
15}
16
17#[derive(Debug, Clone, Serialize, Deserialize)]
21pub struct Manifest {
22 pub schema_version: u32,
23 pub asset_version: String,
24 pub built_at: String,
25 #[serde(default, skip_serializing_if = "Option::is_none")]
26 pub source_repo: Option<String>,
27 #[serde(default, skip_serializing_if = "Option::is_none")]
28 pub source_ref: Option<String>,
29 #[serde(default, skip_serializing_if = "Option::is_none")]
30 pub source_sha: Option<String>,
31 pub targets: BTreeMap<String, Target>,
33 #[serde(default, skip_serializing_if = "Vec::is_empty")]
35 pub binaries: Vec<Binary>,
36}
37
38#[derive(Debug, Clone, Serialize, Deserialize)]
40pub struct Target {
41 pub kernel: FileEntry,
42 pub rootfs: FileEntry,
43 pub kernel_cmdline: String,
44}
45
46#[derive(Debug, Clone, Serialize, Deserialize)]
48pub struct FileEntry {
49 pub path: String,
50 pub sha256: String,
51 #[serde(default, skip_serializing_if = "Option::is_none")]
52 pub version: Option<String>,
53}
54
55#[derive(Debug, Clone, Serialize, Deserialize)]
57pub struct Binary {
58 pub name: String,
59 pub version: String,
60 pub targets: BTreeMap<String, BinaryTarget>,
62 #[serde(default, skip_serializing_if = "Option::is_none")]
65 pub install_dir: Option<String>,
66}
67
68#[derive(Debug, Clone, Serialize, Deserialize)]
70pub struct BinaryTarget {
71 pub path: String,
72 pub sha256: String,
73}