Skip to main content

lens/
lib.rs

1//
2// Copyright (c) 2015-2019 Plausible Labs Cooperative, Inc.
3// All rights reserved.
4//
5//
6// Copyright (c) 2025 Julius Foitzik on derivative work
7// All rights reserved.
8//
9
10#![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::*;