use serde::Serialize;
use crate::error::{WxPayError, WxPayResult};
pub fn to_json<T: Serialize>(value: &T) -> WxPayResult<String> {
serde_json::to_string(value).map_err(WxPayError::from)
}
pub fn to_json_pretty<T: Serialize>(value: &T) -> WxPayResult<String> {
serde_json::to_string_pretty(value).map_err(WxPayError::from)
}
pub fn to_url_encoded<T: Serialize>(value: &T) -> WxPayResult<String> {
serde_urlencoded::to_string(value).map_err(|e| {
WxPayError::UrlEncodeError(format!("URL 编码失败:{}", e))
})
}
pub fn from_json<T: serde::de::DeserializeOwned>(json: &str) -> WxPayResult<T> {
serde_json::from_str(json).map_err(WxPayError::from)
}
pub fn from_json_bytes<T: serde::de::DeserializeOwned>(bytes: &[u8]) -> WxPayResult<T> {
serde_json::from_slice(bytes).map_err(WxPayError::from)
}
pub fn base64_encode(data: &[u8]) -> String {
use base64::Engine;
base64::engine::general_purpose::STANDARD.encode(data)
}
pub fn base64_decode(encoded: &str) -> WxPayResult<Vec<u8>> {
use base64::Engine;
base64::engine::general_purpose::STANDARD
.decode(encoded)
.map_err(|e| WxPayError::InternalError(format!("Base64 解码失败:{}", e)))
}
pub fn hex_encode(data: &[u8]) -> String {
hex::encode(data)
}
pub fn hex_decode(encoded: &str) -> WxPayResult<Vec<u8>> {
hex::decode(encoded).map_err(|e| {
WxPayError::InternalError(format!("Hex 解码失败:{}", e))
})
}
#[cfg(test)]
mod tests {
use super::*;
use serde::{Deserialize, Serialize};
#[derive(Debug, Serialize, Deserialize, PartialEq)]
struct TestStruct {
name: String,
value: i32,
}
#[test]
fn test_to_json() {
let test = TestStruct {
name: "test".to_string(),
value: 42,
};
let json = to_json(&test).unwrap();
assert!(json.contains("test"));
assert!(json.contains("42"));
}
#[test]
fn test_to_json_pretty() {
let test = TestStruct {
name: "test".to_string(),
value: 42,
};
let json = to_json_pretty(&test).unwrap();
assert!(json.contains('\n'));
}
#[test]
fn test_from_json() {
let json = r#"{"name":"test","value":42}"#;
let test: TestStruct = from_json(json).unwrap();
assert_eq!(test.name, "test");
assert_eq!(test.value, 42);
}
#[test]
fn test_from_json_bytes() {
let json = br#"{"name":"test","value":42}"#;
let test: TestStruct = from_json_bytes(json).unwrap();
assert_eq!(test.name, "test");
assert_eq!(test.value, 42);
}
#[test]
fn test_base64_encode_decode() {
let data = b"Hello, World!";
let encoded = base64_encode(data);
let decoded = base64_decode(&encoded).unwrap();
assert_eq!(decoded, data);
}
#[test]
fn test_hex_encode_decode() {
let data = b"Hello";
let encoded = hex_encode(data);
let decoded = hex_decode(&encoded).unwrap();
assert_eq!(decoded, data);
}
#[test]
fn test_to_url_encoded() {
let test = TestStruct {
name: "test".to_string(),
value: 42,
};
let encoded = to_url_encoded(&test).unwrap();
assert!(encoded.contains("name=test"));
assert!(encoded.contains("value=42"));
}
}