|
use crate::{ |
|
app::constant::{COMMA, COMMA_STRING}, |
|
chat::{config::key_config, constant::AVAILABLE_MODELS}, |
|
}; |
|
use serde::{Deserialize, Serialize}; |
|
|
|
|
|
#[derive(Clone, PartialEq)] |
|
pub enum UsageCheck { |
|
None, |
|
Default, |
|
All, |
|
Custom(Vec<&'static str>), |
|
} |
|
|
|
impl UsageCheck { |
|
pub fn from_proto(model: Option<&key_config::UsageCheckModel>) -> Option<Self> { |
|
model.map(|model| { |
|
use key_config::usage_check_model::Type; |
|
match Type::try_from(model.r#type).unwrap_or(Type::Default) { |
|
Type::Default | Type::Disabled => Self::None, |
|
Type::All => Self::All, |
|
Type::Custom => { |
|
let models: Vec<&'static str> = model |
|
.model_ids |
|
.iter() |
|
.filter_map(|id| AVAILABLE_MODELS.iter().find(|m| m.id == id).map(|m| m.id)) |
|
.collect(); |
|
if models.is_empty() { |
|
Self::None |
|
} else { |
|
Self::Custom(models) |
|
} |
|
} |
|
} |
|
}) |
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
} |
|
|
|
impl Default for UsageCheck { |
|
fn default() -> Self { |
|
Self::Default |
|
} |
|
} |
|
|
|
impl Serialize for UsageCheck { |
|
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error> |
|
where |
|
S: serde::Serializer, |
|
{ |
|
use serde::ser::SerializeStruct; |
|
let mut state = serializer.serialize_struct("UsageCheck", 1)?; |
|
match self { |
|
UsageCheck::None => { |
|
state.serialize_field("type", "none")?; |
|
} |
|
UsageCheck::Default => { |
|
state.serialize_field("type", "default")?; |
|
} |
|
UsageCheck::All => { |
|
state.serialize_field("type", "all")?; |
|
} |
|
UsageCheck::Custom(models) => { |
|
state.serialize_field("type", "list")?; |
|
state.serialize_field("content", &models.join(COMMA_STRING))?; |
|
} |
|
} |
|
state.end() |
|
} |
|
} |
|
|
|
impl<'de> Deserialize<'de> for UsageCheck { |
|
fn deserialize<D>(deserializer: D) -> Result<Self, D::Error> |
|
where |
|
D: serde::Deserializer<'de>, |
|
{ |
|
#[derive(Deserialize)] |
|
#[serde(tag = "type", content = "content")] |
|
enum UsageCheckHelper { |
|
#[serde(rename = "none")] |
|
None, |
|
#[serde(rename = "default")] |
|
Default, |
|
#[serde(rename = "all")] |
|
All, |
|
#[serde(rename = "list")] |
|
Custom(String), |
|
} |
|
|
|
let helper = <UsageCheckHelper as serde::Deserialize>::deserialize(deserializer)?; |
|
Ok(match helper { |
|
UsageCheckHelper::None => UsageCheck::None, |
|
UsageCheckHelper::Default => UsageCheck::Default, |
|
UsageCheckHelper::All => UsageCheck::All, |
|
UsageCheckHelper::Custom(list) => { |
|
if list.is_empty() { |
|
return Ok(UsageCheck::None); |
|
} |
|
|
|
let models: Vec<&'static str> = list |
|
.split(COMMA) |
|
.filter_map(|model| { |
|
let model = model.trim(); |
|
AVAILABLE_MODELS |
|
.iter() |
|
.find(|m| m.id == model) |
|
.map(|m| m.id) |
|
}) |
|
.collect(); |
|
|
|
if models.is_empty() { |
|
UsageCheck::None |
|
} else { |
|
UsageCheck::Custom(models) |
|
} |
|
} |
|
}) |
|
} |
|
} |
|
|
|
impl UsageCheck { |
|
pub fn from_str(s: &str) -> Self { |
|
match s.trim().to_lowercase().as_str() { |
|
"none" | "disabled" => Self::None, |
|
"default" => Self::Default, |
|
"all" | "everything" => Self::All, |
|
list => { |
|
if list.is_empty() { |
|
return Self::default(); |
|
} |
|
let models: Vec<&'static str> = list |
|
.split(COMMA) |
|
.filter_map(|model| { |
|
let model = model.trim(); |
|
AVAILABLE_MODELS |
|
.iter() |
|
.find(|m| m.id == model) |
|
.map(|m| m.id) |
|
}) |
|
.collect(); |
|
|
|
if models.is_empty() { |
|
Self::default() |
|
} else { |
|
Self::Custom(models) |
|
} |
|
} |
|
} |
|
} |
|
} |
|
|