diff --git a/crates/caldav/src/calendar/methods/report/sync_collection.rs b/crates/caldav/src/calendar/methods/report/sync_collection.rs index b44c77a..1afed83 100644 --- a/crates/caldav/src/calendar/methods/report/sync_collection.rs +++ b/crates/caldav/src/calendar/methods/report/sync_collection.rs @@ -27,8 +27,11 @@ impl Value for SyncLevel { Ok(match val { "1" => Self::One, "Infinity" => Self::Infinity, - // TODO: proper error - _ => return Err(rustical_xml::XmlDeError::UnknownError), + _ => { + return Err(rustical_xml::XmlDeError::Other( + "Invalid sync-level".to_owned(), + )) + } }) } fn serialize(&self) -> String { diff --git a/crates/carddav/src/addressbook/methods/report/sync_collection.rs b/crates/carddav/src/addressbook/methods/report/sync_collection.rs index ceba911..955f41f 100644 --- a/crates/carddav/src/addressbook/methods/report/sync_collection.rs +++ b/crates/carddav/src/addressbook/methods/report/sync_collection.rs @@ -26,8 +26,11 @@ impl Value for SyncLevel { Ok(match val { "1" => Self::One, "Infinity" => Self::Infinity, - // TODO: proper error - _ => return Err(rustical_xml::XmlDeError::UnknownError), + _ => { + return Err(rustical_xml::XmlDeError::Other( + "Invalid sync-level".to_owned(), + )) + } }) } fn serialize(&self) -> String { diff --git a/crates/store/src/calendar/timestamp.rs b/crates/store/src/calendar/timestamp.rs index 481c092..ac8588c 100644 --- a/crates/store/src/calendar/timestamp.rs +++ b/crates/store/src/calendar/timestamp.rs @@ -26,8 +26,9 @@ impl Value for UtcDateTime { let input = ::deserialize(val)?; Ok(Self( NaiveDateTime::parse_from_str(&input, UTC_DATE_TIME) - // TODO: proper error - .map_err(|_| rustical_xml::XmlDeError::UnknownError)? + .map_err(|_| { + rustical_xml::XmlDeError::Other("Could not parse as UTC timestamp".to_owned()) + })? .and_utc(), )) } diff --git a/crates/xml/derive/src/xml_enum.rs b/crates/xml/derive/src/xml_enum.rs index af0a5f2..c6b3f2c 100644 --- a/crates/xml/derive/src/xml_enum.rs +++ b/crates/xml/derive/src/xml_enum.rs @@ -31,7 +31,7 @@ impl Enum { ) -> Result { #(#variant_branches);* - Err(rustical_xml::XmlDeError::UnknownError) + Err(rustical_xml::XmlDeError::InvalidVariant("could not match".to_owned())) } } } @@ -162,12 +162,30 @@ impl Enum { let empty = matches!(event, Event::Empty(_)); match event { - Event::Decl(_) => { /* ignore this */ } - Event::Comment(_) => { /* ignore this */ } Event::Start(start) | Event::Empty(start) => { return ::deserialize(&mut reader, &start, empty); } - _ => return Err(::rustical_xml::XmlDeError::UnknownError), + + Event::Eof => return Err(::rustical_xml::XmlDeError::Eof), + Event::Text(bytes_text) => { + return Err(::rustical_xml::XmlDeError::UnsupportedEvent("Text")); + } + Event::CData(cdata) => { + return Err(::rustical_xml::XmlDeError::UnsupportedEvent("CDATA")); + } + Event::Comment(_) => { /* ignore */ } + Event::Decl(_) => { + return Err(::rustical_xml::XmlDeError::UnsupportedEvent("Declaration")); + } + Event::PI(_) => { + return Err(::rustical_xml::XmlDeError::UnsupportedEvent("Processing instruction")); + } + Event::DocType(doctype) => { + return Err(::rustical_xml::XmlDeError::UnsupportedEvent("Doctype in the middle of the document")); + } + Event::End(end) => { + return Err(::rustical_xml::XmlDeError::UnsupportedEvent("Premature end")); + } }; } } diff --git a/crates/xml/src/de.rs b/crates/xml/src/de.rs index 0c761cb..ec0b779 100644 --- a/crates/xml/src/de.rs +++ b/crates/xml/src/de.rs @@ -1,11 +1,9 @@ -use quick_xml::name::Namespace; +use quick_xml::events::{BytesStart, Event}; use quick_xml::name::ResolveResult; use std::io::BufRead; pub use xml_derive::XmlDeserialize; pub use xml_derive::XmlDocument; -use quick_xml::events::{BytesStart, Event}; - use crate::XmlDeError; use crate::XmlRootTag; @@ -69,7 +67,7 @@ impl XmlDocument for T { return Self::deserialize(&mut reader, &start, empty); } - _ => return Err(XmlDeError::UnknownError), + _ => return Err(XmlDeError::UnsupportedEvent("unknown, todo")), }; } } diff --git a/crates/xml/src/error.rs b/crates/xml/src/error.rs index 5ea9b76..a4d1ab0 100644 --- a/crates/xml/src/error.rs +++ b/crates/xml/src/error.rs @@ -6,8 +6,6 @@ pub enum XmlDeError { QuickXmlError(#[from] quick_xml::Error), #[error(transparent)] QuickXmlAttrError(#[from] quick_xml::events::attributes::AttrError), - #[error("Unknown error")] - UnknownError, #[error("Invalid tag [{0}]{1}. Expected [{2}]{3}")] InvalidTag(String, String, String, String), #[error("Missing field {0}")] diff --git a/crates/xml/src/value.rs b/crates/xml/src/value.rs index 6912de9..51de4b4 100644 --- a/crates/xml/src/value.rs +++ b/crates/xml/src/value.rs @@ -57,7 +57,7 @@ impl Value for &str { self.to_string() } - fn deserialize(val: &str) -> Result { + fn deserialize(_val: &str) -> Result { Err(XmlDeError::Other("TODO: Handle this error".to_owned())) } }