django_query/persian_rug/
row.rs1use crate::row::{AsForeignKeyWithContext, CellReducer, IntoRowWithContext, Serializer};
2use crate::row::{CellValue, CellVisitor, ColumnVisitor};
3
4use persian_rug::{Accessor, Proxy};
5
6#[persian_rug::constraints(context = C, access(T))]
7impl<'a, A, C, T> IntoRowWithContext<'a, A> for Proxy<T>
8where
9 A: Accessor<Context = C> + 'a,
10 T: IntoRowWithContext<'a, A>,
11{
12 type Serializer = ProxySerializer<A>;
13 fn get_serializer(access: A) -> Self::Serializer {
14 ProxySerializer { access }
15 }
16}
17
18pub struct ProxySerializer<A> {
19 access: A,
20}
21
22#[persian_rug::constraints(context = C, access(T))]
23impl<'r, A, C, T> Serializer<'r, Proxy<T>> for ProxySerializer<A>
24where
25 A: Accessor<Context = C> + 'r,
26 T: IntoRowWithContext<'r, A>,
27{
28 fn accept_cell_visitor<V: CellVisitor>(&self, value: &Proxy<T>, visitor: &mut V) {
29 T::get_serializer(self.access.clone()).accept_cell_visitor(self.access.get(value), visitor);
30 }
31
32 fn accept_column_visitor<V: ColumnVisitor>(&self, visitor: &mut V) {
33 T::get_serializer(self.access.clone()).accept_column_visitor(visitor);
34 }
35}
36
37#[persian_rug::constraints(context = C, access(T))]
38impl<'a, 's, A, C, T> AsForeignKeyWithContext<'a, 's, A> for Proxy<T>
39where
40 T: AsForeignKeyWithContext<'a, 's, A>,
41 A: Accessor<Context = C> + 's,
42{
43 type CellReducer = ProxyCellReducer<<T as AsForeignKeyWithContext<'a, 's, A>>::CellReducer, A>;
44 fn get_cell_reducer(access: A, key: &'a str) -> Self::CellReducer {
45 ProxyCellReducer {
46 access: access.clone(),
47 nested: T::get_cell_reducer(access, key),
48 }
49 }
50}
51
52pub struct ProxyCellReducer<F, A> {
53 nested: F,
54 access: A,
55}
56
57#[persian_rug::constraints(context = C, access(T))]
58impl<'a, 'r, A, T, C, F> CellReducer<'a, 'r, Proxy<T>> for ProxyCellReducer<F, A>
59where
60 A: Accessor<Context = C>,
61 F: CellReducer<'a, 'r, T>,
62{
63 fn reduce_to_cell(&self, value: &Proxy<T>) -> CellValue {
64 self.nested.reduce_to_cell(self.access.get(value))
65 }
66}
67
68pub use django_query_derive::IntoRowWithPersianRug;