use depguard_types::{Location, RepoPath};
use serde::{Deserialize, Serialize};
use std::collections::BTreeMap;
#[derive(Clone, Debug, Default, Serialize, Deserialize)]
pub struct WorkspaceModel {
pub repo_root: RepoPath,
pub workspace_dependencies: BTreeMap<String, WorkspaceDependency>,
pub manifests: Vec<ManifestModel>,
}
#[derive(Clone, Debug, Default, Serialize, Deserialize)]
pub struct WorkspaceDependency {
pub name: String,
pub version: Option<String>,
pub path: Option<String>,
pub workspace: bool,
}
#[derive(Clone, Debug, Default, Serialize, Deserialize)]
pub struct ManifestModel {
pub path: RepoPath,
pub package: Option<PackageMeta>,
pub dependencies: Vec<DependencyDecl>,
pub features: BTreeMap<String, Vec<String>>,
}
#[derive(Clone, Debug, Serialize, Deserialize)]
pub struct PackageMeta {
pub name: String,
pub publish: bool,
}
#[derive(Clone, Copy, Debug, PartialEq, Eq, Serialize, Deserialize)]
pub enum DepKind {
Normal,
Dev,
Build,
}
#[derive(Clone, Debug, Serialize, Deserialize)]
pub struct DependencyDecl {
pub kind: DepKind,
pub name: String,
pub spec: DepSpec,
pub location: Option<Location>,
pub target: Option<String>,
}
#[derive(Clone, Debug, Default, Serialize, Deserialize)]
pub struct DepSpec {
pub version: Option<String>,
pub path: Option<String>,
pub workspace: bool,
pub git: Option<String>,
pub branch: Option<String>,
pub tag: Option<String>,
pub rev: Option<String>,
pub default_features: Option<bool>,
pub optional: bool,
pub package: Option<String>,
pub inline_suppressions: Vec<String>,
}
impl ManifestModel {
pub fn is_publishable(&self) -> bool {
self.package.as_ref().map(|p| p.publish).unwrap_or(false)
}
pub fn package_name(&self) -> Option<&str> {
self.package.as_ref().map(|p| p.name.as_str())
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn publishable_and_package_name_behavior() {
let mut manifest = ManifestModel::default();
assert!(!manifest.is_publishable());
assert_eq!(manifest.package_name(), None);
manifest.package = Some(PackageMeta {
name: "depguard".to_string(),
publish: true,
});
assert!(manifest.is_publishable());
assert_eq!(manifest.package_name(), Some("depguard"));
manifest.package = Some(PackageMeta {
name: "private".to_string(),
publish: false,
});
assert!(!manifest.is_publishable());
assert_eq!(manifest.package_name(), Some("private"));
}
}