1pub mod from_row;
33pub mod keyed;
34
35pub mod tree_identity;
36pub mod tree_index;
37pub mod tree_insert;
38pub mod tree_merge;
39pub mod tree_predicate;
40pub mod tree_update;
41
42use crate::error::ToqlError;
43use crate::keyed::Keyed;
44
45use std::boxed::Box;
46
47#[derive(Debug, PartialEq, Eq)]
49#[cfg_attr(
50 feature = "serde_feature",
51 derive(serde::Serialize, serde::Deserialize)
52)]
53#[cfg_attr(feature = "serde_feature", serde(untagged))]
54pub enum Join<E: Keyed> {
55 Entity(Box<E>),
58 Key(E::Key),
60}
61
62impl<E> Default for Join<E>
63where
64 E: Default + Keyed,
65{
66 fn default() -> Self {
67 Join::Entity(Box::new(E::default()))
68 }
69}
70
71impl<E> Clone for Join<E>
86where
87 E: Clone + Keyed,
88 <E as Keyed>::Key: Clone,
89{
90 fn clone(&self) -> Self {
91 match self {
92 Join::Key(k) => Join::Key(k.clone()),
93 Join::Entity(e) => Join::Entity(e.clone()),
94 }
95 }
96}
97
98impl<T> Join<T>
99where
100 T: Keyed,
101{
102 pub fn with_entity(entity: T) -> Self {
104 Join::Entity(Box::new(entity))
105 }
106
107 pub fn with_key(key: impl Into<<T as Keyed>::Key>) -> Self {
109 Join::Key(key.into())
110 }
111
112 pub fn entity(&self) -> Option<&T> {
114 match self {
115 Join::Key(_) => None,
116 Join::Entity(e) => Some(&e),
117 }
118 }
119
120 pub fn entity_mut(&mut self) -> Option<&mut T> {
122 match self {
123 Join::Key(_) => None,
124 Join::Entity(e) => Some(e.as_mut()),
125 }
126 }
127
128 pub fn entity_or_err<E>(&self, err: E) -> std::result::Result<&T, E> {
130 match self {
131 Join::Key(_) => Err(err),
132 Join::Entity(e) => Ok(&e),
133 }
134 }
135 pub fn entity_mut_or_err<E>(&mut self, err: E) -> std::result::Result<&mut T, E> {
137 match self {
138 Join::Key(_) => Err(err),
139 Join::Entity(e) => Ok(e.as_mut()),
140 }
141 }
142
143 pub fn key(&self) -> <T as Keyed>::Key
145 where
146 <T as Keyed>::Key: std::clone::Clone,
147 {
148 match self {
149 Join::Entity(e) => e.key(),
150 Join::Key(k) => k.to_owned(),
151 }
152 }
153
154 pub fn into_entity(self) -> std::result::Result<T, ToqlError> {
156 match self {
157 Join::Key(_) => Err(ToqlError::NotFound),
158 Join::Entity(e) => Ok(*e),
159 }
160 }
161}
162
163#[cfg(test)]
164mod test {
165 use super::Join;
166 use crate::error::ToqlError;
167 use crate::key::Key;
168 use crate::keyed::Keyed;
169 use crate::sql_arg::SqlArg;
170
171 #[test]
172 fn build() {
173 #[derive(Debug, Clone, PartialEq)]
174 struct User {
175 id: u64,
176 name: String,
177 }
178 #[derive(Debug, Clone, Hash, PartialEq, Eq)]
179 struct UserKey {
180 id: u64,
181 }
182
183 impl Keyed for User {
184 type Key = UserKey;
185
186 fn key(&self) -> Self::Key {
187 UserKey { id: self.id }
188 }
189 }
190 impl Key for UserKey {
191 type Entity = User;
192 fn columns() -> Vec<String> {
193 vec!["id".to_string()]
194 }
195 fn default_inverse_columns() -> Vec<String> {
196 vec!["user_id".to_string()]
197 }
198 fn params(&self) -> Vec<SqlArg> {
199 vec![SqlArg::U64(self.id)]
200 }
201 }
202
203 impl Default for User {
204 fn default() -> Self {
205 User {
206 id: 0,
207 name: "new_user".to_string(),
208 }
209 }
210 }
211
212 let mut u = User {
213 id: 1,
214 name: "user1".to_string(),
215 };
216
217 let mut j = Join::with_entity(u.clone());
218 assert_eq!(j.entity(), Some(&u));
219 assert_eq!(j.entity_mut(), Some(&mut u));
220 assert!(j
221 .entity_or_err(ToqlError::NoneError("expected entity".to_string()))
222 .is_ok());
223 assert!(j
224 .entity_mut_or_err(ToqlError::NoneError("expected entity".to_string()))
225 .is_ok());
226 assert_eq!(j.key(), u.key());
227 assert!(j.into_entity().is_ok());
228
229 let j: Join<User> = Join::with_key(u.key());
230 let mut j = j.clone();
231 assert_eq!(j.entity(), None);
232 assert_eq!(j.entity_mut(), None);
233 assert!(j
234 .entity_or_err(ToqlError::NoneError("expected entity".to_string()))
235 .is_err());
236 assert!(j
237 .entity_mut_or_err(ToqlError::NoneError("expected entity".to_string()))
238 .is_err());
239 assert_eq!(j.key(), u.key());
240 assert!(j.into_entity().is_err());
241
242 let j = Join::default();
243 let u = User::default();
244 assert_eq!(j.entity(), Some(&u));
245
246 let j = User::default().key();
248 assert_eq!(UserKey::columns(), vec!["id".to_string()]);
249 assert_eq!(
250 UserKey::default_inverse_columns(),
251 vec!["user_id".to_string()]
252 );
253 assert_eq!(j.params(), vec![SqlArg::U64(0)]);
254 }
255}