use serde::{Deserialize, Serialize};
use crate::common::related_party::RelatedParty;
use crate::{vec_insert, HasDescription, HasId, HasLastUpdate, HasName, TimePeriod};
use tmflib_derive::{HasDescription, HasId, HasLastUpdate, HasName};
use super::MOD_PATH;
const CLASS_PATH: &str = "serviceSpecification";
const SPEC_NEW_VERSION: &str = "1.0";
const SPEC_NEW_STATUS: &str = "new";
use super::characteristic_specification::CharacteristicSpecification;
#[derive(
Clone, Default, Debug, Deserialize, HasId, HasName, HasDescription, HasLastUpdate, Serialize,
)]
pub struct ServiceSpecification {
#[serde(skip_serializing_if = "Option::is_none")]
pub id: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub href: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub name: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub last_update: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub description: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub is_bundle: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub lifecycle_status: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub valid_for: Option<TimePeriod>,
#[serde(skip_serializing_if = "Option::is_none")]
pub version: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub spec_characteristics: Option<Vec<CharacteristicSpecification>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub related_party: Option<Vec<RelatedParty>>,
}
impl ServiceSpecification {
pub fn new(name: impl Into<String>) -> ServiceSpecification {
ServiceSpecification {
name: Some(name.into()),
lifecycle_status: Some(SPEC_NEW_STATUS.into()),
version: Some(SPEC_NEW_VERSION.into()),
..ServiceSpecification::create_with_time()
}
}
pub fn add_char(&mut self, characteristic: CharacteristicSpecification) {
vec_insert(&mut self.spec_characteristics, characteristic);
}
}
#[derive(Clone, Default, Debug, Deserialize, Serialize)]
pub struct ServiceSpecificationRef {
pub id: String,
pub href: String,
pub name: String,
pub version: Option<String>,
}
impl From<ServiceSpecification> for ServiceSpecificationRef {
fn from(value: ServiceSpecification) -> Self {
ServiceSpecificationRef {
id: value.get_id(),
href: value.get_href(),
name: value.get_name(),
version: value.version.clone(),
}
}
}
#[cfg(test)]
mod test {
use super::*;
const SPEC_NAME: &str = "ServiceSpecification";
#[test]
fn test_specification_new() {
let spec = ServiceSpecification::new(SPEC_NAME);
assert_eq!(spec.get_name().as_str(), SPEC_NAME);
assert_eq!(spec.lifecycle_status.is_some(), true);
assert_eq!(spec.lifecycle_status.unwrap().as_str(), SPEC_NEW_STATUS);
}
#[test]
fn test_specref_from_specification() {
let spec = ServiceSpecification::new(SPEC_NAME);
let spec_ref = ServiceSpecificationRef::from(spec.clone());
assert_eq!(spec.get_name(), spec_ref.name);
assert_eq!(spec.get_id(), spec_ref.id);
assert_eq!(spec.get_href(), spec_ref.href);
assert_eq!(spec_ref.version.is_none(), false);
}
}