diff --git a/packages/html/src/events/form.rs b/packages/html/src/events/form.rs index e3b35b098..6346a99e6 100644 --- a/packages/html/src/events/form.rs +++ b/packages/html/src/events/form.rs @@ -1,11 +1,12 @@ use std::{any::Any, collections::HashMap, fmt::Debug}; use dioxus_core::Event; -use serde::{Deserialize, Serialize}; +use serde::{de::Error, Deserialize, Serialize}; pub type FormEvent = Event; -#[derive(Serialize, Deserialize)] +#[derive(Serialize, Deserialize, Debug)] +#[serde(untagged)] // this will serialize Text(String) -> String and VecText(Vec) to Vec enum ValueType { Text(String), VecText(Vec), @@ -30,13 +31,21 @@ pub struct FormData { pub files: Option>, } +fn convert_hashmap_to_json(hashmap: &HashMap) -> serde_json::Result +where + K: Serialize + std::hash::Hash + Eq, + V: Serialize, +{ + serde_json::to_string(hashmap) +} + impl FormData { // ***** function to parse the 'values' to make it ready to use******* // e.g - self.values = { username: ["rust"], password: ["dioxus"]} // what we need it to be: { username: "rust", password: "dioxus"} - fn get_parsed_values(&self) -> Option> { + fn get_parsed_values(&self) -> Result { if self.values.is_empty() { - return None; + return Err(serde_json::Error::custom("Values is empty")); } let raw_values = self.values.clone(); @@ -58,21 +67,24 @@ impl FormData { parsed_values.insert(fieldname, ValueType::VecText(values.clone())); } else { // handle single value - case 2 - let prepared_value = values.into_iter().next()?; + let prepared_value = values.into_iter().next().unwrap(); parsed_values.insert(fieldname, ValueType::Text(prepared_value)); } } - Some(parsed_values) + // convert HashMap to JSON string + convert_hashmap_to_json(&parsed_values) } pub fn parse_json(&self) -> Result where T: serde::de::DeserializeOwned, { - let formatted = self.get_parsed_values(); - let as_string = serde_json::to_string(&formatted)?; - serde_json::from_str(&as_string) + let parsed_json = self + .get_parsed_values() + .expect("Failed to parse values to JSON"); + + serde_json::from_str(&parsed_json) } }