1use serde::{Deserialize, Serialize};
2use std::collections::HashMap;
3
4#[derive(Debug, Clone, Serialize, Deserialize)]
5#[serde(untagged)]
6pub enum Link<'a, 'b> {
7 String(&'a str, &'b str),
8 Object(&'a str, &'b str ),
9 SelfReference(&'a str),
10 SelfReferenceObject(&'a str ),
11 About(&'a str),
12 AboutObject(&'a str ),
13 First(&'a str),
14 Last(&'a str),
15 Previous(&'a str),
16 Next(&'a str),
17 Related(&'a str),
18}
19
20#[derive(Debug, Clone, Serialize, Deserialize)]
21pub struct LinkObject {
22 href: String,
23 }
25
26#[derive(Debug, Clone, Serialize, Deserialize)]
27#[serde(untagged)]
28enum LinkType {
29 String(String),
30 Object(LinkObject),
31}
32
33#[derive(Debug, Clone, Serialize, Deserialize)]
34pub struct Links {
35 #[serde(flatten)]
36 links: HashMap<String, LinkType>,
37}
38
39impl Links {
40 pub fn new(links: Vec<Link>) -> Self {
41 let mut link_map = HashMap::new();
42 for link in links {
43 match link {
44 Link::String(key, href) => {
45 link_map.insert(key.to_string(), LinkType::String(href.to_string()));
46 }
47 Link::Object(key, href) => {
48 link_map.insert(
49 key.to_string(),
50 LinkType::Object(LinkObject {
51 href: href.to_string(),
52 }),
53 );
54 }
55 Link::SelfReference(href) => {
56 link_map.insert("self".to_string(), LinkType::String(href.to_string()));
57 }
58 Link::SelfReferenceObject(href) => {
59 link_map.insert(
60 "self".to_string(),
61 LinkType::Object(LinkObject {
62 href: href.to_string(),
63 }),
64 );
65 }
66 Link::About(href) => {
67 link_map.insert("about".to_string(), LinkType::String(href.to_string()));
68 }
69 Link::AboutObject(href) => {
70 link_map.insert(
71 "about".to_string(),
72 LinkType::Object(LinkObject {
73 href: href.to_string(),
74 }),
75 );
76 }
77
78 Link::First(href) => {
79 link_map.insert("first".to_string(), LinkType::String(href.to_string()));
80 }
81 Link::Last(href) => {
82 link_map.insert("last".to_string(), LinkType::String(href.to_string()));
83 }
84 Link::Previous(href) => {
85 link_map.insert("prev".to_string(), LinkType::String(href.to_string()));
86 }
87 Link::Next(href) => {
88 link_map.insert("next".to_string(), LinkType::String(href.to_string()));
89 }
90 Link::Related(href) => {
91 link_map.insert("related".to_string(), LinkType::String(href.to_string()));
92 }
93 }
94 }
95 Links { links: link_map }
96 }
97}