icydb_core/db/query/api/
result_ext.rs1mod private {
8 use crate::{db::EntityResponse, prelude::*};
9
10 pub trait SealedResponseCardinalityExt<E: EntityKind> {}
18
19 impl<E: EntityKind> SealedResponseCardinalityExt<E> for EntityResponse<E> {}
20}
21
22use crate::{
23 db::{EntityResponse, ResponseError, Row},
24 prelude::*,
25 types::Id,
26};
27use private::SealedResponseCardinalityExt;
28
29pub trait ResponseCardinalityExt<E: EntityKind>: SealedResponseCardinalityExt<E> {
38 fn require_one(&self) -> Result<(), ResponseError>;
40
41 fn require_some(&self) -> Result<(), ResponseError>;
43
44 fn try_row(self) -> Result<Option<Row<E>>, ResponseError>;
46
47 fn row(self) -> Result<Row<E>, ResponseError>;
49
50 fn try_entity(self) -> Result<Option<E>, ResponseError>;
52
53 fn entity(self) -> Result<E, ResponseError>;
55
56 fn require_id(self) -> Result<Id<E>, ResponseError>;
58}
59
60impl<E: EntityKind> ResponseCardinalityExt<E> for EntityResponse<E> {
61 fn require_one(&self) -> Result<(), ResponseError> {
62 match self.count() {
63 1 => Ok(()),
64 0 => Err(ResponseError::not_found(E::PATH)),
65 n => Err(ResponseError::not_unique(E::PATH, n)),
66 }
67 }
68
69 fn require_some(&self) -> Result<(), ResponseError> {
70 if self.is_empty() {
71 Err(ResponseError::not_found(E::PATH))
72 } else {
73 Ok(())
74 }
75 }
76
77 fn try_row(self) -> Result<Option<Row<E>>, ResponseError> {
78 let mut rows = self.rows();
79
80 match rows.len() {
81 0 => Ok(None),
82 1 => Ok(rows.pop()),
83 n => Err(ResponseError::not_unique(
84 E::PATH,
85 u32::try_from(n).unwrap_or(u32::MAX),
86 )),
87 }
88 }
89
90 fn row(self) -> Result<Row<E>, ResponseError> {
91 self.try_row()?.ok_or(ResponseError::not_found(E::PATH))
92 }
93
94 fn try_entity(self) -> Result<Option<E>, ResponseError> {
95 Ok(self.try_row()?.map(Row::entity))
96 }
97
98 fn entity(self) -> Result<E, ResponseError> {
99 self.try_entity()?.ok_or(ResponseError::not_found(E::PATH))
100 }
101
102 fn require_id(self) -> Result<Id<E>, ResponseError> {
103 self.row().map(|row| row.id())
104 }
105}