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}