sqlx_askama_template/
template_arg.rs1use std::{cell::RefCell, ops::Deref};
2
3use sqlx_core::{Error, arguments::Arguments, database::Database, encode::Encode, types::Type};
4pub struct TemplateArg<'q, DB: Database, D> {
11 error: RefCell<Option<Error>>,
13 arguments: RefCell<Option<DB::Arguments>>,
15 encode_placeholder_fn: Option<fn(usize, &mut String)>,
16 data: &'q D,
17}
18
19impl<'q, DB: Database, D> TemplateArg<'q, DB, D> {
20 pub fn new(d: &'q D) -> Self {
25 TemplateArg {
26 error: RefCell::new(None),
27 arguments: RefCell::new(None),
28 encode_placeholder_fn: None,
29 data: d,
30 }
31 }
32 pub fn set_encode_placeholder_fn(&mut self, f: fn(usize, &mut String)) {
37 self.encode_placeholder_fn = Some(f);
38 }
39
40 pub fn e<'t, ImplEncode>(&self, t: ImplEncode) -> String
53 where
54 ImplEncode: Encode<'t, DB> + Type<DB>,
55 {
56 let mut arguments = self.arguments.borrow_mut().take().unwrap_or_default();
57 let mut err = self.error.borrow_mut();
58
59 if let Err(encode_err) = arguments.add(t)
60 && err.is_none()
61 {
62 *err = Some(Error::Encode(encode_err));
63 }
64
65 let mut placeholder = String::new();
66 if let Some(encode_placeholder_fn) = &self.encode_placeholder_fn {
67 encode_placeholder_fn(arguments.len(), &mut placeholder);
68 } else if let Err(e) = arguments.format_placeholder(&mut placeholder) {
69 *err = Some(Error::Encode(Box::new(e)));
70 }
71 *self.arguments.borrow_mut() = Some(arguments);
72 placeholder
73 }
74 pub fn el<'t, ImplEncode>(
87 &self,
88 args: impl ::std::iter::IntoIterator<Item = ImplEncode>,
89 ) -> String
90 where
91 ImplEncode: Encode<'t, DB> + Type<DB>,
92 {
93 let mut placeholder = String::new();
94 placeholder.push('(');
95
96 for arg in args {
97 placeholder.push_str(&self.e(arg));
98
99 placeholder.push(',');
100 }
101
102 if placeholder.ends_with(",") {
103 placeholder.pop();
104 }
105 placeholder.push(')');
106
107 placeholder
108 }
109
110 pub fn get_err(&self) -> Option<Error> {
112 self.error.borrow_mut().take()
113 }
114
115 pub fn get_arguments(&self) -> Option<DB::Arguments> {
117 self.arguments.borrow_mut().take()
118 }
119}
120
121impl<'t, DB: Database, D> Deref for TemplateArg<'t, DB, D> {
122 type Target = &'t D;
123 fn deref(&self) -> &Self::Target {
124 &self.data
125 }
126}