radiate_engines/io/
mod.rs1use 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}