1#![doc = r#"
11Macro-powered lenses for immutable Rust data structures.
12
13## Example
14
15```rust
16use lens::{Lens, RefLens, Lenses, lens};
17
18#[derive(Clone, Lenses)]
19struct Address {
20 street: String,
21}
22
23#[derive(Clone, Lenses)]
24struct Person {
25 address: Address,
26}
27
28let person = Person {
29 address: Address {
30 street: "123 Needmore Rd".to_string(),
31 },
32};
33
34let street_lens = lens!(Person.address.street);
35assert_eq!(street_lens.get_ref(&person), "123 Needmore Rd");
36
37let updated = street_lens.set(person, "666 Titus Ave".to_string());
38assert_eq!(street_lens.get_ref(&updated), "666 Titus Ave");
39```
40
41Vector indexing is supported as well:
42
43```rust
44use lens::{Lens, RefLens, Lenses, lens};
45
46#[derive(Clone, Lenses)]
47struct Item {
48 value: u32,
49}
50
51#[derive(Clone, Lenses)]
52struct Container {
53 items: Vec<Item>,
54}
55
56let container = Container {
57 items: vec![Item { value: 1 }, Item { value: 2 }],
58};
59
60let item_lens = lens!(Container.items[1].value);
61assert_eq!(*item_lens.get_ref(&container), 2);
62let updated = item_lens.set(container, 7);
63assert_eq!(updated.items[1].value, 7);
64```
65"#]
66
67extern crate self as lens;
68
69mod core;
70mod path;
71
72pub use lens_derive::*;
73
74#[macro_use]
75mod macros;
76
77pub use lens_macros::lens;
78
79pub use core::*;
80pub use path::*;