motley/http/rest/
mock.rs

1use std::fmt::Display;
2use std::marker::PhantomData;
3
4use anyhow::Result;
5
6use crate::Identifiable;
7
8use super::{
9    ContentTyped, Create, CreateRequest, Delete, DeleteResponse, EntityRequest, EntityResponse,
10    List, ListRequest, ListResponse, Show, Update, UpdateRequest,
11};
12
13pub trait ListMock {}
14
15pub trait ShowMock {}
16
17pub trait CreateMock {}
18
19pub trait UpdateMock {}
20
21pub trait DeleteMock {}
22
23#[derive(Default, Debug)]
24pub struct MockResource<Entity: Identifiable + ContentTyped> {
25    path: String,
26    _entity: PhantomData<Entity>,
27}
28
29impl<Entity: Identifiable + ContentTyped> MockResource<Entity> {
30    pub fn new(path: String) -> Self {
31        Self {
32            path,
33            _entity: PhantomData,
34        }
35    }
36
37    pub fn path(&self) -> String {
38        self.path.to_string()
39    }
40
41    fn id_path(&self) -> String {
42        format!("{}/:id", self.path)
43    }
44}
45
46impl<Entity: Identifiable + ContentTyped + Default> List<Entity> for MockResource<Entity>
47where
48    Entity: ListMock,
49{
50    fn list_path(&self) -> String {
51        self.path.to_string()
52    }
53
54    fn list(&self, _request: ListRequest) -> Result<ListResponse<Entity>> {
55        Ok(ListResponse::default())
56    }
57}
58
59impl<Entity: Identifiable + ContentTyped + Default> Show<Entity> for MockResource<Entity>
60where
61    Entity: ShowMock,
62{
63    fn show_path(&self) -> String {
64        self.id_path()
65    }
66
67    fn show(&self, _request: EntityRequest<Entity>) -> Result<EntityResponse<Entity>> {
68        Ok(EntityResponse::default())
69    }
70}
71
72impl<Entity: Identifiable + ContentTyped + Default> Create<Entity> for MockResource<Entity>
73where
74    Entity: CreateMock,
75{
76    fn create_path(&self) -> String {
77        self.path.to_string()
78    }
79
80    fn create(&self, _request: CreateRequest<Entity>) -> Result<EntityResponse<Entity>> {
81        Ok(EntityResponse::default())
82    }
83}
84
85impl<Entity: Identifiable + ContentTyped + Default> Update<Entity> for MockResource<Entity>
86where
87    Entity: UpdateMock,
88{
89    fn update_path(&self) -> String {
90        self.id_path()
91    }
92
93    fn update(&self, _request: UpdateRequest<Entity>) -> Result<EntityResponse<Entity>> {
94        Ok(EntityResponse::default())
95    }
96}
97
98impl<Entity: Identifiable + ContentTyped> Delete<Entity> for MockResource<Entity>
99where
100    Entity: DeleteMock,
101{
102    fn delete_path(&self) -> String {
103        self.id_path()
104    }
105
106    fn delete(&self, _request: EntityRequest<Entity>) -> Result<DeleteResponse> {
107        Ok(DeleteResponse::default())
108    }
109}
110
111impl<Entity: Identifiable + ContentTyped> Display for MockResource<Entity> {
112    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
113        write!(
114            f,
115            "MockResource<{}> {{ path: {:?} }}",
116            std::any::type_name::<Entity>(),
117            self.path,
118        )
119    }
120}