Skip to main content

activities/link/
link.rs

1use crate::link::{LinkType, Mime};
2use isolang::Language;
3use serde::{Deserialize, Serialize};
4
5use crate::link::Url;
6
7use derive_builder::Builder;
8use std::convert::TryFrom;
9
10const LINK_TYPE: &'static str = "Link";
11
12#[derive(Serialize, Deserialize, Builder, Clone)]
13pub struct Link {
14    // #[serde(rename="type")]
15    r#type: String,
16    href: Url,
17    #[serde(skip_serializing_if = "Option::is_none")]
18    media_type: Option<Mime>,
19    #[serde(skip_serializing_if = "Option::is_none")]
20    name: Option<String>,
21    #[serde(skip_serializing_if = "Option::is_none")]
22    rel: Option<String>,
23    #[serde(skip_serializing_if = "Option::is_none")]
24    href_lang: Option<Language>,
25}
26
27impl Default for Link {
28    fn default() -> Self {
29        Self {
30            r#type: LINK_TYPE.to_string(),
31            href: Url::new("https://dbhattarai.info.np".parse().unwrap()),
32            media_type: None,
33            name: None,
34            rel: None,
35            href_lang: None,
36        }
37    }
38}
39
40impl TryFrom<&str> for Link {
41    type Error = ();
42
43    fn try_from(value: &str) -> Result<Self, Self::Error> {
44        let url: url::Url = value.parse().unwrap();
45        let href = Url::new(url);
46        Ok(Self {
47            href,
48            ..Default::default()
49        })
50    }
51}
52impl LinkType for Link {
53    fn href(&self) -> &Url {
54        &self.href
55    }
56
57    fn media_type(&self) -> Option<&Mime> {
58        match &self.media_type {
59            Some(val) => Some(val),
60            _ => None,
61        }
62    }
63
64    fn name(&self) -> Option<&String> {
65        match &self.name {
66            Some(val) => Some(val),
67            _ => None,
68        }
69    }
70
71    fn rel(&self) -> Option<&String> {
72        match &self.rel {
73            Some(val) => Some(val),
74            _ => None,
75        }
76    }
77
78    fn href_lang(&self) -> Option<&Language> {
79        match &self.href_lang {
80            Some(val) => Some(val),
81            _ => None,
82        }
83    }
84}