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