|
@@ -1,3 +1,4 @@
|
|
|
+use serde::de::{Deserializer, Error as DeError, Visitor};
|
|
|
use serde::Deserialize;
|
|
|
|
|
|
use once_cell::sync::OnceCell;
|
|
@@ -52,6 +53,15 @@ fn default_window() -> WindowConfig {
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+/// The embedded server port.
|
|
|
+#[derive(PartialEq, Debug, Deserialize)]
|
|
|
+pub enum Port {
|
|
|
+ /// Port with a numeric value.
|
|
|
+ Value(u16),
|
|
|
+ /// Random port.
|
|
|
+ Random,
|
|
|
+}
|
|
|
+
|
|
|
/// The embeddedServer configuration object.
|
|
|
#[derive(PartialEq, Deserialize, Debug)]
|
|
|
#[serde(tag = "embeddedServer", rename_all = "camelCase")]
|
|
@@ -61,16 +71,52 @@ pub struct EmbeddedServerConfig {
|
|
|
pub host: String,
|
|
|
/// The embedded server port.
|
|
|
/// If it's `random`, we'll generate one at runtime.
|
|
|
- #[serde(default = "default_port")]
|
|
|
- pub port: String,
|
|
|
+ #[serde(default = "default_port", deserialize_with = "port_deserializer")]
|
|
|
+ pub port: Port,
|
|
|
}
|
|
|
|
|
|
fn default_host() -> String {
|
|
|
"http://127.0.0.1".to_string()
|
|
|
}
|
|
|
|
|
|
-fn default_port() -> String {
|
|
|
- "random".to_string()
|
|
|
+fn port_deserializer<'de, D>(deserializer: D) -> Result<Port, D::Error>
|
|
|
+where
|
|
|
+ D: Deserializer<'de>,
|
|
|
+{
|
|
|
+ struct PortDeserializer;
|
|
|
+
|
|
|
+ impl<'de> Visitor<'de> for PortDeserializer {
|
|
|
+ type Value = Port;
|
|
|
+ fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
|
|
|
+ formatter.write_str("a port number or the 'random' string")
|
|
|
+ }
|
|
|
+
|
|
|
+ fn visit_str<E>(self, value: &str) -> Result<Self::Value, E>
|
|
|
+ where
|
|
|
+ E: DeError,
|
|
|
+ {
|
|
|
+ if value != "random" {
|
|
|
+ Err(DeError::custom(
|
|
|
+ "expected a 'random' string or a port number",
|
|
|
+ ))
|
|
|
+ } else {
|
|
|
+ Ok(Port::Random)
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ fn visit_u64<E>(self, value: u64) -> Result<Self::Value, E>
|
|
|
+ where
|
|
|
+ E: DeError,
|
|
|
+ {
|
|
|
+ Ok(Port::Value(value as u16))
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ deserializer.deserialize_any(PortDeserializer {})
|
|
|
+}
|
|
|
+
|
|
|
+fn default_port() -> Port {
|
|
|
+ Port::Random
|
|
|
}
|
|
|
|
|
|
fn default_embedded_server() -> EmbeddedServerConfig {
|
|
@@ -341,7 +387,7 @@ mod test {
|
|
|
},
|
|
|
embedded_server: EmbeddedServerConfig {
|
|
|
host: String::from("http://127.0.0.1"),
|
|
|
- port: String::from("random"),
|
|
|
+ port: Port::Random,
|
|
|
},
|
|
|
bundle: BundleConfig {
|
|
|
identifier: String::from("com.tauri.communication"),
|
|
@@ -437,7 +483,7 @@ mod test {
|
|
|
},
|
|
|
embedded_server: EmbeddedServerConfig {
|
|
|
host: String::from("http://127.0.0.1"),
|
|
|
- port: String::from("random"),
|
|
|
+ port: Port::Random,
|
|
|
},
|
|
|
bundle: BundleConfig {
|
|
|
identifier: String::from(""),
|