Skip to content
This repository was archived by the owner on Oct 10, 2019. It is now read-only.

Commit edeff98

Browse files
committed
Start on switch to quote
1 parent ef2c9a8 commit edeff98

File tree

4 files changed

+55
-58
lines changed

4 files changed

+55
-58
lines changed
Lines changed: 49 additions & 54 deletions
Original file line numberDiff line numberDiff line change
@@ -1,74 +1,69 @@
1-
use std::fmt::Write;
2-
use quote::{Tokens, ToTokens};
1+
use std::iter;
2+
use syn::Ident;
3+
use quote::Tokens;
34

45
use enums::Variant;
56
use composites::Field;
67

7-
pub fn enum_body(name: &str, variants: &[Variant]) -> String {
8-
let mut body = String::new();
8+
pub fn enum_body(name: &str, variants: &[Variant]) -> Tokens {
9+
let num_variants = variants.len();
10+
let variant_names = variants.iter().map(|v| &v.name);
911

10-
write!(body, "
11-
if type_.name() != \"{}\" {{
12+
quote! {
13+
if type_.name() != #name {
1214
return false;
13-
}}
15+
}
1416

15-
match *type_.kind() {{
16-
::postgres::types::Kind::Enum(ref variants) => {{
17-
if variants.len() != {} {{
17+
match *type_.kind() {
18+
::postgres::types::Kind::Enum(ref variants) => {
19+
if variants.len() != #num_variants {
1820
return false;
19-
}}
21+
}
2022

21-
variants.iter().all(|v| {{
22-
match &**v {{", name, variants.len()).unwrap();
23-
24-
for variant in variants {
25-
write!(body, "
26-
\"{}\" => true,", variant.name).unwrap();
27-
}
28-
29-
write!(body, "
23+
variants.iter().all(|v| {
24+
match &**v {
25+
#(
26+
#variant_names => true,
27+
)*
3028
_ => false,
31-
}}
32-
}})
33-
}}
29+
}
30+
})
31+
}
3432
_ => false,
35-
}}").unwrap();
36-
37-
body
33+
}
34+
}
3835
}
3936

40-
pub fn composite_body(name: &str, trait_: &str, fields: &[Field]) -> String {
41-
let mut body = String::new();
37+
pub fn composite_body(name: &str, trait_: &str, fields: &[Field]) -> Tokens {
38+
let num_fields = fields.len();
39+
let trait_ = Ident::new(trait_);
40+
let traits = iter::repeat(&trait_);
41+
let field_names = fields.iter().map(|f| &f.name);
42+
let field_types = fields.iter().map(|f| &f.type_);
4243

43-
write!(body, "
44-
if type_.name() != \"{}\" {{
44+
quote! {
45+
if type_.name() != #name {
4546
return false;
46-
}}
47+
}
4748

48-
match *type_.kind() {{
49-
::postgres::types::Kind::Composite(ref fields) => {{
50-
if fields.len() != {} {{
49+
match *type_.kind() {
50+
::postgres::types::Kind::Composite(ref fields) => {
51+
if fields.len() != #num_fields {
5152
return false;
52-
}}
53+
}
5354

54-
fields.iter().all(|f| {{
55-
match f.name() {{", name, fields.len()).unwrap();
56-
57-
for field in fields {
58-
let mut tokens = Tokens::new();
59-
field.type_.to_tokens(&mut tokens);
60-
write!(body, "
61-
\"{}\" => <{} as ::postgres::types::{}>::accepts(f.type_()),",
62-
field.name, tokens, trait_).unwrap();
55+
fields.iter().all(|f| {
56+
match f.name() {
57+
#(
58+
#field_names => {
59+
<#field_types as ::postgres::types::#traits>::accepts(f.type_())
60+
}
61+
)*
62+
_ => false,
63+
}
64+
})
65+
}
66+
_ => false,
67+
}
6368
}
64-
65-
write!(body, "\
66-
_ => false,\
67-
}}\
68-
}})\
69-
}}\
70-
_ => false,\
71-
}}").unwrap();
72-
73-
body
7469
}

postgres-derive-internals/src/fromsql.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,15 +15,15 @@ pub fn expand_derive_fromsql(input: &MacroInput) -> Result<String, String> {
1515
let (accepts_body, to_sql_body) = match input.body {
1616
Body::Enum(ref variants) => {
1717
let variants: Vec<Variant> = try!(variants.iter().map(Variant::parse).collect());
18-
(accepts::enum_body(&name, &variants), enum_body(&input.ident, &variants))
18+
(accepts::enum_body(&name, &variants).to_string(), enum_body(&input.ident, &variants))
1919
}
2020
Body::Struct(VariantData::Tuple(ref fields)) if fields.len() == 1 => {
2121
let field = &fields[0];
2222
(domain_accepts_body(field), domain_body(&input.ident, field))
2323
}
2424
Body::Struct(VariantData::Struct(ref fields)) => {
2525
let fields: Vec<Field> = try!(fields.iter().map(Field::parse).collect());
26-
(accepts::composite_body(&name, "FromSql", &fields),
26+
(accepts::composite_body(&name, "FromSql", &fields).to_string(),
2727
composite_body(&input.ident, &fields))
2828
}
2929
_ => {

postgres-derive-internals/src/lib.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
1+
#![recursion_limit = "128"]
12
extern crate syn;
3+
#[macro_use]
24
extern crate quote;
35

46
use syn::{MacroInput, MetaItem, Body, VariantData};

postgres-derive-internals/src/tosql.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,15 +15,15 @@ pub fn expand_derive_tosql(input: &MacroInput) -> Result<String, String> {
1515
let (accepts_body, to_sql_body) = match input.body {
1616
Body::Enum(ref variants) => {
1717
let variants: Vec<Variant> = try!(variants.iter().map(Variant::parse).collect());
18-
(accepts::enum_body(&name, &variants), enum_body(&input.ident, &variants))
18+
(accepts::enum_body(&name, &variants).to_string(), enum_body(&input.ident, &variants))
1919
}
2020
Body::Struct(VariantData::Tuple(ref fields)) if fields.len() == 1 => {
2121
let field = &fields[0];
2222
(domain_accepts_body(&name, &field), domain_body())
2323
}
2424
Body::Struct(VariantData::Struct(ref fields)) => {
2525
let fields: Vec<Field> = try!(fields.iter().map(Field::parse).collect());
26-
(accepts::composite_body(&name, "ToSql", &fields),
26+
(accepts::composite_body(&name, "ToSql", &fields).to_string(),
2727
composite_body(&fields))
2828
}
2929
_ => {

0 commit comments

Comments
 (0)