Skip to content

Commit 9d8f58a

Browse files
authored
feat: to_workspace_members (#39)
1 parent 3bcfdfa commit 9d8f58a

File tree

1 file changed

+71
-2
lines changed

1 file changed

+71
-2
lines changed

src/lib.rs

+71-2
Original file line numberDiff line numberDiff line change
@@ -436,7 +436,8 @@ pub struct WorkspaceConfig {
436436
pub struct WorkspaceMemberConfig {
437437
// As defined in `member` setting of the workspace deno.json.
438438
pub member_name: String,
439-
pub path: PathBuf,
439+
/// Directory path of the workspace member.
440+
pub dir_path: PathBuf,
440441
pub package_name: String,
441442
pub package_version: String,
442443
pub config_file: ConfigFile,
@@ -1048,7 +1049,7 @@ impl ConfigFile {
10481049
};
10491050
members.push(WorkspaceMemberConfig {
10501051
member_name: member.to_string(),
1051-
path: member_path,
1052+
dir_path: member_path,
10521053
package_name: package_name.to_string(),
10531054
package_version: package_version.to_string(),
10541055
config_file: member_config_file,
@@ -1075,6 +1076,37 @@ impl ConfigFile {
10751076
}))
10761077
}
10771078

1079+
/// Converts the configuration file into a list of workspace members.
1080+
pub fn to_workspace_members(
1081+
&self,
1082+
) -> Result<Vec<WorkspaceMemberConfig>, AnyError> {
1083+
let maybe_workspace_config = self.to_workspace_config()?;
1084+
match maybe_workspace_config {
1085+
Some(workspace_config) => Ok(workspace_config.members),
1086+
None => {
1087+
let package_name = match self.json.name.clone() {
1088+
Some(name) => name,
1089+
None => bail!("{} is missing 'name' field", self.specifier),
1090+
};
1091+
Ok(vec![WorkspaceMemberConfig {
1092+
member_name: package_name.clone(),
1093+
package_name,
1094+
package_version: match self.json.version.clone() {
1095+
Some(version) => version,
1096+
None => {
1097+
bail!("{} is missing 'version' field", self.specifier)
1098+
}
1099+
},
1100+
dir_path: specifier_to_file_path(&self.specifier)?
1101+
.parent()
1102+
.unwrap()
1103+
.to_path_buf(),
1104+
config_file: self.clone(),
1105+
}])
1106+
}
1107+
}
1108+
}
1109+
10781110
pub fn to_bench_config(&self) -> Result<Option<BenchConfig>, AnyError> {
10791111
let files_config = self.to_files_config()?;
10801112
let bench_config = match self.json.bench.clone() {
@@ -2135,6 +2167,43 @@ mod tests {
21352167
);
21362168
}
21372169

2170+
#[test]
2171+
fn test_to_workspace_members_no_name() {
2172+
let config_text = r#"{
2173+
"version": "1.0.0"
2174+
}"#;
2175+
let config_specifier = root_url().join("tsconfig.json").unwrap();
2176+
let config_file = ConfigFile::new(config_text, config_specifier).unwrap();
2177+
2178+
let err = config_file.to_workspace_members().err().unwrap();
2179+
assert!(err.to_string().ends_with("is missing 'name' field"));
2180+
}
2181+
2182+
#[test]
2183+
fn test_to_workspace_members_no_version() {
2184+
let config_text = r#"{
2185+
"name": "@pkg/pkg"
2186+
}"#;
2187+
let config_specifier = root_url().join("tsconfig.json").unwrap();
2188+
let config_file = ConfigFile::new(config_text, config_specifier).unwrap();
2189+
2190+
let err = config_file.to_workspace_members().err().unwrap();
2191+
assert!(err.to_string().ends_with("is missing 'version' field"));
2192+
}
2193+
2194+
#[test]
2195+
fn test_to_workspace_members_single_config() {
2196+
let config_text = r#"{
2197+
"name": "@pkg/pkg"
2198+
"version": "1.0.0",
2199+
}"#;
2200+
let config_specifier = root_url().join("tsconfig.json").unwrap();
2201+
let config_file = ConfigFile::new(config_text, config_specifier).unwrap();
2202+
2203+
let members = config_file.to_workspace_members().unwrap();
2204+
assert_eq!(members.len(), 1);
2205+
}
2206+
21382207
#[test]
21392208
fn test_is_package() {
21402209
fn get_for_config(config_text: &str) -> bool {

0 commit comments

Comments
 (0)