linq/
lib.rs

1//! Linq query in Rust.
2
3pub mod iter;
4
5/// Create linq query
6///
7/// Use `,` to split each sub-statement.
8///
9/// See readme for more usage.
10///
11/// # Examples
12///
13/// ```
14/// use linq::linq;
15/// use linq::iter::Enumerable;
16///
17/// let x = 1..100;
18///
19/// let y: Vec<i32> = x
20///     .clone()
21///     .where_by(|p| p <= &5)
22///     .order_by(|p| -p)
23///     .select(|p| p * 2)
24///     .collect();
25///
26/// let e: Vec<i32> =
27///     linq!(from p in x.clone(), where p <= &5, orderby -p, select p * 2).collect();
28/// assert_eq!(e, y);
29/// ```
30#[macro_export]
31macro_rules! linq {
32    (from $v:ident in $c:expr, select $ms:expr) =>
33    {
34        $c.select(|$v| $ms)
35    };
36    (from $v:ident in $c:expr, $(where $mw:expr,)+ select $ms:expr) =>
37    {
38        $c.where_by(|$v| true $(&& $mw)+ ).select(|$v| $ms)
39    };
40    (from $v:ident in $c:expr, orderby $mo:expr, select $ms:expr) =>
41    {
42        $c.order_by(|$v| $mo).select(|$v| $ms)
43    };
44    (from $v:ident in $c:expr, orderby $mo:expr, descending, select $ms:expr) =>
45    {
46        $c.order_by_descending(|$v| $mo).select(|$v| $ms)
47    };
48    (from $v:ident in $c:expr, $(where $mw:expr,)+ orderby $mo:expr, select $ms:expr) =>
49    {
50        $c.where_by(|$v| true $(&& $mw)+ ).order_by(|$v| $mo).select(|$v| $ms)
51    };
52    (from $v:ident in $c:expr, $(where $mw:expr,)+ orderby $mo:expr, descending, select $ms:expr) =>
53    {
54        $c.where_by(|$v| true $(&& $mw)+ ).order_by_descending(|$v| $mo).select(|$v| $ms)
55    };
56    (from $v0:ident in $c0:expr, from $v:ident in $c:expr, select $ms:expr) =>
57    {
58        $c0.select_many_single(|$v0| $c).select(|$v| $ms)
59    };
60    (from $v0:ident in $c0:expr, zfrom $v:ident in $c:expr, select $ms:expr) =>
61    {
62        $c0.select_many(|$v0| $c, |$v0, $v| $ms)
63    };
64}
65
66#[cfg(test)]
67mod tests;