Skip to main content

crdb_helpers/
lib.rs

1use crdb_core::Object;
2
3use anyhow::Context;
4
5pub fn parse_snapshot<T: Object>(
6    snapshot_version: i32,
7    snapshot_data: serde_json::Value,
8) -> anyhow::Result<T> {
9    if snapshot_version == T::snapshot_version() {
10        Ok(serde_json::from_value(snapshot_data).with_context(|| {
11            format!(
12                "parsing current snapshot version {snapshot_version} for object type {:?}",
13                T::type_ulid()
14            )
15        })?)
16    } else {
17        T::from_old_snapshot(snapshot_version, snapshot_data).with_context(|| {
18            format!(
19                "parsing old snapshot version {snapshot_version} for object type {:?}",
20                T::type_ulid()
21            )
22        })
23    }
24}
25
26pub fn parse_snapshot_ref<T: Object>(
27    snapshot_version: i32,
28    snapshot_data: &serde_json::Value,
29) -> anyhow::Result<T> {
30    if snapshot_version == T::snapshot_version() {
31        Ok(T::deserialize(snapshot_data).with_context(|| {
32            format!(
33                "parsing current snapshot version {snapshot_version} for object type {:?}",
34                T::type_ulid()
35            )
36        })?)
37    } else {
38        T::from_old_snapshot(snapshot_version, snapshot_data.clone()).with_context(|| {
39            format!(
40                "parsing old snapshot version {snapshot_version} for object type {:?}",
41                T::type_ulid()
42            )
43        })
44    }
45}
46
47#[cfg(feature = "js")]
48pub fn parse_snapshot_js<T: Object>(
49    snapshot_version: i32,
50    snapshot_data: wasm_bindgen::JsValue,
51) -> crdb_core::Result<T> {
52    use crdb_core::ResultExt;
53
54    if snapshot_version == T::snapshot_version() {
55        Ok(
56            serde_wasm_bindgen::from_value(snapshot_data).wrap_with_context(|| {
57                format!(
58                    "parsing current snapshot version {snapshot_version} for object type {:?}",
59                    T::type_ulid()
60                )
61            })?,
62        )
63    } else {
64        let as_serde_json = serde_wasm_bindgen::from_value::<serde_json::Value>(snapshot_data)
65            .wrap_context("parsing data from IndexedDB as JSON")?;
66        T::from_old_snapshot(snapshot_version, as_serde_json).wrap_with_context(|| {
67            format!(
68                "parsing old snapshot version {snapshot_version} for object type {:?}",
69                T::type_ulid()
70            )
71        })
72    }
73}