|
1 | 1 | use serde::{Deserialize, Serialize}; |
2 | 2 |
|
| 3 | +/// accpet number as integer |
| 4 | +pub mod port_deserializer { |
| 5 | + use serde::{de, Deserializer}; |
| 6 | + use std::fmt; |
| 7 | + |
| 8 | + pub fn deserialize<'de, D>(deserializer: D) -> Result<u16, D::Error> |
| 9 | + where |
| 10 | + D: Deserializer<'de>, |
| 11 | + { |
| 12 | + struct PortVisitor; |
| 13 | + |
| 14 | + impl<'de> de::Visitor<'de> for PortVisitor { |
| 15 | + type Value = u16; |
| 16 | + |
| 17 | + fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result { |
| 18 | + formatter.write_str("一个整数或能转换为整数的小数") |
| 19 | + } |
| 20 | + |
| 21 | + // 处理整数 |
| 22 | + fn visit_u64<E>(self, value: u64) -> Result<Self::Value, E> |
| 23 | + where |
| 24 | + E: de::Error, |
| 25 | + { |
| 26 | + if value > u16::MAX as u64 { |
| 27 | + return Err(E::custom(format!("端口号超出范围: {}", value))); |
| 28 | + } |
| 29 | + Ok(value as u16) |
| 30 | + } |
| 31 | + |
| 32 | + // 处理有符号整数 |
| 33 | + fn visit_i64<E>(self, value: i64) -> Result<Self::Value, E> |
| 34 | + where |
| 35 | + E: de::Error, |
| 36 | + { |
| 37 | + if value < 0 || value > u16::MAX as i64 { |
| 38 | + return Err(E::custom(format!("端口号超出范围: {}", value))); |
| 39 | + } |
| 40 | + Ok(value as u16) |
| 41 | + } |
| 42 | + |
| 43 | + // 处理浮点数 |
| 44 | + fn visit_f64<E>(self, value: f64) -> Result<Self::Value, E> |
| 45 | + where |
| 46 | + E: de::Error, |
| 47 | + { |
| 48 | + if value < 0.0 || value > u16::MAX as f64 { |
| 49 | + return Err(E::custom(format!("端口号超出范围: {}", value))); |
| 50 | + } |
| 51 | + Ok(value as u16) |
| 52 | + } |
| 53 | + } |
| 54 | + |
| 55 | + deserializer.deserialize_any(PortVisitor) |
| 56 | + } |
| 57 | +} |
| 58 | + |
3 | 59 | #[derive(Debug, Clone, Serialize, Deserialize)] |
4 | 60 | #[serde(rename_all = "camelCase")] |
5 | 61 | pub struct EmmyNewDebugArguments { |
6 | 62 | pub host: String, |
| 63 | + #[serde(deserialize_with = "port_deserializer::deserialize")] |
7 | 64 | pub port: u16, |
8 | 65 | pub ext: Vec<String>, |
9 | 66 | pub ide_connect_debugger: bool, |
|
0 commit comments