use serde::{Deserialize,Serialize};
use crate::{HasId,HasName,HasLastUpdate, TimePeriod};
use crate::common::related_party::RelatedParty;
use tmflib_derive::{HasId,HasName,HasLastUpdate};
use super::MOD_PATH;
use crate::LIB_PATH;
const CLASS_PATH : &str = "service";
use super::characteristic_specification::CharacteristicSpecification;
#[derive(Clone,Default,Debug,Deserialize, HasId, HasName, 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 {
let mut ss = ServiceSpecification::create_with_time();
ss.name = Some(name.into());
ss.spec_characteristics = Some(vec![]);
ss.is_bundle = Some(false);
ss.lifecycle_status = Some("New".to_string());
ss
}
pub fn add_char(&mut self, characteristic : CharacteristicSpecification) {
self.spec_characteristics.as_mut().unwrap().push(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.is_bundle.is_some(),true);
assert_eq!(spec.is_bundle.unwrap(),false);
assert_eq!(spec.lifecycle_status.is_some(),true);
assert_eq!(spec.lifecycle_status.unwrap().as_str(),"New");
}
#[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(),true);
}
}