Skip to content
Snippets Groups Projects
state.rs 30.4 KiB
Newer Older
        Ok(())
    }
}

impl Default for BeesMbc {
    fn default() -> Self {
        Self::new(vec![])
    }
}

/// Top level manager structure containing the
/// entrypoint static methods for saving and loading
/// [BEES](https://github.com/LIJI32/SameBoy/blob/master/BESS.md) state
/// files and buffers for the Game Boy.
pub struct StateManager;

impl StateManager {
    pub fn save_file(file_path: &str, gb: &mut GameBoy) -> Result<(), String> {
        let mut file = match File::create(file_path) {
            Ok(file) => file,
            Err(_) => return Err(format!("Failed to open file: {}", file_path)),
        };
        let data = Self::save(gb)?;
        file.write_all(&data).unwrap();
        Ok(())
    }

    pub fn save(gb: &mut GameBoy) -> Result<Vec<u8>, String> {
        let mut data: Vec<u8> = vec![];
        let mut state = BeesState::from_gb(gb)?;
        state.write(&mut data);
        Ok(data)
    }

    pub fn load_file(file_path: &str, gb: &mut GameBoy) -> Result<(), String> {
        let mut file = match File::open(file_path) {
            Ok(file) => file,
            Err(_) => return Err(format!("Failed to open file: {}", file_path)),
        };
        let mut data = vec![];
        file.read_to_end(&mut data).unwrap();
        Self::load(&data, gb)?;
        Ok(())
    }

    pub fn load(data: &[u8], gb: &mut GameBoy) -> Result<(), String> {
        let mut state = BeesState::default();
        state.read(&mut Cursor::new(data.to_vec()));
        state.to_gb(gb)?;
        Ok(())
    }