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
mod actor; use actor::{AskSelf, Protocol}; use cas::memory::actor::MemoryStorageActor; use holochain_core_types::{ cas::{ content::{Address, AddressableContent}, storage::ContentAddressableStorage, }, error::HolochainError, }; use riker::actors::*; #[derive(Clone, Debug, PartialEq)] pub struct MemoryStorage { actor: ActorRef<Protocol>, } impl MemoryStorage { pub fn new() -> Result<MemoryStorage, HolochainError> { Ok(MemoryStorage { actor: MemoryStorageActor::new_ref()?, }) } } impl ContentAddressableStorage for MemoryStorage { fn add(&mut self, content: &AddressableContent) -> Result<(), HolochainError> { let response = self .actor .block_on_ask(Protocol::CasAdd(content.address(), content.content()))?; unwrap_to!(response => Protocol::CasAddResult).clone() } fn contains(&self, address: &Address) -> Result<bool, HolochainError> { let response = self .actor .block_on_ask(Protocol::CasContains(address.clone()))?; unwrap_to!(response => Protocol::CasContainsResult).clone() } fn fetch<AC: AddressableContent>( &self, address: &Address, ) -> Result<Option<AC>, HolochainError> { let response = self .actor .block_on_ask(Protocol::CasFetch(address.clone()))?; let content = unwrap_to!(response => Protocol::CasFetchResult).clone()?; Ok(match content { Some(c) => Some(AC::from_content(&c)), None => None, }) } } #[cfg(test)] pub mod tests { use cas::memory::MemoryStorage; use holochain_core_types::cas::{ content::{ExampleAddressableContent, OtherExampleAddressableContent}, storage::StorageTestSuite, }; pub fn test_memory_storage() -> MemoryStorage { MemoryStorage::new().expect("could not create memory storage") } #[test] fn memory_round_trip() { let test_suite = StorageTestSuite::new(test_memory_storage()); test_suite.round_trip_test::<ExampleAddressableContent, OtherExampleAddressableContent>( String::from("foo"), String::from("bar"), ); } }