use serde::{Deserialize, Serialize};
#[derive(Clone, Copy, Debug, Default, Deserialize, Eq, Hash, PartialEq, Serialize)]
#[serde(rename_all = "camelCase")]
#[non_exhaustive]
pub enum SubscriptionBalancerStrategy {
LeastLoad,
LeastPing,
#[default]
Random,
RoundRobin,
#[serde(other)]
Unknown,
}
impl SubscriptionBalancerStrategy {
pub(crate) const fn as_str(self) -> Option<&'static str> {
match self {
Self::LeastLoad => Some("leastLoad"),
Self::LeastPing => Some("leastPing"),
Self::Random => Some("random"),
Self::RoundRobin => Some("roundRobin"),
Self::Unknown => None,
}
}
}
#[derive(Clone, Debug, Default, Deserialize, Eq, PartialEq, Serialize)]
#[serde(default, rename_all = "camelCase")]
pub struct SubscriptionBalancer {
pub id: i64,
pub remark: String,
pub strategy: SubscriptionBalancerStrategy,
pub inbound_ids: Vec<i64>,
pub sort_order: i32,
pub enabled: bool,
pub created_at: i64,
pub updated_at: i64,
}
#[derive(Clone, Debug, Eq, PartialEq)]
pub struct SubscriptionBalancerInput {
pub remark: String,
pub strategy: SubscriptionBalancerStrategy,
pub inbound_ids: Vec<i64>,
pub sort_order: i32,
pub enabled: Option<bool>,
}
impl SubscriptionBalancerInput {
pub fn new(remark: impl Into<String>, inbound_ids: Vec<i64>) -> Self {
Self {
remark: remark.into(),
strategy: SubscriptionBalancerStrategy::Random,
inbound_ids,
sort_order: 1,
enabled: Some(true),
}
}
}