ikki_config/
deserialize.rs

1#![allow(dead_code)]
2
3use std::path::PathBuf;
4
5#[derive(Debug, Clone, knuffel::Decode)]
6pub struct KeyValue(
7    #[knuffel(argument)] pub String,
8    #[knuffel(argument)] pub String,
9);
10
11#[derive(Debug, Clone, knuffel::Decode)]
12pub struct Secret {
13    #[knuffel(property)]
14    pub id: String,
15    #[knuffel(property)]
16    pub src: PathBuf,
17}
18
19#[derive(Debug, Clone, knuffel::Decode)]
20pub struct Mount {
21    #[knuffel(property(name = "type"))]
22    pub mount_type: String,
23    #[knuffel(property)]
24    pub src: PathBuf,
25    #[knuffel(property)]
26    pub dest: PathBuf,
27}
28
29#[derive(Debug, Clone, knuffel::Decode)]
30pub struct Service {
31    #[knuffel(child, unwrap(arguments))]
32    pub ports: Option<Vec<String>>,
33    #[knuffel(children(name = "env"))]
34    pub env: Vec<KeyValue>,
35    #[knuffel(child, unwrap(argument))]
36    pub user: Option<String>,
37    #[knuffel(children(name = "mount"))]
38    pub mounts: Vec<Mount>,
39    #[knuffel(child, unwrap(arguments))]
40    pub networks: Option<Vec<String>>,
41}
42
43#[derive(Debug, knuffel::Decode)]
44pub struct BuildArg {
45    #[knuffel(arguments)]
46    pub values: Vec<String>,
47}
48
49#[derive(Debug, Clone, knuffel::Decode)]
50pub struct Image {
51    #[knuffel(property)]
52    pub path: Option<PathBuf>,
53    #[knuffel(property)]
54    pub file: Option<PathBuf>,
55    #[knuffel(property)]
56    pub output: Option<PathBuf>,
57    #[knuffel(property)]
58    pub pull: Option<String>,
59    #[knuffel(children(name = "build-arg"))]
60    pub build_args: Vec<KeyValue>,
61    #[knuffel(child)]
62    pub service: Option<Service>,
63    #[knuffel(child)]
64    pub secret: Option<Secret>,
65    #[knuffel(argument)]
66    pub name: String,
67}
68
69#[derive(Debug, knuffel::Decode)]
70pub struct Images {
71    #[knuffel(children(name = "image"))]
72    pub images: Vec<Image>,
73}
74
75#[derive(Debug, knuffel::Decode)]
76pub struct ImageConfig {
77    #[knuffel(child)]
78    pub images: Images,
79}
80
81impl ImageConfig {
82    pub fn image_names(&self) -> Vec<String> {
83        self.images
84            .images
85            .iter()
86            .map(|img| img.name.clone())
87            .collect()
88    }
89}
90
91pub fn parse_image_config(filename: &str, input: &str) -> Result<ImageConfig, knuffel::Error> {
92    knuffel::parse::<ImageConfig>(filename, input)
93}