use crate::clap::extensions::state_transaction::{self, RestoreMode};
use crate::clap::plugin::NamClapMainThread;
use crate::clap::plugin::debug_assert_main_thread;
use clack_common::stream::{InputStream, OutputStream};
use clack_extensions::state_context::{
PluginStateContext, PluginStateContextImpl, StateContextType,
};
use clack_plugin::prelude::*;
use std::io::{Read, Write};
pub type NamPluginStateContext = PluginStateContext;
impl<'a> PluginStateContextImpl for NamClapMainThread<'a> {
fn save(
&mut self,
output: &mut OutputStream,
context_type: StateContextType,
) -> Result<(), PluginError> {
debug_assert_main_thread(&self.host);
self.snapshot_params();
let save_params = if context_type == StateContextType::ForPreset {
let mut preset_params = self.params.clone();
preset_params.model_path = None;
preset_params.ir_path = None;
preset_params
} else {
self.params.clone()
};
let serialized = super::state::serialize_envelope(&save_params)?;
output
.write_all(&serialized)
.map_err(|e| PluginError::Error(Box::new(e)))?;
Ok(())
}
fn load(
&mut self,
input: &mut InputStream,
context_type: StateContextType,
) -> Result<(), PluginError> {
debug_assert_main_thread(&self.host);
let mut buffer = Vec::new();
input
.read_to_end(&mut buffer)
.map_err(|e| PluginError::Error(Box::new(e)))?;
let mode = if context_type == StateContextType::ForPreset {
RestoreMode::ForPreset
} else {
RestoreMode::Full
};
state_transaction::restore_state_transactional(&buffer, self, mode)
}
}
#[cfg(test)]
#[path = "state_context_test.rs"]
mod tests;