use serde::{Deserialize, Serialize};
use std::collections::HashMap;
use crate::model::build::Build;
use crate::model::dependency::Dependency;
use crate::model::distribution::DistributionManagement;
use crate::model::parent::Parent;
use crate::model::profile::Profile;
use crate::model::repository::Repository;
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq, Default)]
#[serde(rename = "project")]
#[serde(rename_all = "camelCase")]
pub struct Model {
#[serde(rename = "modelVersion")]
pub model_version: String,
pub parent: Option<Parent>,
#[serde(rename = "groupId")]
pub group_id: String,
#[serde(rename = "artifactId")]
pub artifact_id: String,
pub version: String,
#[serde(default = "default_packaging")]
pub packaging: String,
pub name: Option<String>,
pub description: Option<String>,
pub url: Option<String>,
pub inception_year: Option<String>,
pub organization: Option<Organization>,
#[serde(rename = "licenses")]
pub licenses: Option<Vec<License>>,
#[serde(rename = "developers")]
pub developers: Option<Vec<Developer>>,
#[serde(rename = "contributors")]
pub contributors: Option<Vec<Contributor>>,
#[serde(rename = "dependencies", default)]
pub dependencies: Option<Dependencies>,
#[serde(rename = "dependencyManagement")]
pub dependency_management: Option<DependencyManagement>,
pub build: Option<Build>,
#[serde(rename = "distributionManagement")]
pub distribution_management: Option<DistributionManagement>,
pub properties: Option<HashMap<String, String>>,
#[serde(rename = "modules")]
pub modules: Option<Vec<String>>,
#[serde(rename = "profiles")]
pub profiles: Option<Vec<Profile>>,
#[serde(rename = "repositories")]
pub repositories: Option<Vec<Repository>>,
#[serde(rename = "pluginRepositories")]
pub plugin_repositories: Option<Vec<Repository>>,
pub reporting: Option<Reporting>,
}
fn default_packaging() -> String {
"jar".to_string()
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
pub struct Organization {
pub name: Option<String>,
pub url: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
pub struct License {
pub name: Option<String>,
pub url: Option<String>,
pub distribution: Option<String>,
pub comments: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
pub struct Developer {
pub id: Option<String>,
pub name: Option<String>,
pub email: Option<String>,
pub url: Option<String>,
pub organization: Option<String>,
pub organization_url: Option<String>,
pub roles: Option<Vec<String>>,
pub timezone: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
pub struct Contributor {
pub name: Option<String>,
pub email: Option<String>,
pub url: Option<String>,
pub organization: Option<String>,
pub organization_url: Option<String>,
pub roles: Option<Vec<String>>,
pub timezone: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq, Default)]
pub struct Dependencies {
#[serde(rename = "dependency", default)]
pub dependencies: Vec<Dependency>,
}
impl Dependencies {
pub fn new() -> Self {
Self {
dependencies: Vec::new(),
}
}
pub fn into_vec(self) -> Vec<Dependency> {
self.dependencies
}
}
impl From<Vec<Dependency>> for Dependencies {
fn from(deps: Vec<Dependency>) -> Self {
Self { dependencies: deps }
}
}
impl From<Dependencies> for Vec<Dependency> {
fn from(deps: Dependencies) -> Self {
deps.dependencies
}
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
pub struct DependencyManagement {
#[serde(rename = "dependencies", default)]
pub dependencies: Option<Dependencies>,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
pub struct Reporting {
#[serde(rename = "plugins")]
pub plugins: Option<Vec<ReportingPlugin>>,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
pub struct ReportingPlugin {
pub group_id: Option<String>,
pub artifact_id: Option<String>,
pub version: Option<String>,
}
impl Model {
pub fn coordinates(&self) -> (&str, &str, &str) {
(&self.group_id, &self.artifact_id, &self.version)
}
pub fn id(&self) -> String {
format!("{}:{}", self.group_id, self.artifact_id)
}
pub fn full_id(&self) -> String {
format!("{}:{}:{}", self.group_id, self.artifact_id, self.version)
}
pub fn dependencies_vec(&self) -> Vec<Dependency> {
self.dependencies.as_ref()
.map(|deps| deps.dependencies.clone())
.unwrap_or_default()
}
}