maven_rs/meta/
maven_metadata.rs

1use chrono::NaiveDateTime;
2use serde::{Deserialize, Serialize};
3
4use crate::extension::MavenFileExtension;
5
6#[derive(Debug, Serialize, Deserialize, Clone)]
7pub struct DeployMetadata {
8    #[serde(rename = "groupId")]
9    pub group_id: String,
10    #[serde(rename = "artifactId")]
11    pub artifact_id: String,
12    pub versioning: StableVersioning,
13}
14
15impl DeployMetadata {
16    /// Attempts to pull latest
17    /// Then attempts to pull release
18    /// Then attempts te first version in the list
19    #[inline]
20    pub fn get_latest_version(&self) -> Option<&String> {
21        self.versioning
22            .latest
23            .as_ref()
24            .or(self.versioning.release.as_ref())
25            .or_else(|| self.versioning.versions.version.first())
26    }
27    /// Returns a tuple of the latest version and the artifact name.
28    pub fn get_latest_artifact_name(
29        &self,
30        extension: impl Into<MavenFileExtension>,
31    ) -> Option<(&str, String)> {
32        if let Some(value) = self.get_latest_version() {
33            let string = self.get_artifact_name(value, extension);
34            Some((value, string))
35        } else {
36            None
37        }
38    }
39    #[inline]
40    pub fn get_artifact_name(
41        &self,
42        version: &str,
43        extension: impl Into<MavenFileExtension>,
44    ) -> String {
45        let extension = extension.into();
46        format!("{}-{}{}", self.artifact_id, version, extension)
47    }
48}
49
50#[derive(Debug, Serialize, Deserialize, Clone, Default)]
51pub struct StableVersioning {
52    pub release: Option<String>,
53    pub latest: Option<String>,
54    pub versions: StableVersions,
55    #[serde(rename = "lastUpdated", with = "crate::utils::time::standard_time")]
56    pub last_updated: Option<NaiveDateTime>,
57}
58
59#[derive(Debug, Serialize, Deserialize, Clone, Default)]
60pub struct StableVersions {
61    pub version: Vec<String>,
62}
63
64#[cfg(test)]
65mod tests {
66    use super::*;
67    use pretty_assertions::assert_eq;
68    #[test]
69    pub fn parse_metadata() {
70        let metadata = r#"
71        <metadata>
72            <groupId>org.kakara</groupId>
73            <artifactId>engine</artifactId>
74            <versioning>
75                <latest>1.0-SNAPSHOT</latest>
76                <versions>
77                    <version>1.0-SNAPSHOT</version>
78                </versions>
79                <lastUpdated>20220826191631</lastUpdated>
80            </versioning>
81        </metadata>
82        "#;
83        let metadata: DeployMetadata = quick_xml::de::from_str(metadata).unwrap();
84        assert_eq!(metadata.group_id, "org.kakara");
85        assert_eq!(metadata.artifact_id, "engine");
86        assert_eq!(metadata.versioning.latest, Some("1.0-SNAPSHOT".to_string()));
87        assert_eq!(
88            metadata.versioning.versions.version,
89            vec!["1.0-SNAPSHOT".to_string()]
90        );
91    }
92}