#[derive(Debug, serde::Deserialize, serde::Serialize)] pub struct Config { pub layers: Vec, pub root_user: RootUser, #[serde(default, skip_serializing_if = "Vec::is_empty")] pub mounts: Vec, #[serde(default, skip_serializing_if = "Vec::is_empty")] pub files: Vec, #[serde(default, skip_serializing_if = "Vec::is_empty")] pub groups: Vec, #[serde(default, skip_serializing_if = "Vec::is_empty")] pub users: Vec, } #[derive(Debug, serde::Deserialize, serde::Serialize)] pub struct RootUser { #[serde(skip_serializing_if = "Option::is_none")] pub password_hash: Option, pub authorized_keys: Vec, } #[derive(Debug, serde::Deserialize, serde::Serialize)] pub struct Mount { pub r#type: Option, pub dev: String, pub path: String, pub options: Option, } #[derive(Debug, serde::Deserialize, serde::Serialize)] pub struct Group { pub name: String, #[serde(skip_serializing_if = "Option::is_none")] pub gid: Option, } #[derive(Debug, serde::Deserialize, serde::Serialize)] pub struct User { pub name: String, #[serde(skip_serializing_if = "Option::is_none")] pub uid: Option, #[serde(skip_serializing_if = "Option::is_none")] pub gid: Option, } #[derive(Debug, serde::Deserialize, serde::Serialize)] pub struct File { pub path: String, #[serde(skip_serializing_if = "Option::is_none")] pub mode: Option, #[serde(flatten)] pub kind: FileKind, } #[derive(Debug, serde::Deserialize, serde::Serialize)] #[serde(rename_all = "snake_case")] pub enum FileKind { Content(String), Symlink(String), Dir(bool), }