pcu_lib/
workspace.rs

1use std::path::Path;
2
3use crate::Error;
4use cargo_toml::Manifest;
5
6#[derive(Debug, Clone)]
7pub struct Workspace {
8    pub manifest: Manifest,
9}
10
11impl Workspace {
12    pub fn new(ws_cargo_toml: &Path) -> Result<Self, Error> {
13        let manifest = Manifest::from_path(ws_cargo_toml)?;
14
15        Ok(Self { manifest })
16    }
17
18    pub fn packages(&self) -> Option<Vec<Package>> {
19        if let Some(workspace) = &self.manifest.workspace {
20            let members = &workspace.members;
21
22            let mut packages = Vec::new();
23
24            for member in members {
25                let member_file = format!("./{member}/Cargo.toml");
26                let path = Path::new(&member_file);
27                let manifest = Manifest::from_path(path).unwrap();
28                if let Some(package) = manifest.package {
29                    let name = package.name;
30                    let version = package.version.get().unwrap().to_string();
31
32                    let package = Package { name, version };
33
34                    packages.push(package);
35                }
36            }
37
38            return Some(packages);
39        }
40
41        None
42    }
43}
44
45#[derive(Debug, Clone)]
46pub struct Package {
47    pub name: String,
48    pub version: String,
49}