reactive_graph/
into_reactive_value.rs

1#[doc(hidden)]
2pub struct __IntoReactiveValueMarkerBaseCase;
3
4/// A helper trait that works like `Into<T>` but uses a marker generic
5/// to allow more `From` implementations than would be allowed with just `Into<T>`.
6pub trait IntoReactiveValue<T, M> {
7    /// Converts `self` into a `T`.
8    fn into_reactive_value(self) -> T;
9}
10
11// The base case, which allows anything which implements .into() to work:
12impl<T, I> IntoReactiveValue<T, __IntoReactiveValueMarkerBaseCase> for I
13where
14    I: Into<T>,
15{
16    fn into_reactive_value(self) -> T {
17        self.into()
18    }
19}
20
21#[cfg(test)]
22mod tests {
23
24    use crate::{
25        into_reactive_value::IntoReactiveValue,
26        owner::{LocalStorage, Owner},
27        traits::GetUntracked,
28        wrappers::read::Signal,
29    };
30    use typed_builder::TypedBuilder;
31
32    #[test]
33    fn test_into_signal_compiles() {
34        let owner = Owner::new();
35        owner.set();
36
37        #[cfg(not(feature = "nightly"))]
38        let _: Signal<usize> = (|| 2).into_reactive_value();
39        let _: Signal<usize, LocalStorage> = 2.into_reactive_value();
40        #[cfg(not(feature = "nightly"))]
41        let _: Signal<usize, LocalStorage> = (|| 2).into_reactive_value();
42        let _: Signal<String> = "str".into_reactive_value();
43        let _: Signal<String, LocalStorage> = "str".into_reactive_value();
44
45        #[derive(TypedBuilder)]
46        struct Foo {
47            #[builder(setter(
48                fn transform<M>(value: impl IntoReactiveValue<Signal<usize>, M>) {
49                    value.into_reactive_value()
50                }
51            ))]
52            sig: Signal<usize>,
53        }
54
55        assert_eq!(Foo::builder().sig(2).build().sig.get_untracked(), 2);
56        #[cfg(not(feature = "nightly"))]
57        assert_eq!(Foo::builder().sig(|| 2).build().sig.get_untracked(), 2);
58        assert_eq!(
59            Foo::builder()
60                .sig(Signal::stored(2))
61                .build()
62                .sig
63                .get_untracked(),
64            2
65        );
66    }
67}