<div dir="ltr">I was thinking about something like this<div><br></div><div><font face="courier new, monospace">#[sql_table]</font></div><div><font face="courier new, monospace">pub struct TestTable {</font></div><div><font face="courier new, monospace">    pub a: Option<int>,</font></div>
<div><font face="courier new, monospace">    pub b: String</font></div><div><font face="courier new, monospace">}</font></div><div><font face="courier new, monospace"><br></font></div><div><font face="courier new, monospace">let selector = sql!( select a from TestTable );</font></div>
<div><font face="courier new, monospace">let mut iter: SqlRows<Option<int>> = selector.fetch();</font></div><div><font face="courier new, monospace">let result: Vec<Option<int>> = iter.collect();</font></div>
<div><br></div><div>I first intended to convert sql! macro to some <font face="courier new, monospace">Iterator<Option<int>></font>. However, we don't have <font face="courier new, monospace">typeof(TestTable::a)</font> syntax yet, which means it's impossible to get the type of "a" column without creating a dummy instance. So I plan to convert above macro into rough equivalent of below.</div>
<div><br></div><div><br></div><div><font face="courier new, monospace">pub fn new_selector<T>(_f: fn || -> T) -> SqlSelector<T> {</font></div><div><font face="courier new, monospace">    // selector initialization code.</font></div>
<div><font face="courier new, monospace">    // _f should not be executed anywhere</font></div><div><font face="courier new, monospace">} </font></div><div><font face="courier new, monospace"><br></font></div><div><font face="courier new, monospace">let selector = {</font></div>
<div><font face="courier new, monospace">    // This code is unsafe and should not be executed</font></div><div><font face="courier new, monospace">    let not_executed = fn || {</font></div><div><font face="courier new, monospace">        unsafe {</font></div>
<div><font face="courier new, monospace">            let dummy_instance = TestTable::uninitialized();</font></div><div><font face="courier new, monospace">            dummy_instance.a</font></div><div><font face="courier new, monospace">        }</font></div>
<div><font face="courier new, monospace">    };</font></div><div><font face="courier new, monospace"><br></font></div><div><span style="font-family:'courier new',monospace">    // This automatically type-checks to SqlSelector<Option<int>></span></div>
<div><font face="courier new, monospace">    new_selector(not_executed);</font></div><div><font face="courier new, monospace">};</font></div><div><font face="courier new, monospace"><br></font></div><div><div>I'd love to know if there's a better alternative of this hack.</div>
</div></div><div class="gmail_extra"><br><br><div class="gmail_quote">2014-06-05 18:21 GMT+09:00 Huon Wilson <span dir="ltr"><<a href="mailto:dbau.pp@gmail.com" target="_blank">dbau.pp@gmail.com</a>></span>:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
<div class="">On 05/06/14 19:11, <a href="mailto:kimhyunkang@gmail.com" target="_blank">kimhyunkang@gmail.com</a> wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
<br>
I was also planning to add sql!() macro almost exactly same as Chris Morgan suggests. However, you can't directly access type-checking part of rustc in #![phase(syntax)] modules, which means you need some dirty hacks to peroperly type-check such macros.<br>

</blockquote>
<br>
<br></div>
The conventional approach is to expand to something that uses certain traits, meaning any external data has to satisfy those traits for the macro invocation to work. This technique is used by `println!` and `#[deriving]`, for example.<br>

<br>
(I don't know if you regard this as a dirty hack or not.)<span class="HOEnZb"><font color="#888888"><br>
<br>
<br>
Huon</font></span><div class="HOEnZb"><div class="h5"><br>
______________________________<u></u>_________________<br>
Rust-dev mailing list<br>
<a href="mailto:Rust-dev@mozilla.org" target="_blank">Rust-dev@mozilla.org</a><br>
<a href="https://mail.mozilla.org/listinfo/rust-dev" target="_blank">https://mail.mozilla.org/<u></u>listinfo/rust-dev</a><br>
</div></div></blockquote></div><br></div>