real_time_sqlx/queries/
display.rs

1//! Display unprepared Sqlite queries for debugging purposes
2
3use std::fmt;
4
5use crate::utils::format_list;
6
7use super::serialize::{
8    Condition, Constraint, ConstraintValue, FinalType, Operator, OrderBy, PaginateOptions,
9    QueryTree,
10};
11
12impl fmt::Display for FinalType {
13    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
14        match self {
15            FinalType::Number(number) => {
16                if number.is_f64() {
17                    write!(f, "{}", number.as_f64().unwrap())
18                } else {
19                    write!(f, "{}", number.as_i64().unwrap())
20                }
21            }
22            FinalType::String(string) => write!(f, "'{string}'"),
23            FinalType::Bool(bool) => write!(f, "{}", if *bool { 1 } else { 0 }),
24            FinalType::Null => write!(f, "NULL"),
25        }
26    }
27}
28
29impl fmt::Display for ConstraintValue {
30    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
31        match self {
32            ConstraintValue::Final(value) => write!(f, "{}", value),
33            ConstraintValue::List(list) => {
34                write!(f, "{}", format_list(&list, ", "))
35            }
36        }
37    }
38}
39
40impl fmt::Display for Operator {
41    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
42        match self {
43            Operator::Equal => write!(f, "="),
44            Operator::LessThan => write!(f, "<"),
45            Operator::GreaterThan => write!(f, ">"),
46            Operator::LessThanOrEqual => write!(f, "<="),
47            Operator::GreaterThanOrEqual => write!(f, ">="),
48            Operator::NotEqual => write!(f, "!="),
49            Operator::In => write!(f, "in"),
50            Operator::Like => write!(f, "like"),
51            Operator::ILike => write!(f, "ilike"),
52        }
53    }
54}
55
56impl fmt::Display for Constraint {
57    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
58        write!(f, "\"{}\" {} {}", self.column, self.operator, self.value)
59    }
60}
61
62impl fmt::Display for Condition {
63    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
64        match self {
65            Condition::Single { constraint } => write!(f, "{}", constraint),
66            Condition::Or { conditions } => {
67                write!(f, "({})", format_list(&conditions, " OR "))
68            }
69            Condition::And { conditions } => {
70                write!(f, "({})", format_list(&conditions, " AND "))
71            }
72        }
73    }
74}
75
76impl fmt::Display for OrderBy {
77    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
78        match self {
79            OrderBy::Asc(column) => write!(f, "ORDER BY {} ASC", column),
80            OrderBy::Desc(column) => write!(f, "ORDER BY {} DESC", column),
81        }
82    }
83}
84
85impl fmt::Display for PaginateOptions {
86    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
87        if let Some(order) = &self.order_by {
88            write!(f, "{} ", order)?;
89        }
90        write!(f, "LIMIT {} ", self.per_page)?;
91
92        if let Some(offset) = self.offset {
93            write!(f, "OFFSET {}", offset)?;
94        }
95
96        Ok(())
97    }
98}
99
100impl fmt::Display for QueryTree {
101    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
102        write!(f, "SELECT * FROM {}", self.table)?;
103
104        if let Some(condition) = &self.condition {
105            write!(f, " WHERE {} ", condition)?;
106        }
107
108        if let Some(paginate) = &self.paginate {
109            write!(f, "{}", paginate)?;
110        }
111        Ok(())
112    }
113}