Files
raven/crates/pom/src/xml.rs
2026-02-15 09:36:04 -05:00

119 lines
2.7 KiB
Rust

use std::{fs::File, io::Read};
use crate::Error;
use hard_xml::{XmlRead, XmlWrite};
use serde::{Deserialize, Serialize};
use strum::EnumString;
// start with the super POM idiot.
#[derive(Debug, Clone, Deserialize, Serialize, XmlRead, XmlWrite)]
#[xml(tag = "project")]
pub struct Project {
#[xml(attr = "xmlns")]
xmlns: String,
#[xml(attr = "xlmns:xsi")]
xmlns_xsi: String,
#[xml(attr = "xsi:schemaLocation")]
xsi_schema_location: String,
#[xml(flatten_text = "modelVersion")]
model_version: semver::Version,
#[xml(flatten_text = "groupId")]
group_id: String,
#[xml(flatten_text = "artifactId")]
artifact_id: String,
#[xml(flatten_text = "version")]
version: String,
#[xml(flatten_text = "packaging")]
packaging: String,
#[xml(child = "properties")]
properties: Properties,
#[xml(child = "dependencyManagement")]
dependency_management: DependencyManagement,
#[xml(child = "dependencies")]
dependencies: Vec<Dependency>,
}
#[derive(Debug, Clone, Deserialize, Serialize, XmlRead, XmlWrite)]
#[xml(tag = "properties")]
pub struct Properties {
#[xml(flatten_text = "maven.compiler.source")]
source: String,
#[xml(flatten_text = "maven.compiler.target")]
target: String,
// lwjgl.version
// lwjgl.natives
}
#[derive(Debug, Clone, Deserialize, Serialize, XmlRead, XmlWrite)]
#[xml(tag = "dependencyManagement")]
pub struct DependencyManagement {
#[xml(child = "dependencies")]
dependencies: Vec<Dependency>,
}
#[derive(Debug, Clone, Deserialize, Serialize, XmlRead, XmlWrite)]
#[xml(tag = "dependency")]
pub struct Dependency {
#[xml(flatten_text = "groupId")]
group_id: String,
#[xml(flatten_text = "artifactId")]
artifact_id: String,
#[xml(flatten_text = "version")]
version: semver::Version,
#[xml(flatten_text = "scope")]
scope: String,
#[xml(flatten_text = "type")]
type_: String,
#[xml(flatten_text = "optional")]
optional: bool,
#[xml(child = "exclusions")]
exclusions: Vec<Exclusion>,
}
#[derive(Debug, Clone, Deserialize, Serialize, XmlRead, XmlWrite)]
#[xml(tag = "exclusion")]
pub struct Exclusion {
#[xml(flatten_text = "groupId")]
group_id: String,
#[xml(flatten_text = "artifactId")]
artifact_id: String,
}
#[derive(Debug, Clone, Copy, Default, Deserialize, Serialize, EnumString)]
#[strum(serialize_all = "camelCase")]
pub enum Packaging {
#[default]
Pom,
Jar,
}
impl TryFrom<File> for Project {
type Error = Error;
fn try_from(value: File) -> Result<Self, Self::Error> {
let mut value = value;
let mut buf = String::new();
value.read_to_string(&mut buf)?;
Ok(Project::from_str(&buf)?)
}
}