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 #[expect(clippy::cast_possible_truncation)]
78 fn try_row(self) -> Result<Option<Row<E>>, ResponseError> {
79 let mut rows = self.rows();
80
81 match rows.len() {
82 0 => Ok(None),
83 1 => Ok(rows.pop()),
84 n => Err(ResponseError::not_unique(E::PATH, n as u32)),
85 }
86 }
87
88 fn row(self) -> Result<Row<E>, ResponseError> {
89 self.try_row()?.ok_or(ResponseError::not_found(E::PATH))
90 }
91
92 fn try_entity(self) -> Result<Option<E>, ResponseError> {
93 Ok(self.try_row()?.map(Row::entity))
94 }
95
96 fn entity(self) -> Result<E, ResponseError> {
97 self.try_entity()?.ok_or(ResponseError::not_found(E::PATH))
98 }
99
100 fn require_id(self) -> Result<Id<E>, ResponseError> {
101 self.row().map(|row| row.id())
102 }
103}