django_query/persian_rug/
row.rs

1use 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
68// pub struct ProxySerializerWithContext<A> {
69//     access: A
70// }
71
72// impl<'s, T, A> Serializer<'s, persian_rug::Proxy<T>> for ProxySerializerWithContext<A>
73// where
74//     T: IntoRowWithContext<'s, A>,
75//     A: 's + Clone
76// {
77//     fn accept_cell_visitor<V: CellVisitor>(&self, value: &persian_rug::Proxy<T>, visitor: &mut V) {
78//         T::get_serializer(self.access.clone()).accept_cell_visitor(self.access.get(value), visitor);
79//     }
80
81//     fn accept_column_visitor<V: ColumnVisitor>(&self, visitor: &mut V) {
82//         T::get_serializer(self.access.clone()).accept_column_visitor(visitor);
83//     }
84// }
85
86pub use django_query_derive::IntoRowWithPersianRug;