+ struct Persister {
+ graph_error: Option<(std::io::ErrorKind, &'static str)>,
+ manager_error: Option<(std::io::ErrorKind, &'static str)>,
+ filesystem_persister: FilesystemPersister,
+ }
+
+ impl Persister {
+ fn new(data_dir: String) -> Self {
+ let filesystem_persister = FilesystemPersister::new(data_dir.clone());
+ Self { graph_error: None, manager_error: None, filesystem_persister }
+ }
+
+ fn with_graph_error(self, error: std::io::ErrorKind, message: &'static str) -> Self {
+ Self { graph_error: Some((error, message)), ..self }
+ }
+
+ fn with_manager_error(self, error: std::io::ErrorKind, message: &'static str) -> Self {
+ Self { manager_error: Some((error, message)), ..self }
+ }
+ }
+
+ impl KVStorePersister for Persister {
+ fn persist<W: Writeable>(&self, key: &str, object: &W) -> std::io::Result<()> {
+ if key == "manager" {
+ if let Some((error, message)) = self.manager_error {
+ return Err(std::io::Error::new(error, message))
+ }
+ }
+
+ if key == "network_graph" {
+ if let Some((error, message)) = self.graph_error {
+ return Err(std::io::Error::new(error, message))
+ }
+ }
+
+ self.filesystem_persister.persist(key, object)
+ }
+ }
+