use serde::{Deserialize, Serialize};
use crate::{HasDescription, HasId, HasLastUpdate, HasName, TimePeriod, Uri};
use tmflib_derive::{HasDescription, HasId, HasLastUpdate, HasName};
use super::MOD_PATH;
const CLASS_PATH: &str = "specification";
#[derive(Clone, Debug, Default, Deserialize, Serialize)]
pub struct MetricDefMeasureConsequence {
pub name: Option<String>,
pub description: Option<String>,
}
#[derive(Clone, Debug, Default, Deserialize, Serialize)]
pub struct MetricDefMeasureThreasholdRule {
pub description: Option<String>,
consequence: Vec<MetricDefMeasureConsequence>,
}
#[derive(Clone, Debug, Default, Deserialize, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct TestMeasureDefinition {
#[serde(skip_serializing_if = "Option::is_none")]
pub name: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub capture_frequency: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub capture_method: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub capture_period: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub metric_description: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub metric_href: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub metric_name: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub unit_of_measure: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub valid_for: Option<TimePeriod>,
#[serde(skip_serializing_if = "Option::is_none")]
pub value_type: Option<String>,
pub threshold_rule: Option<Vec<MetricDefMeasureThreasholdRule>>,
}
#[derive(
Clone, Debug, Default, Deserialize, HasId, HasName, HasDescription, HasLastUpdate, Serialize,
)]
#[serde(rename_all = "camelCase")]
pub struct ServiceTestSpecification {
#[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 last_update: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub lifecycle_status: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub id: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub href: Option<Uri>,
#[serde(skip_serializing_if = "Option::is_none")]
pub name: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub version: Option<String>,
pub test_measure_definition: Option<Vec<TestMeasureDefinition>>,
}
#[cfg(test)]
mod test {
use super::*;
const SPECIFICATION_ID: &str = "STS123";
const SPECIFICATION_NAME: &str = "SpecificationName";
const SPECIFICATION_JSON: &str = "{
\"id\" : \"STS123\",
\"name\" : \"SpecificationName\"
}";
#[test]
fn test_specification_deserialize() {
let specification: ServiceTestSpecification =
serde_json::from_str(SPECIFICATION_JSON).unwrap();
assert_eq!(specification.get_id().as_str(), "STS123");
assert_eq!(specification.get_name().as_str(), "SpecificationName");
}
#[test]
fn test_specification_hasid() {
let mut specification = ServiceTestSpecification::default();
specification.set_id(SPECIFICATION_ID);
assert_eq!(specification.get_id().as_str(), SPECIFICATION_ID);
}
#[test]
fn test_specification_hasname() {
let mut specification = ServiceTestSpecification::default();
specification.set_name(SPECIFICATION_NAME);
assert_eq!(specification.get_name().as_str(), SPECIFICATION_NAME);
}
}