pub trait Observe {
type Observer<'ob, S, D>: Observer<Head = S, InnerDepth = D>
where Self: 'ob,
D: Unsigned,
S: AsDerefMut<D, Target = Self> + ?Sized + 'ob;
type Spec;
}Expand description
A trait for types that can be observed for mutations.
Types implementing Observe can be wrapped in Observers that track mutations. The trait
is typically derived using the #[derive(Observe)] macro and used in observe! macros.
A single type T may have many possible Observer<'ob, Target = T> implementations in
theory, each with different change-tracking strategies. The Observe trait selects one
of these as the default observer to be used by #[derive(Observe)] and other generic code
that needs an observer for T.
When you #[derive(Observe)] on a struct, the macro requires that each field type
implements Observe so it can select an appropriate default observer for that field.
The Observer associated type of each field’s Observe implementation determines which
observer will be instantiated in the generated code.
§Example
use morphix::adapter::Json;
use morphix::{Observe, observe};
use serde::Serialize;
#[derive(Serialize, Observe)]
struct MyStruct {
field: String,
}
let mut data = MyStruct { field: "value".to_string() };
let Json(mutation) = observe!(data => {
data.field.push_str(" modified");
}).unwrap();Required Associated Types§
Sourcetype Observer<'ob, S, D>: Observer<Head = S, InnerDepth = D>
where
Self: 'ob,
D: Unsigned,
S: AsDerefMut<D, Target = Self> + ?Sized + 'ob
type Observer<'ob, S, D>: Observer<Head = S, InnerDepth = D> where Self: 'ob, D: Unsigned, S: AsDerefMut<D, Target = Self> + ?Sized + 'ob
The default observer implementation for this type.
Sourcetype Spec
type Spec
Marker type for selecting specialized observer implementations in wrapper types.
For most types, this will be DefaultSpec. Types can specify SnapshotSpec to enable
snapshot-based observation strategies. For example, Option<T> uses
OptionObserver when T::Spec = DefaultSpec, but
SnapshotObserver when T::Spec = SnapshotSpec.
Dyn Compatibility§
This trait is not dyn compatible.
In older versions of Rust, dyn compatibility was called "object safety", so this trait is not object safe.
Implementations on Foreign Types§
Source§impl Observe for IpAddr
impl Observe for IpAddr
type Observer<'ob, S, D> = GeneralObserver<'ob, SnapshotHandler<<S as AsDeref<D>>::Target>, S, D> where Self: 'ob, D: Unsigned, S: AsDerefMut<D, Target = Self> + ?Sized + 'ob
type Spec = SnapshotSpec
Source§impl Observe for SocketAddr
impl Observe for SocketAddr
type Observer<'ob, S, D> = GeneralObserver<'ob, SnapshotHandler<<S as AsDeref<D>>::Target>, S, D> where Self: 'ob, D: Unsigned, S: AsDerefMut<D, Target = Self> + ?Sized + 'ob
type Spec = SnapshotSpec
Source§impl Observe for bool
impl Observe for bool
type Observer<'ob, S, D> = GeneralObserver<'ob, SnapshotHandler<<S as AsDeref<D>>::Target>, S, D> where Self: 'ob, D: Unsigned, S: AsDerefMut<D, Target = Self> + ?Sized + 'ob
type Spec = SnapshotSpec
Source§impl Observe for char
impl Observe for char
type Observer<'ob, S, D> = GeneralObserver<'ob, SnapshotHandler<<S as AsDeref<D>>::Target>, S, D> where Self: 'ob, D: Unsigned, S: AsDerefMut<D, Target = Self> + ?Sized + 'ob
type Spec = SnapshotSpec
Source§impl Observe for f32
impl Observe for f32
type Observer<'ob, S, D> = GeneralObserver<'ob, SnapshotHandler<<S as AsDeref<D>>::Target>, S, D> where Self: 'ob, D: Unsigned, S: AsDerefMut<D, Target = Self> + ?Sized + 'ob
type Spec = SnapshotSpec
Source§impl Observe for f64
impl Observe for f64
type Observer<'ob, S, D> = GeneralObserver<'ob, SnapshotHandler<<S as AsDeref<D>>::Target>, S, D> where Self: 'ob, D: Unsigned, S: AsDerefMut<D, Target = Self> + ?Sized + 'ob
type Spec = SnapshotSpec
Source§impl Observe for i8
impl Observe for i8
type Observer<'ob, S, D> = GeneralObserver<'ob, SnapshotHandler<<S as AsDeref<D>>::Target>, S, D> where Self: 'ob, D: Unsigned, S: AsDerefMut<D, Target = Self> + ?Sized + 'ob
type Spec = SnapshotSpec
Source§impl Observe for i16
impl Observe for i16
type Observer<'ob, S, D> = GeneralObserver<'ob, SnapshotHandler<<S as AsDeref<D>>::Target>, S, D> where Self: 'ob, D: Unsigned, S: AsDerefMut<D, Target = Self> + ?Sized + 'ob
type Spec = SnapshotSpec
Source§impl Observe for i32
impl Observe for i32
type Observer<'ob, S, D> = GeneralObserver<'ob, SnapshotHandler<<S as AsDeref<D>>::Target>, S, D> where Self: 'ob, D: Unsigned, S: AsDerefMut<D, Target = Self> + ?Sized + 'ob
type Spec = SnapshotSpec
Source§impl Observe for i64
impl Observe for i64
type Observer<'ob, S, D> = GeneralObserver<'ob, SnapshotHandler<<S as AsDeref<D>>::Target>, S, D> where Self: 'ob, D: Unsigned, S: AsDerefMut<D, Target = Self> + ?Sized + 'ob
type Spec = SnapshotSpec
Source§impl Observe for i128
impl Observe for i128
type Observer<'ob, S, D> = GeneralObserver<'ob, SnapshotHandler<<S as AsDeref<D>>::Target>, S, D> where Self: 'ob, D: Unsigned, S: AsDerefMut<D, Target = Self> + ?Sized + 'ob
type Spec = SnapshotSpec
Source§impl Observe for isize
impl Observe for isize
type Observer<'ob, S, D> = GeneralObserver<'ob, SnapshotHandler<<S as AsDeref<D>>::Target>, S, D> where Self: 'ob, D: Unsigned, S: AsDerefMut<D, Target = Self> + ?Sized + 'ob
type Spec = SnapshotSpec
Source§impl Observe for str
impl Observe for str
type Observer<'ob, S, D> = StrObserver<'ob, S, D> where Self: 'ob, D: Unsigned, S: AsDerefMut<D, Target = Self> + ?Sized + 'ob
type Spec = DefaultSpec
Source§impl Observe for u8
impl Observe for u8
type Observer<'ob, S, D> = GeneralObserver<'ob, SnapshotHandler<<S as AsDeref<D>>::Target>, S, D> where Self: 'ob, D: Unsigned, S: AsDerefMut<D, Target = Self> + ?Sized + 'ob
type Spec = SnapshotSpec
Source§impl Observe for u16
impl Observe for u16
type Observer<'ob, S, D> = GeneralObserver<'ob, SnapshotHandler<<S as AsDeref<D>>::Target>, S, D> where Self: 'ob, D: Unsigned, S: AsDerefMut<D, Target = Self> + ?Sized + 'ob
type Spec = SnapshotSpec
Source§impl Observe for u32
impl Observe for u32
type Observer<'ob, S, D> = GeneralObserver<'ob, SnapshotHandler<<S as AsDeref<D>>::Target>, S, D> where Self: 'ob, D: Unsigned, S: AsDerefMut<D, Target = Self> + ?Sized + 'ob
type Spec = SnapshotSpec
Source§impl Observe for u64
impl Observe for u64
type Observer<'ob, S, D> = GeneralObserver<'ob, SnapshotHandler<<S as AsDeref<D>>::Target>, S, D> where Self: 'ob, D: Unsigned, S: AsDerefMut<D, Target = Self> + ?Sized + 'ob
type Spec = SnapshotSpec
Source§impl Observe for u128
impl Observe for u128
type Observer<'ob, S, D> = GeneralObserver<'ob, SnapshotHandler<<S as AsDeref<D>>::Target>, S, D> where Self: 'ob, D: Unsigned, S: AsDerefMut<D, Target = Self> + ?Sized + 'ob
type Spec = SnapshotSpec
Source§impl Observe for ()
impl Observe for ()
type Observer<'ob, S, D> = GeneralObserver<'ob, SnapshotHandler<<S as AsDeref<D>>::Target>, S, D> where Self: 'ob, D: Unsigned, S: AsDerefMut<D, Target = Self> + ?Sized + 'ob
type Spec = SnapshotSpec
Source§impl Observe for usize
impl Observe for usize
type Observer<'ob, S, D> = GeneralObserver<'ob, SnapshotHandler<<S as AsDeref<D>>::Target>, S, D> where Self: 'ob, D: Unsigned, S: AsDerefMut<D, Target = Self> + ?Sized + 'ob
type Spec = SnapshotSpec
Source§impl Observe for String
impl Observe for String
type Observer<'ob, S, D> = StringObserver<'ob, S, D> where Self: 'ob, D: Unsigned, S: AsDerefMut<D, Target = Self> + ?Sized + 'ob
type Spec = DefaultSpec
Source§impl Observe for Arguments<'_>
impl Observe for Arguments<'_>
type Observer<'ob, S, D> = GeneralObserver<'ob, PointerHandler<<S as AsDeref<D>>::Target>, S, D> where Self: 'ob, D: Unsigned, S: AsDerefMut<D, Target = Self> + ?Sized + 'ob
type Spec = DefaultSpec
Source§impl Observe for Ipv4Addr
impl Observe for Ipv4Addr
type Observer<'ob, S, D> = GeneralObserver<'ob, SnapshotHandler<<S as AsDeref<D>>::Target>, S, D> where Self: 'ob, D: Unsigned, S: AsDerefMut<D, Target = Self> + ?Sized + 'ob
type Spec = SnapshotSpec
Source§impl Observe for Ipv6Addr
impl Observe for Ipv6Addr
type Observer<'ob, S, D> = GeneralObserver<'ob, SnapshotHandler<<S as AsDeref<D>>::Target>, S, D> where Self: 'ob, D: Unsigned, S: AsDerefMut<D, Target = Self> + ?Sized + 'ob
type Spec = SnapshotSpec
Source§impl Observe for SocketAddrV4
impl Observe for SocketAddrV4
type Observer<'ob, S, D> = GeneralObserver<'ob, SnapshotHandler<<S as AsDeref<D>>::Target>, S, D> where Self: 'ob, D: Unsigned, S: AsDerefMut<D, Target = Self> + ?Sized + 'ob
type Spec = SnapshotSpec
Source§impl Observe for SocketAddrV6
impl Observe for SocketAddrV6
type Observer<'ob, S, D> = GeneralObserver<'ob, SnapshotHandler<<S as AsDeref<D>>::Target>, S, D> where Self: 'ob, D: Unsigned, S: AsDerefMut<D, Target = Self> + ?Sized + 'ob
type Spec = SnapshotSpec
Source§impl Observe for NonZero<i8>
impl Observe for NonZero<i8>
type Observer<'ob, S, D> = GeneralObserver<'ob, SnapshotHandler<<S as AsDeref<D>>::Target>, S, D> where Self: 'ob, D: Unsigned, S: AsDerefMut<D, Target = Self> + ?Sized + 'ob
type Spec = SnapshotSpec
Source§impl Observe for NonZero<i16>
impl Observe for NonZero<i16>
type Observer<'ob, S, D> = GeneralObserver<'ob, SnapshotHandler<<S as AsDeref<D>>::Target>, S, D> where Self: 'ob, D: Unsigned, S: AsDerefMut<D, Target = Self> + ?Sized + 'ob
type Spec = SnapshotSpec
Source§impl Observe for NonZero<i32>
impl Observe for NonZero<i32>
type Observer<'ob, S, D> = GeneralObserver<'ob, SnapshotHandler<<S as AsDeref<D>>::Target>, S, D> where Self: 'ob, D: Unsigned, S: AsDerefMut<D, Target = Self> + ?Sized + 'ob
type Spec = SnapshotSpec
Source§impl Observe for NonZero<i64>
impl Observe for NonZero<i64>
type Observer<'ob, S, D> = GeneralObserver<'ob, SnapshotHandler<<S as AsDeref<D>>::Target>, S, D> where Self: 'ob, D: Unsigned, S: AsDerefMut<D, Target = Self> + ?Sized + 'ob
type Spec = SnapshotSpec
Source§impl Observe for NonZero<i128>
impl Observe for NonZero<i128>
type Observer<'ob, S, D> = GeneralObserver<'ob, SnapshotHandler<<S as AsDeref<D>>::Target>, S, D> where Self: 'ob, D: Unsigned, S: AsDerefMut<D, Target = Self> + ?Sized + 'ob
type Spec = SnapshotSpec
Source§impl Observe for NonZero<isize>
impl Observe for NonZero<isize>
type Observer<'ob, S, D> = GeneralObserver<'ob, SnapshotHandler<<S as AsDeref<D>>::Target>, S, D> where Self: 'ob, D: Unsigned, S: AsDerefMut<D, Target = Self> + ?Sized + 'ob
type Spec = SnapshotSpec
Source§impl Observe for NonZero<u8>
impl Observe for NonZero<u8>
type Observer<'ob, S, D> = GeneralObserver<'ob, SnapshotHandler<<S as AsDeref<D>>::Target>, S, D> where Self: 'ob, D: Unsigned, S: AsDerefMut<D, Target = Self> + ?Sized + 'ob
type Spec = SnapshotSpec
Source§impl Observe for NonZero<u16>
impl Observe for NonZero<u16>
type Observer<'ob, S, D> = GeneralObserver<'ob, SnapshotHandler<<S as AsDeref<D>>::Target>, S, D> where Self: 'ob, D: Unsigned, S: AsDerefMut<D, Target = Self> + ?Sized + 'ob
type Spec = SnapshotSpec
Source§impl Observe for NonZero<u32>
impl Observe for NonZero<u32>
type Observer<'ob, S, D> = GeneralObserver<'ob, SnapshotHandler<<S as AsDeref<D>>::Target>, S, D> where Self: 'ob, D: Unsigned, S: AsDerefMut<D, Target = Self> + ?Sized + 'ob
type Spec = SnapshotSpec
Source§impl Observe for NonZero<u64>
impl Observe for NonZero<u64>
type Observer<'ob, S, D> = GeneralObserver<'ob, SnapshotHandler<<S as AsDeref<D>>::Target>, S, D> where Self: 'ob, D: Unsigned, S: AsDerefMut<D, Target = Self> + ?Sized + 'ob
type Spec = SnapshotSpec
Source§impl Observe for NonZero<u128>
impl Observe for NonZero<u128>
type Observer<'ob, S, D> = GeneralObserver<'ob, SnapshotHandler<<S as AsDeref<D>>::Target>, S, D> where Self: 'ob, D: Unsigned, S: AsDerefMut<D, Target = Self> + ?Sized + 'ob
type Spec = SnapshotSpec
Source§impl Observe for NonZero<usize>
impl Observe for NonZero<usize>
type Observer<'ob, S, D> = GeneralObserver<'ob, SnapshotHandler<<S as AsDeref<D>>::Target>, S, D> where Self: 'ob, D: Unsigned, S: AsDerefMut<D, Target = Self> + ?Sized + 'ob
type Spec = SnapshotSpec
Source§impl Observe for Duration
impl Observe for Duration
type Observer<'ob, S, D> = GeneralObserver<'ob, SnapshotHandler<<S as AsDeref<D>>::Target>, S, D> where Self: 'ob, D: Unsigned, S: AsDerefMut<D, Target = Self> + ?Sized + 'ob
type Spec = SnapshotSpec
Source§impl Observe for SystemTime
impl Observe for SystemTime
type Observer<'ob, S, D> = GeneralObserver<'ob, SnapshotHandler<<S as AsDeref<D>>::Target>, S, D> where Self: 'ob, D: Unsigned, S: AsDerefMut<D, Target = Self> + ?Sized + 'ob
type Spec = SnapshotSpec
Source§impl Observe for AtomicBool
impl Observe for AtomicBool
type Observer<'ob, S, D> = GeneralObserver<'ob, SnapshotHandler<<S as AsDeref<D>>::Target>, S, D> where Self: 'ob, D: Unsigned, S: AsDerefMut<D, Target = Self> + ?Sized + 'ob
type Spec = DefaultSpec
Source§impl Observe for AtomicI8
impl Observe for AtomicI8
type Observer<'ob, S, D> = GeneralObserver<'ob, SnapshotHandler<<S as AsDeref<D>>::Target>, S, D> where Self: 'ob, D: Unsigned, S: AsDerefMut<D, Target = Self> + ?Sized + 'ob
type Spec = DefaultSpec
Source§impl Observe for AtomicI16
impl Observe for AtomicI16
type Observer<'ob, S, D> = GeneralObserver<'ob, SnapshotHandler<<S as AsDeref<D>>::Target>, S, D> where Self: 'ob, D: Unsigned, S: AsDerefMut<D, Target = Self> + ?Sized + 'ob
type Spec = DefaultSpec
Source§impl Observe for AtomicI32
impl Observe for AtomicI32
type Observer<'ob, S, D> = GeneralObserver<'ob, SnapshotHandler<<S as AsDeref<D>>::Target>, S, D> where Self: 'ob, D: Unsigned, S: AsDerefMut<D, Target = Self> + ?Sized + 'ob
type Spec = DefaultSpec
Source§impl Observe for AtomicI64
impl Observe for AtomicI64
type Observer<'ob, S, D> = GeneralObserver<'ob, SnapshotHandler<<S as AsDeref<D>>::Target>, S, D> where Self: 'ob, D: Unsigned, S: AsDerefMut<D, Target = Self> + ?Sized + 'ob
type Spec = DefaultSpec
Source§impl Observe for AtomicIsize
impl Observe for AtomicIsize
type Observer<'ob, S, D> = GeneralObserver<'ob, SnapshotHandler<<S as AsDeref<D>>::Target>, S, D> where Self: 'ob, D: Unsigned, S: AsDerefMut<D, Target = Self> + ?Sized + 'ob
type Spec = DefaultSpec
Source§impl Observe for AtomicU8
impl Observe for AtomicU8
type Observer<'ob, S, D> = GeneralObserver<'ob, SnapshotHandler<<S as AsDeref<D>>::Target>, S, D> where Self: 'ob, D: Unsigned, S: AsDerefMut<D, Target = Self> + ?Sized + 'ob
type Spec = DefaultSpec
Source§impl Observe for AtomicU16
impl Observe for AtomicU16
type Observer<'ob, S, D> = GeneralObserver<'ob, SnapshotHandler<<S as AsDeref<D>>::Target>, S, D> where Self: 'ob, D: Unsigned, S: AsDerefMut<D, Target = Self> + ?Sized + 'ob
type Spec = DefaultSpec
Source§impl Observe for AtomicU32
impl Observe for AtomicU32
type Observer<'ob, S, D> = GeneralObserver<'ob, SnapshotHandler<<S as AsDeref<D>>::Target>, S, D> where Self: 'ob, D: Unsigned, S: AsDerefMut<D, Target = Self> + ?Sized + 'ob
type Spec = DefaultSpec
Source§impl Observe for AtomicU64
impl Observe for AtomicU64
type Observer<'ob, S, D> = GeneralObserver<'ob, SnapshotHandler<<S as AsDeref<D>>::Target>, S, D> where Self: 'ob, D: Unsigned, S: AsDerefMut<D, Target = Self> + ?Sized + 'ob
type Spec = DefaultSpec
Source§impl Observe for AtomicUsize
impl Observe for AtomicUsize
type Observer<'ob, S, D> = GeneralObserver<'ob, SnapshotHandler<<S as AsDeref<D>>::Target>, S, D> where Self: 'ob, D: Unsigned, S: AsDerefMut<D, Target = Self> + ?Sized + 'ob
type Spec = DefaultSpec
Source§impl<K: Clone + Eq + Hash, V: Observe> Observe for HashMap<K, V>
impl<K: Clone + Eq + Hash, V: Observe> Observe for HashMap<K, V>
type Observer<'ob, S, D> = HashMapObserver<K, <V as Observe>::Observer<'ob, V, Zero>, S, D> where Self: 'ob, D: Unsigned, S: AsDerefMut<D, Target = Self> + ?Sized + 'ob
type Spec = DefaultSpec
Source§impl<K: Clone + Ord, V: Observe> Observe for BTreeMap<K, V>
impl<K: Clone + Ord, V: Observe> Observe for BTreeMap<K, V>
type Observer<'ob, S, D> = BTreeMapObserver<K, <V as Observe>::Observer<'ob, V, Zero>, S, D> where Self: 'ob, D: Unsigned, S: AsDerefMut<D, Target = Self> + ?Sized + 'ob
type Spec = DefaultSpec
Source§impl<T> Observe for (T₁, T₂, …, Tₙ)
This trait is implemented for tuples up to 12 items long.
impl<T> Observe for (T₁, T₂, …, Tₙ)
This trait is implemented for tuples up to 12 items long.