melodium_repository/global/
author.rs1use cargo_author::Author as AuthorParsing;
2use serde::{Deserialize, Serialize};
3
4#[derive(Clone, Debug)]
5pub struct Author {
6 pub name: Option<String>,
7 pub email: Option<String>,
8 pub url: Option<String>,
9}
10
11impl Author {
12 pub fn new(s: &str) -> Self {
13 let author = AuthorParsing::new(s);
14 Self {
15 name: author.name,
16 email: author.email,
17 url: author.url,
18 }
19 }
20}
21
22impl Serialize for Author {
23 fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
24 where
25 S: serde::Serializer,
26 {
27 serializer.serialize_str(
28 &vec![
29 self.name.clone(),
30 self.email.clone().map(|e| format!("<{e}>")),
31 self.url.clone().map(|u| format!("({u})")),
32 ]
33 .into_iter()
34 .filter_map(|o| o)
35 .collect::<Vec<_>>()
36 .join(" "),
37 )
38 }
39}
40
41impl<'de> Deserialize<'de> for Author {
42 fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
43 where
44 D: serde::Deserializer<'de>,
45 {
46 Deserialize::deserialize(deserializer).map(|author: String| Author::new(&author))
47 }
48}