kade_proto/cmd/
load.rs

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}