Skip to main content

yugendb_core/
collection.rs

1//! Typed collection handle.
2
3use std::marker::PhantomData;
4
5use serde::{de::DeserializeOwned, Serialize};
6
7use crate::{CollectionName, Key, Result, Store, YugenDbError};
8
9/// Typed handle for records in a collection.
10#[derive(Clone)]
11pub struct Collection<T> {
12    store: Store,
13    name: CollectionName,
14    marker: PhantomData<T>,
15}
16
17impl<T> Collection<T> {
18    /// Creates a collection handle.
19    #[must_use]
20    pub fn new(store: Store, name: CollectionName) -> Self {
21        Self {
22            store,
23            name,
24            marker: PhantomData,
25        }
26    }
27
28    /// Returns the collection name.
29    #[must_use]
30    pub fn name(&self) -> &CollectionName {
31        &self.name
32    }
33
34    /// Reads a typed value.
35    pub async fn get<K>(&self, key: K) -> Result<Option<T>>
36    where
37        T: DeserializeOwned,
38        K: TryInto<Key>,
39        YugenDbError: From<K::Error>,
40    {
41        self.store.get_from_collection(&self.name, key).await
42    }
43
44    /// Writes a typed value.
45    pub async fn set<K>(&self, key: K, value: &T) -> Result<()>
46    where
47        T: Serialize,
48        K: TryInto<Key>,
49        YugenDbError: From<K::Error>,
50    {
51        self.store.set_in_collection(&self.name, key, value).await
52    }
53
54    /// Deletes a value.
55    pub async fn delete<K>(&self, key: K) -> Result<bool>
56    where
57        K: TryInto<Key>,
58        YugenDbError: From<K::Error>,
59    {
60        self.store.delete_from_collection(&self.name, key).await
61    }
62
63    /// Returns whether a key exists.
64    pub async fn exists<K>(&self, key: K) -> Result<bool>
65    where
66        K: TryInto<Key>,
67        YugenDbError: From<K::Error>,
68    {
69        self.store.exists_in_collection(&self.name, key).await
70    }
71
72    /// Scans typed values by key prefix.
73    pub async fn scan_prefix(&self, prefix: impl Into<String>) -> Result<Vec<(Key, T)>>
74    where
75        T: DeserializeOwned,
76    {
77        self.store
78            .scan_prefix_in_collection(&self.name, prefix)
79            .await
80    }
81}