j_api/link/
mod.rs

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 /*, meta*/),
9    SelfReference(&'a str),
10    SelfReferenceObject(&'a str /*, meta*/),
11    About(&'a str),
12    AboutObject(&'a str /*, meta*/),
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    // TODO: Meta
24}
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}