use super::document_reference::DocumentReference;
use super::field_value::{MapValue, Value};
#[derive(Debug, Clone)]
pub struct DocumentSnapshot {
pub reference: DocumentReference,
pub data: Option<MapValue>,
pub metadata: SnapshotMetadata,
}
impl DocumentSnapshot {
pub fn exists(&self) -> bool {
self.data.is_some()
}
pub fn get(&self, field: &str) -> Option<&Value> {
let Some(data) = &self.data else {
return None;
};
data.fields.get(field)
}
pub fn id(&self) -> &str {
self.reference.id()
}
}
#[derive(Debug, Clone, Copy)]
pub struct SnapshotMetadata {
pub has_pending_writes: bool,
pub is_from_cache: bool,
}
impl Default for SnapshotMetadata {
fn default() -> Self {
Self {
has_pending_writes: false,
is_from_cache: false,
}
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_document_snapshot_metadata_default() {
let metadata = SnapshotMetadata::default();
assert!(!metadata.has_pending_writes);
assert!(!metadata.is_from_cache);
}
#[test]
fn test_document_snapshot_metadata_pending_writes() {
let metadata = SnapshotMetadata {
has_pending_writes: true,
is_from_cache: false,
};
assert!(metadata.has_pending_writes);
}
#[test]
fn test_document_snapshot_metadata_from_cache() {
let metadata = SnapshotMetadata {
has_pending_writes: false,
is_from_cache: true,
};
assert!(metadata.is_from_cache);
}
#[test]
fn test_document_snapshot_metadata_all_flags() {
let metadata = SnapshotMetadata {
has_pending_writes: true,
is_from_cache: true,
};
assert!(metadata.has_pending_writes);
assert!(metadata.is_from_cache);
}
}