state_store: add load_all_rooms, fix clippy warnings
parent
9fb4bd9d19
commit
8f89e8335c
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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>;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue