state_store: add load_all_rooms, fix clippy warnings

master
Devin R 2020-04-19 15:25:25 -04:00
parent 9fb4bd9d19
commit 8f89e8335c
3 changed files with 57 additions and 7 deletions

View File

@ -257,8 +257,8 @@ impl Room {
invited_member_count, invited_member_count,
} = summary; } = summary;
self.room_name.heroes = heroes.clone(); self.room_name.heroes = heroes.clone();
self.room_name.invited_member_count = invited_member_count.clone(); self.room_name.invited_member_count = *invited_member_count;
self.room_name.joined_member_count = joined_member_count.clone(); self.room_name.joined_member_count = *joined_member_count;
} }
/// Handle a room.member updating the room state if necessary. /// Handle a room.member updating the room state if necessary.
@ -453,7 +453,7 @@ mod test {
.await; .await;
assert_eq!(2, room.members.len()); assert_eq!(2, room.members.len());
for (_id, member) in &room.members { for member in room.members.values() {
assert_eq!(MembershipState::Join, member.membership); assert_eq!(MembershipState::Join, member.membership);
} }

View File

@ -13,6 +13,7 @@
// See the License for the specific language governing permissions and // See the License for the specific language governing permissions and
// limitations under the License. // limitations under the License.
use std::collections::HashMap;
use std::path::Path; use std::path::Path;
pub mod state_store; pub mod state_store;
@ -50,13 +51,17 @@ pub trait StateStore: Send + Sync {
/// Set up connections or open files to load/save state. /// Set up connections or open files to load/save state.
fn open(&self, path: &Path) -> Result<(), Self::IoError>; fn open(&self, path: &Path) -> Result<(), Self::IoError>;
/// /// Loads the state of `BaseClient` through `StateStore::Store` type.
fn load_client_state(&self) -> Result<Self::Store, Self::IoError>; fn load_client_state(&self) -> Result<Self::Store, Self::IoError>;
/// /// Load the state of a single `Room` by `RoomId`.
fn load_room_state(&self, room_id: &RoomId) -> Result<Room, Self::IoError>; fn load_room_state(&self, room_id: &RoomId) -> Result<Room, Self::IoError>;
/// Load the state of all `Room`s.
/// ///
/// This will be mapped over in the client in order to store `Room`s in an async safe way.
fn load_all_rooms(&self) -> Result<HashMap<RoomId, Room>, Self::IoError>;
/// Save the current state of the `BaseClient` using the `StateStore::Store` type.
fn store_client_state(&self, _: Self::Store) -> Result<(), Self::IoError>; fn store_client_state(&self, _: Self::Store) -> Result<(), Self::IoError>;
/// /// Save the state a single `Room`.
fn store_room_state(&self, _: &Room) -> Result<(), Self::IoError>; fn store_room_state(&self, _: &Room) -> Result<(), Self::IoError>;
} }

View File

@ -1,4 +1,5 @@
use std::fs::OpenOptions; use std::collections::HashMap;
use std::fs::{self, OpenOptions};
use std::io::{BufReader, BufWriter, Write}; use std::io::{BufReader, BufWriter, Write};
use std::path::Path; use std::path::Path;
@ -42,6 +43,33 @@ impl StateStore for JsonStore {
} }
} }
fn load_all_rooms(&self) -> Result<HashMap<RoomId, Room>> {
if let Some(mut path) = dirs::home_dir() {
path.push(".matrix_store/rooms/");
let mut rooms_map = HashMap::new();
for file in fs::read_dir(&path)? {
let file = file?.path();
if file.is_dir() {
continue;
}
let f_hdl = OpenOptions::new().read(true).open(&file)?;
let reader = BufReader::new(f_hdl);
let room = serde_json::from_reader::<_, Room>(reader).map_err(Error::from)?;
let room_id = room.room_id.clone();
rooms_map.insert(room_id, room);
}
Ok(rooms_map)
} else {
todo!("Error maybe")
}
}
fn store_client_state(&self, state: ClientState) -> Result<()> { fn store_client_state(&self, state: ClientState) -> Result<()> {
if let Some(mut path) = dirs::home_dir() { if let Some(mut path) = dirs::home_dir() {
path.push(".matrix_store/client.json"); path.push(".matrix_store/client.json");
@ -146,4 +174,21 @@ mod test {
fn store_room_state() { fn store_room_state() {
run_and_cleanup(test_store_room_state); run_and_cleanup(test_store_room_state);
} }
fn test_load_rooms() {
let store = JsonStore;
let id = RoomId::try_from("!roomid:example.com").unwrap();
let user = UserId::try_from("@example:example.com").unwrap();
let room = Room::new(&id, &user);
store.store_room_state(&room).unwrap();
let loaded = store.load_all_rooms().unwrap();
println!("{:?}", loaded);
}
#[test]
fn load_rooms() {
run_and_cleanup(test_load_rooms);
}
} }