Skip to main content

radiate_engines/io/
mod.rs

1use crate::Generation;
2use radiate_core::Chromosome;
3#[cfg(feature = "serde")]
4use serde::Deserialize;
5use std::path::PathBuf;
6
7pub trait CheckpointWriter<C, T>
8where
9    C: Chromosome,
10{
11    fn extension(&self) -> &str;
12    fn write_checkpoint(
13        &mut self,
14        path: PathBuf,
15        generation: &Generation<C, T>,
16    ) -> std::io::Result<()>;
17}
18
19pub trait CheckpointReader<C, T>
20where
21    C: Chromosome,
22{
23    fn read_checkpoint(&self, path: PathBuf) -> std::io::Result<Generation<C, T>>;
24}
25
26pub struct JsonCheckpointWriter;
27
28#[cfg(feature = "serde")]
29impl<C, T> CheckpointWriter<C, T> for JsonCheckpointWriter
30where
31    C: Chromosome + serde::Serialize,
32    T: serde::Serialize,
33{
34    fn extension(&self) -> &str {
35        "json"
36    }
37
38    fn write_checkpoint(
39        &mut self,
40        path: PathBuf,
41        generation: &Generation<C, T>,
42    ) -> std::io::Result<()> {
43        let json = serde_json::to_string(generation).map_err(|e| {
44            std::io::Error::new(
45                std::io::ErrorKind::Other,
46                format!("Failed to serialize checkpoint file: {}", e),
47            )
48        })?;
49
50        std::fs::write(path, json)
51    }
52}
53
54pub struct JsonCheckpointReader;
55
56#[cfg(feature = "serde")]
57impl<C, T> CheckpointReader<C, T> for JsonCheckpointReader
58where
59    C: Chromosome + for<'de> Deserialize<'de>,
60    T: for<'de> Deserialize<'de>,
61{
62    fn read_checkpoint(&self, path: PathBuf) -> std::io::Result<Generation<C, T>> {
63        let json = std::fs::read_to_string(path)?;
64        let generation = serde_json::from_str(&json).map_err(|e| {
65            std::io::Error::new(
66                std::io::ErrorKind::Other,
67                format!("Failed to deserialize checkpoint file: {}", e),
68            )
69        })?;
70
71        Ok(generation)
72    }
73}