use chrono::{DateTime, Utc};
use serde::{Deserialize, Serialize};
use tmf_apis_core::BaseEntity;
use utoipa::ToSchema;
use uuid::Uuid;
#[derive(Debug, Clone, Serialize, Deserialize, ToSchema)]
#[serde(rename_all = "SCREAMING_SNAKE_CASE")]
pub enum SliceState {
Planned,
Active,
Inactive,
Terminated,
}
#[derive(Debug, Clone, Serialize, Deserialize, ToSchema)]
#[serde(rename_all = "SCREAMING_SNAKE_CASE")]
pub enum SliceType {
EnhancedMobileBroadband,
UltraReliableLowLatency,
MassiveMachineTypeCommunications,
Custom,
}
#[derive(Debug, Clone, Serialize, Deserialize, ToSchema)]
pub struct NetworkSlice {
#[serde(flatten)]
pub base: BaseEntity,
pub state: SliceState,
pub slice_type: SliceType,
#[serde(skip_serializing_if = "Option::is_none")]
pub sla_parameters: Option<SLAParameters>,
#[serde(skip_serializing_if = "Option::is_none")]
pub network_functions: Option<Vec<NetworkFunctionRef>>,
#[serde(skip_serializing_if = "Option::is_none")]
#[schema(value_type = String, format = "date-time")]
pub activation_date: Option<DateTime<Utc>>,
#[serde(skip_serializing_if = "Option::is_none")]
#[schema(value_type = String, format = "date-time")]
pub termination_date: Option<DateTime<Utc>>,
}
#[derive(Debug, Clone, Serialize, Deserialize, ToSchema)]
pub struct SLAParameters {
#[serde(skip_serializing_if = "Option::is_none")]
pub max_latency_ms: Option<u32>,
#[serde(skip_serializing_if = "Option::is_none")]
pub min_throughput_mbps: Option<u32>,
#[serde(skip_serializing_if = "Option::is_none")]
pub max_devices: Option<u32>,
#[serde(skip_serializing_if = "Option::is_none")]
pub coverage_area: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize, ToSchema)]
pub struct NetworkFunctionRef {
#[schema(value_type = String, format = "uuid")]
pub id: Uuid,
#[serde(skip_serializing_if = "Option::is_none")]
pub href: Option<String>,
pub name: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub function_type: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize, ToSchema)]
pub struct CreateNetworkSliceRequest {
pub name: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub description: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub version: Option<String>,
pub slice_type: SliceType,
#[serde(skip_serializing_if = "Option::is_none")]
pub sla_parameters: Option<CreateSLAParametersRequest>,
#[serde(skip_serializing_if = "Option::is_none")]
pub network_functions: Option<Vec<CreateNetworkFunctionRefRequest>>,
#[serde(skip_serializing_if = "Option::is_none")]
#[schema(value_type = String, format = "date-time")]
pub activation_date: Option<DateTime<Utc>>,
}
#[derive(Debug, Clone, Serialize, Deserialize, ToSchema)]
pub struct CreateSLAParametersRequest {
#[serde(skip_serializing_if = "Option::is_none")]
pub max_latency_ms: Option<u32>,
#[serde(skip_serializing_if = "Option::is_none")]
pub min_throughput_mbps: Option<u32>,
#[serde(skip_serializing_if = "Option::is_none")]
pub max_devices: Option<u32>,
#[serde(skip_serializing_if = "Option::is_none")]
pub coverage_area: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize, ToSchema)]
pub struct CreateNetworkFunctionRefRequest {
#[schema(value_type = String, format = "uuid")]
pub id: Uuid,
pub name: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub function_type: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize, ToSchema)]
pub struct UpdateNetworkSliceRequest {
#[serde(skip_serializing_if = "Option::is_none")]
pub state: Option<SliceState>,
#[serde(skip_serializing_if = "Option::is_none")]
#[schema(value_type = String, format = "date-time")]
pub activation_date: Option<DateTime<Utc>>,
#[serde(skip_serializing_if = "Option::is_none")]
#[schema(value_type = String, format = "date-time")]
pub termination_date: Option<DateTime<Utc>>,
}