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}