fix: deserialize_single_or_vec

This commit is contained in:
zeke
2024-11-26 16:01:38 +08:00
parent d492be9d34
commit 9ae5e527b5

View File

@@ -18,12 +18,12 @@ use futures::{
}; };
// use http::HeaderName as HttpHeaderName; // use http::HeaderName as HttpHeaderName;
use regex::Regex; use regex::Regex;
use serde::Deserializer;
use serde::{Deserialize, Serialize}; use serde::{Deserialize, Serialize};
use std::str::FromStr; use std::str::FromStr;
use std::{convert::Infallible, time::Duration}; use std::{convert::Infallible, time::Duration};
use tower_http::cors::{Any, CorsLayer}; use tower_http::cors::{Any, CorsLayer};
use uuid::Uuid; use uuid::Uuid;
mod hex_utils; mod hex_utils;
use hex_utils::{chunk_to_utf8_string, string_to_hex}; use hex_utils::{chunk_to_utf8_string, string_to_hex};
@@ -31,9 +31,30 @@ use hex_utils::{chunk_to_utf8_string, string_to_hex};
#[derive(Debug, Deserialize)] #[derive(Debug, Deserialize)]
struct Message { struct Message {
role: String, role: String,
#[serde(deserialize_with = "deserialize_single_or_vec")]
content: Vec<ContentPart>, content: Vec<ContentPart>,
} }
// 添加一个辅助枚举
#[derive(Deserialize)]
#[serde(untagged)]
enum SingleOrVec<T> {
Single(T),
Vec(Vec<T>),
}
// 简单的辅助函数
fn deserialize_single_or_vec<'de, D, T>(deserializer: D) -> Result<Vec<T>, D::Error>
where
D: Deserializer<'de>,
T: Deserialize<'de>,
{
let value = SingleOrVec::deserialize(deserializer)?;
Ok(match value {
SingleOrVec::Single(x) => vec![x],
SingleOrVec::Vec(x) => x,
})
}
#[derive(Debug, Deserialize)] #[derive(Debug, Deserialize)]
#[serde(tag = "type")] #[serde(tag = "type")]
enum ContentPart { enum ContentPart {