use serde::{Deserialize, Serialize};
use tracing::warn;
use crate::parser::{Color, SingPlurName};
#[allow(clippy::module_name_repetitions)]
#[derive(Serialize, Deserialize, Debug, Clone, Default, specta::Type)]
#[serde(rename_all = "camelCase")]
pub struct SeedMaterial {
name: SingPlurName,
color: Color,
material: String,
}
impl SeedMaterial {
#[must_use]
pub fn is_empty(&self) -> bool {
self.name.is_empty() && self.color.is_default() && self.material.is_empty()
}
#[must_use]
pub fn from_value(value: &str) -> Self {
let mut parts = value.split(':');
if parts.clone().count() < 7 {
warn!(
"SeedMaterial::from_value() was provided a value with less than 7 parts: {}",
value
);
return Self::default();
}
let name = SingPlurName::from_value(&format!(
"{}:{}",
parts.next().unwrap_or_default(),
parts.next().unwrap_or_default()
));
let color = Color::from_value(&format!(
"{}:{}:{}",
parts.next().unwrap_or_default(),
parts.next().unwrap_or_default(),
parts.next().unwrap_or_default()
));
let material = parts.collect::<Vec<&str>>().join(":");
Self {
name,
color,
material,
}
}
}