1use crate::pkg::db::SerializableState;
2use crate::prelude::*;
3
4use bytes::Bytes;
5use std::fs::File;
6use std::io::Read;
7use std::path::PathBuf;
8use tracing::{info, instrument};
9
10#[derive(Debug)]
11pub struct Load {
12 path: PathBuf,
13}
14
15impl Load {
16 pub fn new(path: PathBuf) -> Load { Load { path } }
17
18 pub fn parse_frames(parse: &mut Parse) -> crate::Result<Load> {
19 let path = parse.next_string()?;
20 Ok(Load { path: PathBuf::from(path) })
21 }
22
23 #[instrument(skip(self, db, dst))]
24 pub async fn apply(self, db: &Db, dst: &mut Connection) -> crate::Result<()> {
25 let mut file = File::open(&self.path)?;
26 let mut serialized = Vec::new();
27 file.read_to_end(&mut serialized)?;
28
29 let serializable_state: SerializableState = bincode::deserialize(&serialized)?;
30 db.load(serializable_state);
31 info!("Database state loaded from {:?}", self.path);
32
33 let response = Frame::Simple("OK".to_string());
34 dst.write_frame(&response).await?;
35
36 Ok(())
37 }
38
39 pub fn into_frame(self) -> Frame {
40 let mut frame = Frame::array();
41 frame.push_bulk(Bytes::from("load".as_bytes()));
42 frame.push_bulk(Bytes::from(self.path.to_string_lossy().into_owned()));
43 frame
44 }
45}