rsfbclient_diesel/fb/
value.rs1use super::backend::Fb;
4use diesel::backend::RawValue;
5use diesel::row::{Field, FieldRet, PartialRow, Row as DsRow, RowGatWorkaround, RowIndex};
6use rsfbclient::Column;
7use rsfbclient::Row as RsRow;
8use std::ops::Range;
9
10pub struct FbValue<'a> {
11 pub raw: &'a Column,
12}
13
14pub struct FbField<'a> {
15 raw: &'a Column,
16}
17
18impl<'a> Field<'a, Fb> for FbField<'a> {
19 fn field_name(&self) -> Option<&'a str> {
20 Some(self.raw.name.as_str())
21 }
22
23 fn value(&self) -> Option<RawValue<'a, Fb>> {
24 if self.raw.value.is_null() {
25 return None;
26 }
27
28 Some(FbValue { raw: self.raw })
29 }
30}
31
32pub struct FbRow {
33 raw: RsRow,
34}
35
36impl FbRow {
37 pub fn new(row: RsRow) -> Self {
38 Self { raw: row }
39 }
40}
41
42impl<'b> RowGatWorkaround<'b, Fb> for FbRow {
43 type Field = FbField<'b>;
44}
45
46impl<'a> DsRow<'a, Fb> for FbRow {
47 type InnerPartialRow = Self;
48
49 fn get<'b, I>(&'b self, idx: I) -> Option<FieldRet<'b, Self, Fb>>
50 where
51 'a: 'b,
52 Self: RowIndex<I>,
53 {
54 let idx = self.idx(idx)?;
55 if let Some(col) = self.raw.cols.get(idx) {
56 return Some(Self::Field { raw: col });
57 }
58
59 None
60 }
61
62 fn field_count(&self) -> usize {
63 self.raw.cols.len()
64 }
65
66 fn partial_row(&self, range: Range<usize>) -> PartialRow<Self::InnerPartialRow> {
67 PartialRow::new(self, range)
68 }
69}
70
71impl RowIndex<usize> for FbRow {
72 fn idx(&self, idx: usize) -> Option<usize> {
73 if idx < self.raw.cols.len() {
74 Some(idx)
75 } else {
76 None
77 }
78 }
79}
80
81impl<'a> RowIndex<&'a str> for FbRow {
82 fn idx(&self, field_name: &'a str) -> Option<usize> {
83 self.raw
84 .cols
85 .iter()
86 .position(|col| col.name.to_lowercase() == field_name.to_lowercase())
87 }
88}