1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
pub mod project;
pub mod tag;
pub mod user;
pub mod version;
pub type UtcTime = chrono::DateTime<chrono::Utc>;
pub type Number = usize;
pub type ID = String;
use serde::{Deserialize, Serialize};
use url::Url;
fn deserialise_optional_url<'de, D: serde::Deserializer<'de>>(
de: D,
) -> Result<Option<Url>, D::Error> {
use serde::de::{Error, Unexpected};
use std::borrow::Cow;
let intermediate = <Option<Cow<'de, str>>>::deserialize(de)?;
match intermediate.as_deref() {
None | Some("") => Ok(None),
Some(s) => Url::parse(s).map_or_else(
|err| {
Err(Error::invalid_value(
Unexpected::Str(s),
&err.to_string().as_str(),
))
},
|ok| Ok(Some(ok)),
),
}
}