mirror of
https://github.com/storytold/craft-libs.git
synced 2026-11-14 06:22:24 +00:00
Decode FigCraft preview metadata in shared format
This commit is contained in:
1 parent
a966e43c29
commit
9aac9301a9
1 file changed
+42
@@ -210,6 +210,38 @@ pub fn read_document_json<D: serde::de::DeserializeOwned>(text: &str) -> Result<
|
||||
Ok((document, header))
|
||||
}
|
||||
|
||||
/// The native document fields needed to render a recent-file preview.
|
||||
#[derive(Clone, Debug, Default, PartialEq, Deserialize)]
|
||||
pub struct PreviewDocument {
|
||||
#[serde(default)]
|
||||
pub pages: Vec<u64>,
|
||||
#[serde(default)]
|
||||
pub nodes: std::collections::BTreeMap<String, PreviewNode>,
|
||||
#[serde(default)]
|
||||
pub kind: PreviewKind,
|
||||
}
|
||||
|
||||
/// Preview-relevant fields from one native document node.
|
||||
#[derive(Clone, Debug, Default, PartialEq, Deserialize)]
|
||||
pub struct PreviewNode {
|
||||
#[serde(default)]
|
||||
pub background: Option<Value>,
|
||||
}
|
||||
|
||||
/// The supported native document kinds as stored on disk.
|
||||
#[derive(Clone, Copy, Debug, Default, PartialEq, Eq, Deserialize)]
|
||||
#[serde(rename_all = "camelCase")]
|
||||
pub enum PreviewKind {
|
||||
#[default]
|
||||
Design,
|
||||
Board,
|
||||
}
|
||||
|
||||
/// Decode the preview-relevant subset of the native FigCraft document schema.
|
||||
pub fn read_preview_document(bytes: &[u8]) -> Result<PreviewDocument, serde_json::Error> {
|
||||
serde_json::from_slice(bytes)
|
||||
}
|
||||
|
||||
pub fn check_version(h: &Header) -> Result<(), NewerVersion> {
|
||||
if let Some(v) = h.version
|
||||
&& v > u64::from(VERSION)
|
||||
@@ -328,6 +360,16 @@ mod tests {
|
||||
assert_eq!(v["version"], VERSION);
|
||||
assert_eq!(v["name"], "example");
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn preview_document_reads_native_page_background_and_kind() {
|
||||
let doc = read_preview_document(br#"{"pages":[7],"nodes":{"7":{"background":{"r":0.1}}},"kind":"board","unrelated":true}"#).unwrap();
|
||||
assert_eq!(doc.pages, vec![7]);
|
||||
assert_eq!(doc.nodes["7"].background.as_ref().and_then(|v| v.get("r")).and_then(Value::as_f64), Some(0.1));
|
||||
assert_eq!(doc.kind, PreviewKind::Board);
|
||||
assert_eq!(read_preview_document(b"{}").unwrap(), PreviewDocument::default());
|
||||
assert!(read_preview_document(br#"{"kind":"unknown"}"#).is_err());
|
||||
}
|
||||
}
|
||||
|
||||
/// Limits for the native ZIP package reader.
|
||||
|
||||
Reference in new issue
Block a user