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
//! Derive macros for libtmux filter expressions.
//!
//! Start from the [`libtmux` documentation][libtmux]: this crate is the
//! implementation of its `derive` feature, and a caller does not depend on it
//! directly.
//!
//! [libtmux]: https://docs.rs/libtmux
use TokenStream;
use ;
use expand_filterable;
/// Derive a stable typed filter schema for a named struct.
///
/// The required `target` is the stable name embedded in portable expressions.
/// Every supported field produces one member of the generated `<Type>Fields`
/// companion. Bring `renamed_libtmux::query::Filterable` into scope to call
/// `filter_fields`.
///
/// Enable the core crate's `derive` feature and use its root `Filterable`
/// re-export. A deliberate direct dependency on `libtmux-macros` must exactly
/// match the `libtmux` version because the expansion uses a hidden core ABI.
///
/// # Examples
///
/// ```
/// use renamed_libtmux::Filterable;
/// use renamed_libtmux::query::{Filterable as _, QueryIteratorExt as _};
///
/// #[derive(Filterable)]
/// #[filterable(target = "task")]
/// struct Task {
/// name: String,
/// done: bool,
/// }
///
/// let values = vec![
/// Task { name: "build".into(), done: false },
/// Task { name: "test".into(), done: true },
/// ];
/// let fields = Task::filter_fields();
/// let expression = fields.name.contains("ui").and(fields.done.eq(false));
/// let selected = values.iter().matching(&expression).collect::<Vec<_>>();
/// assert_eq!(selected.len(), 1);
/// ```