use std::collections::HashMap;
use reqwest::Method;
use serde::{Deserialize, Serialize};
use crate::core::{
api_resp::{ApiResponseTrait, BaseResponse, ResponseFormat},
config::Config,
constants::AccessTokenType,
improved_response_handler::{ImprovedResponseHandler, OptimizedBaseResponse},
request_executor::RequestExecutor,
req_option::RequestOption,
SDKResult,
};
pub struct MigrationExamples;
impl MigrationExamples {
pub async fn old_way_create_message(
config: &Config,
receive_id_type: &str,
body: CreateMessageBody,
option: Option<RequestOption>,
) -> SDKResult<BaseResponse<MessageData>> {
todo!("这是旧的实现方式,现已被RequestExecutor替代")
}
pub async fn new_way_create_message(
config: &Config,
receive_id_type: &str,
body: CreateMessageBody,
option: Option<RequestOption>,
) -> SDKResult<BaseResponse<MessageData>> {
let mut query_params = HashMap::new();
query_params.insert("receive_id_type", receive_id_type.to_string());
RequestExecutor::execute(
config,
Method::POST,
"/open-apis/im/v1/messages",
vec![AccessTokenType::Tenant, AccessTokenType::User],
Some(query_params),
Some(body),
option,
)
.await
}
pub async fn modern_way_create_message(
config: &Config,
receive_id_type: &str,
body: CreateMessageBody,
option: Option<RequestOption>,
) -> SDKResult<OptimizedBaseResponse<MessageData>> {
todo!("未来版本中,RequestExecutor 将支持 OptimizedBaseResponse")
}
}
pub struct PerformanceComparison;
impl PerformanceComparison {
pub async fn old_parsing_approach(json_response: &str) -> Result<BaseResponse<MessageData>, serde_json::Error> {
let raw_value: serde_json::Value = serde_json::from_str(json_response)?;
let base_response: BaseResponse<MessageData> = serde_json::from_value(raw_value)?;
Ok(base_response)
}
pub async fn new_parsing_approach(json_response: &str) -> Result<BaseResponse<MessageData>, serde_json::Error> {
let base_response: BaseResponse<MessageData> = serde_json::from_str(json_response)?;
Ok(base_response)
}
#[cfg(test)]
pub fn benchmark_parsing_methods() {
let json_data = r#"{"code": 0, "msg": "success", "data": {"message_id": "test123", "content": "Hello World"}}"#;
let start = std::time::Instant::now();
for _ in 0..1000 {
let _value: serde_json::Value = serde_json::from_str(json_data).unwrap();
let _result: Result<BaseResponse<MessageData>, _> = serde_json::from_value(_value);
}
let old_duration = start.elapsed();
let start = std::time::Instant::now();
for _ in 0..1000 {
let _result: Result<BaseResponse<MessageData>, _> = serde_json::from_str(json_data);
}
let new_duration = start.elapsed();
println!("旧方法(双重解析): {:?}", old_duration);
println!("新方法(单次解析): {:?}", new_duration);
println!("性能提升: {:.2}%", (old_duration.as_nanos() as f64 - new_duration.as_nanos() as f64) / old_duration.as_nanos() as f64 * 100.0);
}
}
pub struct ErrorHandlingImprovements;
impl ErrorHandlingImprovements {
pub fn old_error_handling(response_json: &str) -> SDKResult<BaseResponse<MessageData>> {
let raw_value: serde_json::Value = serde_json::from_str(response_json)?;
if raw_value["code"].as_i64() == Some(0) {
Ok(serde_json::from_value(raw_value)?)
} else {
todo!("手动构建错误响应")
}
}
pub async fn new_error_handling(response: reqwest::Response) -> SDKResult<BaseResponse<MessageData>> {
ImprovedResponseHandler::handle_response(response).await
}
}
pub struct CodeReuseComparison;
impl CodeReuseComparison {
pub fn calculate_code_reduction() -> (usize, usize, f64) {
const API_COUNT: usize = 193;
const OLD_LINES_PER_API: usize = 15;
const NEW_LINES_PER_API: usize = 5;
let old_total = API_COUNT * OLD_LINES_PER_API;
let new_total = API_COUNT * NEW_LINES_PER_API;
let reduction_percentage = (old_total - new_total) as f64 / old_total as f64 * 100.0;
(old_total, new_total, reduction_percentage)
}
}
#[derive(Debug, Serialize, Deserialize)]
pub struct CreateMessageBody {
pub receive_id: String,
pub msg_type: String,
pub content: String,
pub uuid: Option<String>,
}
#[derive(Debug, Deserialize)]
pub struct MessageData {
pub message_id: String,
pub content: String,
}
impl ApiResponseTrait for MessageData {
fn data_format() -> ResponseFormat {
ResponseFormat::Data
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_code_reduction_calculation() {
let (old_total, new_total, reduction) = CodeReuseComparison::calculate_code_reduction();
assert_eq!(old_total, 2895);
assert_eq!(new_total, 965);
assert!((reduction - 66.67).abs() < 0.1);
println!("代码减少统计:");
println!("原始代码行数: {}", old_total);
println!("优化后代码行数: {}", new_total);
println!("减少比例: {:.2}%", reduction);
}
#[test]
fn test_parsing_performance() {
let json_data = r#"{"code": 0, "msg": "success", "data": {"message_id": "test123", "content": "Hello World"}}"#;
let start = std::time::Instant::now();
let _value: serde_json::Value = serde_json::from_str(json_data).unwrap();
let _result: Result<BaseResponse<MessageData>, _> = serde_json::from_value(_value);
let double_parse_time = start.elapsed();
let start = std::time::Instant::now();
let _result: Result<BaseResponse<MessageData>, _> = serde_json::from_str(json_data);
let single_parse_time = start.elapsed();
println!("双重解析时间: {:?}", double_parse_time);
println!("单次解析时间: {:?}", single_parse_time);
}
}
pub struct Phase3MigrationChecklist;