melodium_repository/global/
author.rs

1use 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}