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}