Made Url serde-compatible
This commit is contained in:
parent
5e6eb6863c
commit
61784a9c55
2 changed files with 29 additions and 1 deletions
|
@ -2,6 +2,7 @@ use std::convert::TryFrom;
|
|||
use std::error::Error;
|
||||
|
||||
use url::Url;
|
||||
use serde::{Deserialize, Serialize};
|
||||
|
||||
use crate::task::Task;
|
||||
use crate::task::TaskId;
|
||||
|
@ -9,6 +10,7 @@ use crate::task::TaskId;
|
|||
use bitflags::bitflags;
|
||||
|
||||
bitflags! {
|
||||
#[derive(Serialize, Deserialize)]
|
||||
pub struct SupportedComponents: u8 {
|
||||
/// An event, such as a calendar meeting
|
||||
const EVENT = 1;
|
||||
|
@ -45,9 +47,10 @@ impl TryFrom<minidom::Element> for SupportedComponents {
|
|||
|
||||
|
||||
/// A Caldav Calendar
|
||||
#[derive(Clone, Debug)]
|
||||
#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)]
|
||||
pub struct Calendar {
|
||||
name: String,
|
||||
#[serde(with="crate::utils::url_serde")]
|
||||
url: Url,
|
||||
supported_components: SupportedComponents,
|
||||
|
||||
|
|
25
src/utils.rs
25
src/utils.rs
|
@ -1,6 +1,7 @@
|
|||
///! Some utility functions
|
||||
|
||||
use minidom::Element;
|
||||
use serde::Deserialize;
|
||||
|
||||
/// Walks an XML tree and returns every element that has the given name
|
||||
pub fn find_elems<S: AsRef<str>>(root: &Element, searched_name: S) -> Vec<&Element> {
|
||||
|
@ -50,3 +51,27 @@ pub fn print_xml(element: &Element) {
|
|||
|
||||
writer.write(&[0x0a]);
|
||||
}
|
||||
|
||||
|
||||
/// Used to (de)serialize url::Url
|
||||
pub mod url_serde{
|
||||
use super::*;
|
||||
|
||||
pub fn deserialize<'de, D>(deserializer: D) -> Result<url::Url, D::Error>
|
||||
where
|
||||
D: serde::de::Deserializer<'de>
|
||||
{
|
||||
let s = String::deserialize(deserializer)?;
|
||||
match url::Url::parse(&s) {
|
||||
Ok(u) => Ok(u),
|
||||
Err(_) => { return Err(serde::de::Error::invalid_value(serde::de::Unexpected::Str(&s), &"Expected an url")); }
|
||||
}
|
||||
}
|
||||
|
||||
pub fn serialize<S>(u: &url::Url, serializer: S) -> Result<S::Ok, S::Error>
|
||||
where
|
||||
S: serde::ser::Serializer,
|
||||
{
|
||||
serializer.serialize_str( u.as_str() )
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Add table
Reference in a new issue