#![warn(missing_docs)]
#![warn(rustdoc::broken_intra_doc_links)]
use serde::{Deserialize, Serialize};
fn default_major() -> i32 {
1
}
fn default_minor() -> i32 {
0
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[serde(rename = "FormatVersion")]
pub struct FormatVersion {
#[serde(rename = "@major", default = "default_major")]
pub major: i32,
#[serde(rename = "@minor", default = "default_minor")]
pub minor: i32,
#[serde(
rename = "@pre-release",
skip_serializing_if = "Option::is_none",
default
)]
pub pre_release: Option<i32>,
#[serde(rename = "$text", skip_serializing, default)]
legacy_value: Option<String>,
}
impl Default for FormatVersion {
fn default() -> Self {
Self {
major: 1,
minor: 0,
pre_release: Some(3),
legacy_value: None,
}
}
}
impl FormatVersion {
pub fn new(major: i32, minor: i32, pre_release: Option<i32>) -> Self {
Self {
major,
minor,
pre_release,
legacy_value: None,
}
}
pub fn from_string(value: &str) -> Self {
let parts: Vec<&str> = value.split('-').collect();
let version_parts: Vec<&str> = parts.first().unwrap_or(&"1.0.0").split('.').collect();
let major = version_parts
.first()
.and_then(|s| s.parse().ok())
.unwrap_or(1);
let minor = version_parts
.get(1)
.and_then(|s| s.parse().ok())
.unwrap_or(0);
let pre_release = if parts.len() > 1 {
parts[1].split('.').next_back().and_then(|s| s.parse().ok())
} else {
None
};
Self {
major,
minor,
pre_release,
legacy_value: None,
}
}
pub fn to_version_string(&self) -> String {
if let Some(ref legacy) = self.legacy_value {
return legacy.clone();
}
match self.pre_release {
Some(pr) => format!("{}.{}.0-rc.{}", self.major, self.minor, pr),
None => format!("{}.{}.0", self.major, self.minor),
}
}
}
#[derive(Default, Debug, Clone, PartialEq, Serialize, Deserialize)]
#[serde(rename = "LicenseKey")]
pub struct LicenseKey {
#[serde(rename = "@application", default)]
pub application: String,
#[serde(rename = "$text", default)]
pub license_key: String,
}
#[derive(Default, Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct LicenseKeys {
#[serde(rename = "LicenseKey", default)]
pub license_key: Vec<LicenseKey>,
}
#[derive(Default, Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct EMail {
#[serde(rename = "@mailto", default)]
pub mailto: String,
#[serde(rename = "$text", default)]
pub value: String,
}
#[derive(Default, Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct EMailAddresses {
#[serde(rename = "EMail", default)]
pub e_mail: Vec<EMail>,
}
#[derive(Default, Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct Address {
#[serde(rename = "FirstName")]
pub first_name: String,
#[serde(rename = "Name")]
pub name: String,
#[serde(rename = "Street")]
pub street: String,
#[serde(rename = "ZIPCode")]
pub zip_code: String,
#[serde(rename = "City")]
pub city: String,
#[serde(rename = "Country")]
pub country: String,
#[serde(rename = "Phone")]
pub phone: String,
#[serde(rename = "EMailAddresses")]
pub e_mail_addresses: EMailAddresses,
}
#[derive(Default, Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct Contact {
#[serde(rename = "Address", default)]
pub address: Vec<Address>,
}
impl Contact {
pub fn is_empty(&self) -> bool {
self.address.is_empty()
}
}
fn is_contact_empty(contact: &Contact) -> bool {
contact.is_empty()
}
fn default_author() -> String {
"__empty__".to_string()
}
fn is_default_author(s: &str) -> bool {
s.is_empty()
}
#[derive(Default, Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct Header {
#[serde(rename = "Manufacturer", default)]
pub manufacturer: String,
#[serde(rename = "FormatVersion", default)]
pub format_version: FormatVersion,
#[serde(rename = "CreatedWithApplication", default)]
pub created_with_application: String,
#[serde(rename = "GldfCreationTimeCode", alias = "CreationTimeCode", default)]
pub creation_time_code: String,
#[serde(
rename = "UniqueGldfId",
default,
skip_serializing_if = "Option::is_none"
)]
pub unique_gldf_id: Option<String>,
#[serde(
rename = "DefaultLanguage",
default,
skip_serializing_if = "Option::is_none"
)]
pub default_language: Option<String>,
#[serde(
rename = "LicenseKeys",
default,
skip_serializing_if = "Option::is_none"
)]
pub license_keys: Option<LicenseKeys>,
#[serde(
rename = "ReluxMemberId",
default,
skip_serializing_if = "Option::is_none"
)]
pub relux_member_id: Option<String>,
#[serde(
rename = "DIALuxMemberId",
default,
skip_serializing_if = "Option::is_none"
)]
pub dia_lux_member_id: Option<String>,
#[serde(
rename = "Author",
default = "default_author",
skip_serializing_if = "is_default_author"
)]
pub author: String,
#[serde(rename = "Contact", default, skip_serializing_if = "is_contact_empty")]
pub contact: Contact,
}
#[derive(Default, Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct Locale {
#[serde(rename = "@language", default)]
pub language: String,
#[serde(rename = "$text", default)]
pub value: String,
}
#[derive(Default, Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct LocaleFoo {
#[serde(rename = "Locale", default)]
pub locale: Vec<Locale>,
}