use serde::{Deserialize, Serialize};
use super::{DomainError, error::required_text};
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub enum CodeMonorepoWorkspaceFormat {
Pnpm,
GoModules,
CargoWorkspace,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub struct CodeMonorepoWorkspace {
pub format: CodeMonorepoWorkspaceFormat,
pub root_path: String,
pub workspace_file_path: String,
pub members: Vec<CodeWorkspaceMember>,
}
impl CodeMonorepoWorkspace {
pub fn validate(&self) -> Result<(), DomainError> {
let _ = required_text("root_path", &self.root_path)?;
let _ = required_text("workspace_file_path", &self.workspace_file_path)?;
if self.members.len() < 2 {
return Err(DomainError::invalid(
"members",
"monorepo workspace must contain at least 2 member packages",
));
}
for member in &self.members {
let _ = required_text("member.package_name", &member.package_name)?;
let _ = required_text("member.relative_path", &member.relative_path)?;
}
Ok(())
}
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub struct CodeWorkspaceMember {
pub package_name: String,
pub relative_path: String,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub struct CodeWorkspacePackageMapping {
pub package_name: String,
pub ecosystem: String,
pub repository_id: String,
pub source_scope: String,
pub confidence_basis_points: u32,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub struct CodeWorkspaceDetectionConfig {
pub enabled: bool,
pub supported_formats: Vec<CodeMonorepoWorkspaceFormat>,
}
impl CodeWorkspaceDetectionConfig {
pub fn disabled() -> Self {
Self {
enabled: false,
supported_formats: Self::all_supported_formats(),
}
}
pub fn enabled_all() -> Self {
Self {
enabled: true,
supported_formats: Self::all_supported_formats(),
}
}
fn all_supported_formats() -> Vec<CodeMonorepoWorkspaceFormat> {
vec![
CodeMonorepoWorkspaceFormat::Pnpm,
CodeMonorepoWorkspaceFormat::GoModules,
CodeMonorepoWorkspaceFormat::CargoWorkspace,
]
}
}
impl Default for CodeWorkspaceDetectionConfig {
fn default() -> Self {
Self::disabled()
}
}
#[cfg(test)]
#[path = "mod_tests.rs"]
mod mod_tests;