devin15/cursor2api-rust
0
1use crate::chat::constant::AVAILABLE_MODELS;2use serde::{Deserialize, Serialize};3 4#[derive(Clone)]5pub enum UsageCheck {6 None,7 Default,8 All,9 Custom(Vec<&'static str>),10}11 12impl Default for UsageCheck {13 fn default() -> Self {14 Self::Default15 }16}17 18impl Serialize for UsageCheck {19 fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>20 where21 S: serde::Serializer,22 {23 use serde::ser::SerializeStruct;24 let mut state = serializer.serialize_struct("UsageCheck", 1)?;25 match self {26 UsageCheck::None => {27 state.serialize_field("type", "none")?;28 }29 UsageCheck::Default => {30 state.serialize_field("type", "default")?;31 }32 UsageCheck::All => {33 state.serialize_field("type", "all")?;34 }35 UsageCheck::Custom(models) => {36 state.serialize_field("type", "list")?;37 state.serialize_field("content", &models.join(","))?;38 }39 }40 state.end()41 }42}43 44impl<'de> Deserialize<'de> for UsageCheck {45 fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>46 where47 D: serde::Deserializer<'de>,48 {49 #[derive(Deserialize)]50 #[serde(tag = "type", content = "content")]51 enum UsageCheckHelper {52 #[serde(rename = "none")]53 None,54 #[serde(rename = "default")]55 Default,56 #[serde(rename = "all")]57 All,58 #[serde(rename = "list")]59 Custom(String),60 }61 62 let helper = UsageCheckHelper::deserialize(deserializer)?;63 Ok(match helper {64 UsageCheckHelper::None => UsageCheck::None,65 UsageCheckHelper::Default => UsageCheck::Default,66 UsageCheckHelper::All => UsageCheck::All,67 UsageCheckHelper::Custom(list) => {68 if list.is_empty() {69 return Ok(UsageCheck::None);70 }71 72 let models: Vec<&'static str> = list73 .split(',')74 .filter_map(|model| {75 let model = model.trim();76 AVAILABLE_MODELS77 .iter()78 .find(|m| m.id == model)79 .map(|m| m.id)80 })81 .collect();82 83 if models.is_empty() {84 UsageCheck::None85 } else {86 UsageCheck::Custom(models)87 }88 }89 })90 }91}92 