ydevlib/
recipe.rs

1#[allow(unused)]
2use {
3    crate::utils::{scan_dir, scan_dir_for_dir, scan_dir_for_file},
4    anyhow::{Context, Error, Result},
5    jlogger::{jdebug, jerror, jinfo, jwarn},
6    log::{debug, error, info, warn},
7    std::fmt::Display,
8    std::fs,
9    std::path::{Path, PathBuf},
10};
11
12pub struct Recipe {
13    name: String,
14    path: String,
15    version: String,
16    append: bool,
17}
18
19impl Recipe {
20    pub fn new(path: &str) -> Result<Self> {
21        let mut append = false;
22        let mut filename = Path::new(path)
23            .file_name()
24            .ok_or(Error::msg("Invalid file name."))?
25            .to_str()
26            .ok_or(Error::msg("Invalid file name."))?;
27
28        match filename {
29            _ if filename.ends_with(".bb") => (),
30            _ if filename.ends_with(".bbappend") => append = true,
31            _ => return Err(Error::msg("Invalid recipe.")),
32        }
33
34        let path = path.to_string();
35
36        if append {
37            filename = filename.trim_end_matches(".bbappend");
38        } else {
39            filename = filename.trim_end_matches(".bb");
40        }
41
42        let mut version = String::new();
43        let mut name = filename.to_string();
44        if let Some(i) = filename.rfind("_") {
45            version.push_str(format!("{}", &filename[i + 1..]).as_str());
46            name = filename[..i].to_string();
47        } else {
48        }
49
50        Ok(Recipe {
51            name,
52            path,
53            version,
54            append,
55        })
56    }
57
58    pub fn name(&self) -> &str {
59        self.name.as_str()
60    }
61
62    pub fn path(&self) -> &str {
63        self.path.as_str()
64    }
65
66    pub fn version(&self) -> Option<&str> {
67        if self.version.is_empty() {
68            None
69        } else {
70            Some(self.version.as_str())
71        }
72    }
73
74    pub fn is_append(&self) -> bool {
75        self.append
76    }
77}
78
79impl Display for Recipe {
80    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
81        let mut suffix = ".bb";
82        if self.append {
83            suffix = ".bbappend";
84        }
85
86        if self.version.is_empty() {
87            write!(f, "{}{}", self.name, suffix)
88        } else {
89            write!(f, "{}_{}{}", self.name, self.version, suffix)
90        }
91    }
92}