Unnamed repository; edit this file 'description' to name the repository.
Diffstat (limited to 'crates/salsa/src/debug.rs')
| -rw-r--r-- | crates/salsa/src/debug.rs | 66 |
1 files changed, 66 insertions, 0 deletions
diff --git a/crates/salsa/src/debug.rs b/crates/salsa/src/debug.rs new file mode 100644 index 0000000000..0925ddb3d8 --- /dev/null +++ b/crates/salsa/src/debug.rs @@ -0,0 +1,66 @@ +//! Debugging APIs: these are meant for use when unit-testing or +//! debugging your application but aren't ordinarily needed. + +use crate::durability::Durability; +use crate::plumbing::QueryStorageOps; +use crate::Query; +use crate::QueryTable; +use std::iter::FromIterator; + +/// Additional methods on queries that can be used to "peek into" +/// their current state. These methods are meant for debugging and +/// observing the effects of garbage collection etc. +pub trait DebugQueryTable { + /// Key of this query. + type Key; + + /// Value of this query. + type Value; + + /// Returns a lower bound on the durability for the given key. + /// This is typically the minimum durability of all values that + /// the query accessed, but we may return a lower durability in + /// some cases. + fn durability(&self, key: Self::Key) -> Durability; + + /// Get the (current) set of the entries in the query table. + fn entries<C>(&self) -> C + where + C: FromIterator<TableEntry<Self::Key, Self::Value>>; +} + +/// An entry from a query table, for debugging and inspecting the table state. +#[derive(Debug, Clone, PartialEq, Eq, PartialOrd, Ord)] +#[non_exhaustive] +pub struct TableEntry<K, V> { + /// key of the query + pub key: K, + /// value of the query, if it is stored + pub value: Option<V>, +} + +impl<K, V> TableEntry<K, V> { + pub(crate) fn new(key: K, value: Option<V>) -> TableEntry<K, V> { + TableEntry { key, value } + } +} + +impl<Q> DebugQueryTable for QueryTable<'_, Q> +where + Q: Query, + Q::Storage: QueryStorageOps<Q>, +{ + type Key = Q::Key; + type Value = Q::Value; + + fn durability(&self, key: Q::Key) -> Durability { + self.storage.durability(self.db, &key) + } + + fn entries<C>(&self) -> C + where + C: FromIterator<TableEntry<Self::Key, Self::Value>>, + { + self.storage.entries(self.db) + } +} |