Skip to content

Commit fe382a4

Browse files
authored
handle_double_colons (#63)
1 parent aa5b145 commit fe382a4

File tree

3 files changed

+42
-2
lines changed

3 files changed

+42
-2
lines changed

src/formatter.rs

+7
Original file line numberDiff line numberDiff line change
@@ -80,6 +80,9 @@ pub(crate) fn format(
8080
TokenKind::Placeholder => {
8181
formatter.format_placeholder(token, &mut formatted_query);
8282
}
83+
TokenKind::DoubleColon => {
84+
formatter.format_double_colon(token, &mut formatted_query);
85+
}
8386
_ => match token.value {
8487
"," => {
8588
formatter.format_comma(token, &mut formatted_query);
@@ -150,6 +153,10 @@ impl<'a> Formatter<'a> {
150153
self.add_new_line(query);
151154
}
152155

156+
fn format_double_colon(&self, _token: &Token<'_>, query: &mut String) {
157+
self.trim_all_spaces_end(query);
158+
query.push_str("::");
159+
}
153160
fn format_block_comment(&self, token: &Token<'_>, query: &mut String) {
154161
self.add_new_line(query);
155162
query.push_str(&self.indent_comment(token.value));

src/lib.rs

+21-1
Original file line numberDiff line numberDiff line change
@@ -669,7 +669,7 @@ mod tests {
669669
#[test]
670670
fn it_formats_postgres_specific_operators() {
671671
let strings = [
672-
("column::int", "column :: int"),
672+
("column::int", "column::int"),
673673
("v->2", "v -> 2"),
674674
("v->>2", "v ->> 2"),
675675
("foo ~~ 'hello'", "foo ~~ 'hello'"),
@@ -1840,6 +1840,26 @@ SELECT
18401840
left ~= right"
18411841
);
18421842

1843+
assert_eq!(format(input, &QueryParams::None, &options), expected);
1844+
}
1845+
#[test]
1846+
fn it_formats_double_colons() {
1847+
let input = "select text :: text, num::integer, data::json, (x - y)::integer frOM foo";
1848+
let options = FormatOptions {
1849+
uppercase: Some(false),
1850+
..FormatOptions::default()
1851+
};
1852+
let expected = indoc!(
1853+
"
1854+
select
1855+
text::text,
1856+
num::integer,
1857+
data::json,
1858+
(x - y)::integer
1859+
from
1860+
foo"
1861+
);
1862+
18431863
assert_eq!(format(input, &QueryParams::None, &options), expected);
18441864
}
18451865
}

src/tokenizer.rs

+14-1
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,7 @@ pub(crate) struct Token<'a> {
4646

4747
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
4848
pub(crate) enum TokenKind {
49+
DoubleColon,
4950
Whitespace,
5051
String,
5152
Reserved,
@@ -107,12 +108,24 @@ fn get_next_token<'a>(
107108
last_reserved_top_level_token,
108109
)
109110
})
111+
.or_else(|_| get_double_colon_token(input))
110112
.or_else(|_| get_operator_token(input))
111113
.or_else(|_| get_placeholder_token(input, named_placeholders))
112114
.or_else(|_| get_word_token(input))
113115
.or_else(|_| get_any_other_char(input))
114116
}
115-
117+
fn get_double_colon_token(input: &str) -> IResult<&str, Token<'_>> {
118+
tag("::")(input).map(|(input, token)| {
119+
(
120+
input,
121+
Token {
122+
kind: TokenKind::DoubleColon,
123+
value: token,
124+
key: None,
125+
},
126+
)
127+
})
128+
}
116129
fn get_whitespace_token(input: &str) -> IResult<&str, Token<'_>> {
117130
take_while1(char::is_whitespace)(input).map(|(input, token)| {
118131
(

0 commit comments

Comments
 (0)