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}