1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
use std::fmt::Debug;
use Result;
struct Buffer(Vec<String>);
pub trait Clause: Debug {
fn compile(&self) -> Result<String>;
}
pub trait Condition: Debug {
fn compile(&self) -> Result<String>;
}
pub trait Definition: Debug {
fn compile(&self) -> Result<String>;
}
pub trait Expression: Debug {
fn compile(&self) -> Result<String>;
}
pub trait Operation: Debug {
fn compile(&self) -> Result<String>;
}
pub trait Statement: Debug {
fn compile(&self) -> Result<String>;
}
impl Buffer {
fn new() -> Buffer {
Buffer(vec![])
}
fn push<T: ToString>(&mut self, chunk: T) -> &mut Self {
self.0.push(chunk.to_string());
self
}
fn join(self, delimiter: &str) -> String {
let mut result = String::new();
for (i, chunk) in self.0.iter().enumerate() {
if i > 0 {
result.push_str(delimiter)
}
result.push_str(chunk);
}
result
}
#[inline]
fn len(&self) -> usize {
self.0.len()
}
}
impl<'l> Expression for &'l str {
#[inline]
fn compile(&self) -> Result<String> {
Ok(self.to_string())
}
}
impl Expression for String {
#[inline]
fn compile(&self) -> Result<String> {
Ok(self.clone())
}
}
impl<T: Operation> Condition for T {
#[inline]
fn compile(&self) -> Result<String> {
Operation::compile(self)
}
}
macro_rules! some(
($option:expr, $name:expr) => (
match $option {
Some(ref value) => value,
_ => raise!(concat!("expected “", stringify!($name), "” to be set")),
}
);
($this:ident.$field:ident) => (
some!($this.$field, $field)
);
);
macro_rules! push(
($collection:expr, $value:expr) => (
match $collection {
Some(ref mut collection) => {
collection.push($value);
},
_ => {
let collection = &mut $collection;
*collection = Some(vec![$value]);
},
}
);
);
pub mod clause;
pub mod definition;
pub mod operation;
pub mod statement;