pub trait Expressive<T> {
// Required method
fn expr(&self) -> Expression<T>;
// Provided method
fn preview(&self) -> String
where T: Debug + Display { ... }
}Expand description
Trait for creating custom SQL constructs that can be converted to expressions.
The Expressive trait allows you to define reusable SQL patterns and complex
query constructs that can be seamlessly integrated into larger expressions.
This is particularly useful for creating database-specific syntax, common
query patterns, or complex operations like identifiers with automatic escaping.
§Example
Create a wrapper for table/field names which will escape only if we use a reserved keyword.
use vantage_expressions::{Expression, expr};
use vantage_expressions::traits::expressive::Expressive;
#[derive(Debug, Clone)]
pub struct Identifier {
identifier: String,
}
impl Identifier {
pub fn new(identifier: impl Into<String>) -> Self {
Self { identifier: identifier.into() }
}
fn needs_escaping(&self) -> bool {
let reserved_keywords = ["SELECT", "FROM", "TO", "IN"];
let upper = self.identifier.to_uppercase();
self.identifier.contains(' ') || reserved_keywords.contains(&upper.as_str())
}
}
impl Expressive<serde_json::Value> for Identifier {
fn expr(&self) -> Expression<serde_json::Value> {
if self.needs_escaping() {
expr!(format!("`{}`", self.identifier))
} else {
expr!(self.identifier.clone())
}
}
}
// Usage - Expressive types work automatically in expr! macro
let field = Identifier::new("user_name");
let escaped = Identifier::new("SELECT"); // Reserved keyword
// Direct usage in expr! macro - no .expr() calls needed
let query = expr!(
"SELECT {}, {}, {} FROM {}",
(Identifier::new("from")),
(Identifier::new("to")),
(Identifier::new("subject")),
(Identifier::new("emails"))
);
// Result: SELECT `from`, `to`, subject FROM emailsRequired Methods§
Sourcefn expr(&self) -> Expression<T>
fn expr(&self) -> Expression<T>
Convert this construct into an Expression<T>.
This method should return an Expression that represents the SQL
or query language construct. The expression can contain nested
expressions, parameters, or deferred computations.
Types implementing this trait can be used directly in the expr! macro
with parentheses syntax: (identifier) - the conversion happens automatically.
Provided Methods§
Implementations on Foreign Types§
Source§impl Expressive<bool> for bool
impl Expressive<bool> for bool
fn expr(&self) -> Expression<bool>
Source§impl Expressive<f32> for f32
impl Expressive<f32> for f32
fn expr(&self) -> Expression<f32>
Source§impl Expressive<f64> for f64
impl Expressive<f64> for f64
fn expr(&self) -> Expression<f64>
Source§impl Expressive<i8> for i8
impl Expressive<i8> for i8
fn expr(&self) -> Expression<i8>
Source§impl Expressive<i16> for i16
impl Expressive<i16> for i16
fn expr(&self) -> Expression<i16>
Source§impl Expressive<i32> for i32
impl Expressive<i32> for i32
fn expr(&self) -> Expression<i32>
Source§impl Expressive<i64> for i64
impl Expressive<i64> for i64
fn expr(&self) -> Expression<i64>
Source§impl Expressive<u8> for u8
impl Expressive<u8> for u8
fn expr(&self) -> Expression<u8>
Source§impl Expressive<u16> for u16
impl Expressive<u16> for u16
fn expr(&self) -> Expression<u16>
Source§impl Expressive<u32> for u32
impl Expressive<u32> for u32
fn expr(&self) -> Expression<u32>
Source§impl Expressive<AnySqliteType> for &str
impl Expressive<AnySqliteType> for &str
fn expr(&self) -> Expression<AnySqliteType>
Source§impl Expressive<AnySqliteType> for bool
impl Expressive<AnySqliteType> for bool
fn expr(&self) -> Expression<AnySqliteType>
Source§impl Expressive<AnySqliteType> for f32
impl Expressive<AnySqliteType> for f32
fn expr(&self) -> Expression<AnySqliteType>
Source§impl Expressive<AnySqliteType> for f64
impl Expressive<AnySqliteType> for f64
fn expr(&self) -> Expression<AnySqliteType>
Source§impl Expressive<AnySqliteType> for i8
impl Expressive<AnySqliteType> for i8
fn expr(&self) -> Expression<AnySqliteType>
Source§impl Expressive<AnySqliteType> for i16
impl Expressive<AnySqliteType> for i16
fn expr(&self) -> Expression<AnySqliteType>
Source§impl Expressive<AnySqliteType> for i32
impl Expressive<AnySqliteType> for i32
fn expr(&self) -> Expression<AnySqliteType>
Source§impl Expressive<AnySqliteType> for i64
impl Expressive<AnySqliteType> for i64
fn expr(&self) -> Expression<AnySqliteType>
Source§impl Expressive<AnySqliteType> for u8
impl Expressive<AnySqliteType> for u8
fn expr(&self) -> Expression<AnySqliteType>
Source§impl Expressive<AnySqliteType> for u16
impl Expressive<AnySqliteType> for u16
fn expr(&self) -> Expression<AnySqliteType>
Source§impl Expressive<AnySqliteType> for u32
impl Expressive<AnySqliteType> for u32
fn expr(&self) -> Expression<AnySqliteType>
Source§impl Expressive<AnySqliteType> for String
impl Expressive<AnySqliteType> for String
fn expr(&self) -> Expression<AnySqliteType>
Source§impl Expressive<AnySqliteType> for DateTime<Utc>
impl Expressive<AnySqliteType> for DateTime<Utc>
fn expr(&self) -> Expression<AnySqliteType>
Source§impl Expressive<AnySqliteType> for NaiveDate
impl Expressive<AnySqliteType> for NaiveDate
fn expr(&self) -> Expression<AnySqliteType>
Source§impl Expressive<AnySqliteType> for NaiveDateTime
impl Expressive<AnySqliteType> for NaiveDateTime
fn expr(&self) -> Expression<AnySqliteType>
Source§impl Expressive<AnySqliteType> for NaiveTime
impl Expressive<AnySqliteType> for NaiveTime
fn expr(&self) -> Expression<AnySqliteType>
Source§impl Expressive<AnySqliteType> for Decimal
impl Expressive<AnySqliteType> for Decimal
fn expr(&self) -> Expression<AnySqliteType>
Source§impl<T> Expressive<T> for MockColumn<T>where
T: ColumnType,
impl<T> Expressive<T> for MockColumn<T>where
T: ColumnType,
fn expr(&self) -> Expression<T>
Implementors§
impl Expressive<Value> for MockSelect
impl Expressive<AnySqliteType> for SqliteCondition
Condition chaining: the condition type wraps Expression<AnyType>,
so implementing Expressive<AnyType> gives it the operation trait
via the blanket above.
impl Expressive<AnySqliteType> for Concat<AnySqliteType>
sqlite only.impl Expressive<AnySqliteType> for DateFormat<AnySqliteType>
sqlite only.impl Expressive<AnySqliteType> for Identifier
sqlite only.impl Expressive<AnySqliteType> for Iif<AnySqliteType>
sqlite only.impl Expressive<AnySqliteType> for Interval
sqlite only.impl Expressive<AnySqliteType> for JsonExtract<AnySqliteType>
sqlite only.impl Expressive<AnySqliteType> for Point
sqlite only.impl Expressive<AnySqliteType> for Ternary<AnySqliteType>
sqlite only.