use super::related_party::RelatedParty;
use super::related_place::RelatedPlaceRefOrValue;
#[cfg(all(feature = "tmf620", feature = "build-V4"))]
use crate::tmf620::product_offering::ProductOfferingRef;
#[cfg(all(feature = "tmf620", feature = "build-V5"))]
use crate::tmf620::product_offering_v5::ProductOfferingRef;
use crate::tmf620::product_specification::ProductSpecificationRef;
use crate::tmf666::billing_account::BillingAccountRef;
use crate::HasDescription;
use serde::{Deserialize, Serialize};
use tmflib_derive::HasDescription;
#[derive(Clone, Default, Debug, Deserialize, PartialEq, Serialize)]
pub enum ProductStatusType {
#[default]
Created,
PendingActive,
Cancelled,
Active,
PendingTerminate,
Terminated,
Suspended,
Aborted,
}
#[derive(Clone, Default, Debug, Deserialize, HasDescription, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct ProductRefOrValue {
#[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 description: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub is_bundle: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub is_customer_visible: Option<bool>,
pub name: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub product_serial_number: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub status: Option<ProductStatusType>,
#[serde(skip_serializing_if = "Option::is_none")]
pub product_specification: Option<ProductSpecificationRef>,
#[serde(skip_serializing_if = "Option::is_none")]
pub place: Option<Vec<RelatedPlaceRefOrValue>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub related_party: Option<Vec<RelatedParty>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub billing_account: Option<BillingAccountRef>,
product_offering: Option<ProductOfferingRef>,
}
#[cfg(test)]
mod test {
use super::*;
const PROD_STATUS_TYPE_JSON: &str = "\"Created\"";
const PRODREF_JSON: &str = "{
\"id\" : \"PR123\",
\"name\" : \"ProductRef\",
\"isBundle\" : false
}";
#[test]
fn test_product_deserialise() {
let prod: ProductRefOrValue = serde_json::from_str(PRODREF_JSON).unwrap();
assert_eq!(prod.id.is_some(), true);
assert_eq!(prod.name.as_str(), "ProductRef");
assert_eq!(prod.is_bundle.is_some(), true);
assert_eq!(prod.is_bundle.unwrap(), false);
}
#[test]
fn test_productstatustype_deserialise() {
let prod_status: ProductStatusType = serde_json::from_str(PROD_STATUS_TYPE_JSON).unwrap();
assert_eq!(prod_status, ProductStatusType::Created);
}
}