Skip to main content

rullst_orm/
resource.rs

1use serde_json::Value;
2
3pub trait ApiResource {
4    fn to_array(&self) -> Value;
5}
6
7pub struct JsonResource<'a, T: ApiResource> {
8    pub data: &'a T,
9}
10
11impl<'a, T: ApiResource> JsonResource<'a, T> {
12    pub fn new(data: &'a T) -> Self {
13        Self { data }
14    }
15
16    pub fn resolve(&self) -> Value {
17        self.data.to_array()
18    }
19}
20
21pub struct ResourceCollection<'a, T: ApiResource> {
22    pub data: &'a [T],
23}
24
25impl<'a, T: ApiResource> ResourceCollection<'a, T> {
26    pub fn new(data: &'a [T]) -> Self {
27        Self { data }
28    }
29
30    pub fn resolve(&self) -> Value {
31        let array: Vec<Value> = self.data.iter().map(|item| item.to_array()).collect();
32        serde_json::json!(array)
33    }
34}
35
36#[cfg(test)]
37mod tests {
38    use super::*;
39    use serde_json::json;
40
41    struct DummyResource {
42        value: i32,
43    }
44
45    impl ApiResource for DummyResource {
46        fn to_array(&self) -> Value {
47            json!({ "value": self.value })
48        }
49    }
50
51    #[test]
52    fn test_json_resource_new_stores_data() {
53        let r = DummyResource { value: 42 };
54        let jr = JsonResource::new(&r);
55        assert_eq!(jr.data.value, 42);
56    }
57
58    #[test]
59    fn test_json_resource_resolve() {
60        let r = DummyResource { value: 7 };
61        let jr = JsonResource::new(&r);
62        let v = jr.resolve();
63        assert_eq!(v["value"], 7);
64    }
65
66    #[test]
67    fn test_resource_collection_new_stores_slice() {
68        let items = vec![DummyResource { value: 1 }, DummyResource { value: 2 }];
69        let rc = ResourceCollection::new(&items);
70        assert_eq!(rc.data.len(), 2);
71    }
72
73    #[test]
74    fn test_resource_collection_resolve_returns_array() {
75        let items = vec![DummyResource { value: 10 }, DummyResource { value: 20 }];
76        let rc = ResourceCollection::new(&items);
77        let v = rc.resolve();
78        assert!(v.is_array());
79        let arr = v.as_array().unwrap();
80        assert_eq!(arr.len(), 2);
81        assert_eq!(arr[0]["value"], 10);
82        assert_eq!(arr[1]["value"], 20);
83    }
84
85    #[test]
86    fn test_resource_collection_empty() {
87        let items: Vec<DummyResource> = vec![];
88        let rc = ResourceCollection::new(&items);
89        let v = rc.resolve();
90        assert_eq!(v.as_array().unwrap().len(), 0);
91    }
92}