inc_complete/db/
serialize.rs

1use std::sync::atomic::{AtomicU32, Ordering};
2
3use serde::{Deserialize, ser::SerializeStruct};
4
5use crate::{Cell, cell::CellData};
6
7use super::Db;
8
9impl<Storage> serde::Serialize for Db<Storage>
10where
11    Storage: serde::Serialize,
12{
13    fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
14    where
15        S: serde::Serializer,
16    {
17        let mut cells = Vec::with_capacity(self.cells.len());
18
19        self.cells.scan(|key, value| {
20            cells.push((*key, value.clone()));
21        });
22
23        let version = self.version.load(Ordering::SeqCst);
24        let next_cell = self.next_cell.load(Ordering::SeqCst);
25
26        let mut s = serializer.serialize_struct("Db", 4)?;
27        s.serialize_field("version", &version)?;
28        s.serialize_field("next_cell", &next_cell)?;
29        s.serialize_field("cells", &cells)?;
30        s.serialize_field("storage", &self.storage)?;
31        s.end()
32    }
33}
34
35#[derive(Deserialize)]
36#[serde(rename = "Db")]
37struct DbDeserialize<Storage> {
38    version: u32,
39    next_cell: u32,
40    cells: Vec<(Cell, CellData)>,
41    storage: Storage,
42}
43
44impl<'de, Storage> serde::Deserialize<'de> for Db<Storage>
45where
46    Storage: serde::Deserialize<'de>,
47{
48    fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
49    where
50        D: serde::Deserializer<'de>,
51    {
52        let db = DbDeserialize::deserialize(deserializer)?;
53
54        let cells = scc::HashMap::with_capacity(db.cells.len());
55        for (cell, data) in db.cells {
56            cells.insert(cell, data).ok();
57        }
58
59        Ok(Db {
60            cells,
61            version: AtomicU32::new(db.version),
62            next_cell: AtomicU32::new(db.next_cell),
63            storage: db.storage,
64        })
65    }
66}