| 109 | } |
| 110 | |
| 111 | fn placeholder_literal_token(placeholder: &str, params: &[ParamValue]) -> Option<Token> { |
| 112 | let idx_str = placeholder.strip_prefix('$')?; |
| 113 | let idx: usize = idx_str.parse().ok()?; |
| 114 | let param = params.get(idx.checked_sub(1)?)?; |
| 115 | Some(match param { |
| 116 | ParamValue::Null => Token::make_keyword("NULL"), |
| 117 | ParamValue::Bool(true) => Token::make_keyword("TRUE"), |
| 118 | ParamValue::Bool(false) => Token::make_keyword("FALSE"), |
| 119 | ParamValue::Int64(n) => Token::Number(n.to_string(), false), |
| 120 | ParamValue::Float64(f) => Token::Number(f.to_string(), false), |
| 121 | ParamValue::Decimal(d) => Token::Number(d.to_string(), false), |
| 122 | ParamValue::Text(s) => Token::SingleQuotedString(s.clone()), |
| 123 | ParamValue::Timestamp(dt) | ParamValue::Timestamptz(dt) => { |
| 124 | Token::SingleQuotedString(dt.to_iso8601()) |
| 125 | } |
| 126 | }) |
| 127 | } |
| 128 | |
| 129 | #[cfg(test)] |
| 130 | mod tests { |