Skip to main content

open_gpui_canvas/
format.rs

1use crate::{CanvasSnapshot, DocumentError};
2
3pub const CANVAS_DOCUMENT_FORMAT_VERSION: u32 = 1;
4pub const CANVAS_DOCUMENT_MIN_SUPPORTED_FORMAT_VERSION: u32 = 1;
5pub const CANVAS_SNAPSHOT_MIGRATIONS: &[CanvasSnapshotMigration] = &[];
6
7#[derive(Clone, Copy, Debug, Eq, PartialEq)]
8pub struct CanvasSnapshotMigration {
9    pub from_version: u32,
10    pub to_version: u32,
11}
12
13pub fn default_document_format_version() -> u32 {
14    CANVAS_DOCUMENT_FORMAT_VERSION
15}
16
17pub fn validate_canvas_document_format_version(format_version: u32) -> Result<(), DocumentError> {
18    if format_version < CANVAS_DOCUMENT_MIN_SUPPORTED_FORMAT_VERSION
19        || format_version > CANVAS_DOCUMENT_FORMAT_VERSION
20    {
21        return Err(DocumentError::UnsupportedFormatVersion {
22            expected: CANVAS_DOCUMENT_FORMAT_VERSION,
23            found: format_version,
24        });
25    }
26
27    Ok(())
28}
29
30pub fn migrate_canvas_snapshot(
31    mut snapshot: CanvasSnapshot,
32) -> Result<CanvasSnapshot, DocumentError> {
33    validate_canvas_document_format_version(snapshot.format_version)?;
34
35    for migration in CANVAS_SNAPSHOT_MIGRATIONS {
36        if snapshot.format_version == migration.from_version {
37            snapshot.format_version = migration.to_version;
38        }
39    }
40
41    if snapshot.format_version != CANVAS_DOCUMENT_FORMAT_VERSION {
42        return Err(DocumentError::UnsupportedFormatVersion {
43            expected: CANVAS_DOCUMENT_FORMAT_VERSION,
44            found: snapshot.format_version,
45        });
46    }
47
48    Ok(snapshot)
49}