native_db_32bit/watch/query/get.rs
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 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86
use crate::db_type::{DatabaseSecondaryKeyOptions, InnerKeyValue, Input, KeyDefinition, Result};
use crate::watch;
use crate::watch::query::internal;
use crate::watch::MpscReceiver;
/// Watch only one value.
pub struct WatchGet<'db, 'w> {
pub(crate) internal: &'w internal::InternalWatch<'db>,
}
impl WatchGet<'_, '_> {
/// Watch the primary key.
///
/// Returns a channel receiver and the watcher id.
/// The watcher id can be used to unwatch the channel.
///
/// # Example
/// ```rust
/// use native_db::*;
/// use native_model::{native_model, Model};
/// use serde::{Deserialize, Serialize};
///
/// #[derive(Serialize, Deserialize)]
/// #[native_model(id=1, version=1)]
/// #[native_db]
/// struct Data {
/// #[primary_key]
/// id: u64,
/// }
///
/// fn main() -> Result<(), db_type::Error> {
/// let mut builder = DatabaseBuilder::new();
/// builder.define::<Data>()?;
/// let db = builder.create_in_memory()?;
///
/// // Watch the primary key
/// let (_recv, _id) = db.watch().get().primary::<Data>(1u64)?;
/// Ok(())
/// }
/// ```
pub fn primary<T: Input>(
&self,
key: impl InnerKeyValue,
) -> Result<(MpscReceiver<watch::Event>, u64)> {
self.internal.watch_primary::<T>(key)
}
/// Watch the secondary key.
///
/// Returns a channel receiver and the watcher id.
/// The watcher id can be used to unwatch the channel.
///
/// # Example
/// ```rust
/// use native_db::*;
/// use native_model::{native_model, Model};
/// use serde::{Deserialize, Serialize};
///
/// #[derive(Serialize, Deserialize)]
/// #[native_model(id=1, version=1)]
/// #[native_db]
/// struct Data {
/// #[primary_key]
/// id: u64,
/// #[secondary_key]
/// name: String,
/// }
///
/// fn main() -> Result<(), db_type::Error> {
/// let mut builder = DatabaseBuilder::new();
/// builder.define::<Data>()?;
/// let db = builder.create_in_memory()?;
///
/// // Watch the secondary key name
/// let (_recv, _id) = db.watch().get().secondary::<Data>(DataKey::name, "test")?;
/// Ok(())
/// }
/// ```
pub fn secondary<T: Input>(
&self,
key_def: impl KeyDefinition<DatabaseSecondaryKeyOptions>,
key: impl InnerKeyValue,
) -> Result<(MpscReceiver<watch::Event>, u64)> {
self.internal.watch_secondary::<T>(&key_def, key)
}
}