From 5f39a3b822558c28caec88279b2a81ced70ca7fd Mon Sep 17 00:00:00 2001 From: Tim Froehlich Date: Wed, 18 Dec 2024 10:47:45 -0600 Subject: [PATCH] Convert the encoded DCF and ServerFigmaDocs to Proto --- Cargo.lock | 1 + Cargo.toml | 1 + common/build.gradle.kts | 11 ++ .../common/{FsaasSession.kt => DCDVersion.kt} | 2 +- .../android/designcompose/common/Feedback.kt | 26 ++--- .../designcompose/common/GenericDocContent.kt | 102 ++++++------------ .../common/DocSerializationTest.kt | 98 +++++++++++++++++ crates/dc_bundle/src/definition.rs | 36 +++++++ crates/dc_bundle/src/definition_file.rs | 82 ++++++++++++++ crates/dc_bundle/src/legacy_definition.rs | 50 --------- crates/dc_bundle/src/lib.rs | 7 ++ crates/figma_import/Cargo.toml | 1 + crates/figma_import/src/design_definition.rs | 64 ++--------- crates/figma_import/src/fetch.rs | 15 +-- crates/figma_import/src/lib.rs | 6 +- crates/figma_import/src/tools/dcf_info.rs | 9 +- crates/figma_import/src/tools/fetch.rs | 32 +++--- crates/figma_import/src/tools/fetch_layout.rs | 11 +- .../figma_import/tests/layout-unit-tests.dcf | Bin 38182 -> 22657 bytes crates/figma_import/tests/layout_tests.rs | 2 +- crates/figma_import/tests/test_fetches.rs | 18 +++- ...signSwitcherDoc_Ljph4e3sC0lHcynfXpoh9f.dcf | Bin 412971 -> 247603 bytes .../android/designcompose/DesignSwitcher.kt | 2 +- .../com/android/designcompose/DocFetcher.kt | 4 +- .../res/raw/raw_resource_test_hello_world_doc | Bin 3874 -> 2236 bytes .../design_compose_definition.proto | 10 ++ .../HelloWorldDoc_pxVlixodJqZL95zo2RzTHl.dcf | Bin 3874 -> 2236 bytes 27 files changed, 367 insertions(+), 223 deletions(-) rename common/src/main/java/com/android/designcompose/common/{FsaasSession.kt => DCDVersion.kt} (95%) create mode 100644 common/src/test/kotlin/com/android/designcompose/common/DocSerializationTest.kt create mode 100644 crates/dc_bundle/src/definition_file.rs diff --git a/Cargo.lock b/Cargo.lock index 6b684f341..b187d44fe 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -434,6 +434,7 @@ dependencies = [ "serde_json", "svgtypes", "taffy", + "tempfile", "testdir", "thiserror", "unicode-segmentation", diff --git a/Cargo.toml b/Cargo.toml index c2b194a41..14c162354 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -42,6 +42,7 @@ serde-reflection = { version = "0.3" } svgtypes = "0.15.1" taffy = { version = "0.6", default-features = false, features = ["std", "taffy_tree", "flexbox", "content_size"] } testdir = "0.9.1" +tempfile = "3.11.0" thiserror = "1.0" unicode-segmentation = "1" ureq = "2" diff --git a/common/build.gradle.kts b/common/build.gradle.kts index 52f9b7b12..f94830663 100644 --- a/common/build.gradle.kts +++ b/common/build.gradle.kts @@ -38,6 +38,17 @@ publishing { } } +sourceSets { + test { + resources.srcDirs(rootProject.rootDir.resolve("designcompose/src/main/assets")) + resources.srcDirs( + rootProject.rootDir.resolve("reference-apps/helloworld/helloworld-app/src/main/assets") + ) + // Enable testing of the Validation dcf files once we're able to serialize them again + // resources.srcDirs(rootProject.rootDir.resolve("integration-tests/validation/src/main/assets")) + } +} + /** * Serde gen task * diff --git a/common/src/main/java/com/android/designcompose/common/FsaasSession.kt b/common/src/main/java/com/android/designcompose/common/DCDVersion.kt similarity index 95% rename from common/src/main/java/com/android/designcompose/common/FsaasSession.kt rename to common/src/main/java/com/android/designcompose/common/DCDVersion.kt index aa139e5ba..067205d5f 100644 --- a/common/src/main/java/com/android/designcompose/common/FsaasSession.kt +++ b/common/src/main/java/com/android/designcompose/common/DCDVersion.kt @@ -18,5 +18,5 @@ package com.android.designcompose.common // LINT.IfChange // Current serialized doc version -const val FSAAS_DOC_VERSION = 24 +const val FSAAS_DOC_VERSION = 25 // LINT.ThenChange(crates/dc_bundle/src/legacy_definition.rs) diff --git a/common/src/main/java/com/android/designcompose/common/Feedback.kt b/common/src/main/java/com/android/designcompose/common/Feedback.kt index 97bcf1345..0429d880a 100644 --- a/common/src/main/java/com/android/designcompose/common/Feedback.kt +++ b/common/src/main/java/com/android/designcompose/common/Feedback.kt @@ -16,6 +16,8 @@ package com.android.designcompose.common +import java.util.logging.Logger + const val TAG = "DesignCompose" enum class FeedbackLevel { @@ -212,23 +214,17 @@ abstract class FeedbackImpl { } } -// This has been commented out since it was only used by the gradle preview plugin which currently -// has been disabled. If we bring the plugin back we may need to uncomment this code so that the -// plugin can log feedback messages. -/* // Instance of the Feedback class used in non-Android environments - object Feedback : FeedbackImpl() { - private val javaLogger = Logger.getLogger(TAG) + private val javaLogger = Logger.getLogger(TAG) - // Implementation-specific functions - override fun logMessage(str: String, level: FeedbackLevel) { - when (level) { - FeedbackLevel.Debug -> javaLogger.config(str) - FeedbackLevel.Info -> javaLogger.info(str) - FeedbackLevel.Warn -> javaLogger.warning(str) - FeedbackLevel.Error -> javaLogger.severe(str) + // Implementation-specific functions + override fun logMessage(str: String, level: FeedbackLevel) { + when (level) { + FeedbackLevel.Debug -> javaLogger.config(str) + FeedbackLevel.Info -> javaLogger.info(str) + FeedbackLevel.Warn -> javaLogger.warning(str) + FeedbackLevel.Error -> javaLogger.severe(str) + } } - } } -*/ diff --git a/common/src/main/java/com/android/designcompose/common/GenericDocContent.kt b/common/src/main/java/com/android/designcompose/common/GenericDocContent.kt index de741c913..35766b319 100644 --- a/common/src/main/java/com/android/designcompose/common/GenericDocContent.kt +++ b/common/src/main/java/com/android/designcompose/common/GenericDocContent.kt @@ -17,13 +17,10 @@ package com.android.designcompose.common import com.android.designcompose.definition.DesignComposeDefinition +import com.android.designcompose.definition.DesignComposeDefinitionHeader import com.android.designcompose.definition.view.View +import com.android.designcompose.live_update.figma.FigmaDocInfo import com.android.designcompose.live_update.figma.ServerFigmaDoc -import com.android.designcompose.serdegen.DesignComposeDefinitionHeader -import com.android.designcompose.serdegen.FigmaDocInfo -import com.android.designcompose.serdegen.ViewDataType -import com.novi.bincode.BincodeDeserializer -import com.novi.bincode.BincodeSerializer import java.io.ByteArrayOutputStream import java.io.File import java.io.FileOutputStream @@ -57,10 +54,11 @@ class GenericDocContent( @kotlin.ExperimentalUnsignedTypes fun toSerializedBytes(feedback: FeedbackImpl): ByteArray? { try { - val serializer = BincodeSerializer() - header.serialize(serializer) - document.serialize(serializer) - return serializer._bytes.toUByteArray().asByteArray() + imageSessionData + val outputStream = ByteArrayOutputStream() + header.writeDelimitedTo(outputStream) + document.writeDelimitedTo(outputStream) + outputStream.write(imageSessionData) + return outputStream.toByteArray() } catch (error: Throwable) { feedback.documentSaveError(error.toString(), docId) } @@ -74,15 +72,15 @@ fun decodeServerBaseDoc( docId: DesignDocId, feedback: FeedbackImpl, ): GenericDocContent? { - val deserializer = BincodeDeserializer(docBytes) - val header = decodeHeader(deserializer, docId, feedback) ?: return null + val docStream = docBytes.inputStream() + val header = decodeHeader(docStream, docId, feedback) ?: return null // Server sends content in the format of ServerFigmaDoc, which has additional data - val serverDoc = ServerFigmaDoc.deserialize(deserializer) - serverDoc.errors?.forEach { feedback.documentUpdateWarnings(docId, it) } - val content = serverDoc.figma_doc.get() - val imageSessionData = decodeImageSession(docBytes, deserializer) - feedback.documentDecodeSuccess(header.dc_version, header.name, header.last_modified, docId) + val serverDoc = ServerFigmaDoc.parseDelimitedFrom(docStream) + serverDoc.errorsList?.forEach { feedback.documentUpdateWarnings(docId, it) } + val content = serverDoc.figmaDoc + val imageSessionData = decodeImageSession(docStream) + feedback.documentDecodeSuccess(header.dcVersion, header.name, header.lastModified, docId) val viewMap = content.views() val variantViewMap = createVariantViewMap(viewMap) @@ -97,31 +95,29 @@ fun decodeServerBaseDoc( nodeIdMap, imageSessionData.imageSessionData, imageSessionData.imageSession, - serverDoc.branches, - serverDoc.project_files, + serverDoc.branchesList, + serverDoc.projectFilesList, ) } /// Read a serialized disk document from the given stream. Deserialize it and deserialize its images fun decodeDiskBaseDoc( - doc: InputStream, + docStream: InputStream, docId: DesignDocId, feedback: FeedbackImpl, ): GenericDocContent? { - val docBytes = readDocBytes(doc, docId, feedback) - val deserializer = BincodeDeserializer(docBytes) + feedback.documentDecodeStart(docId) - val header = decodeHeader(deserializer, docId, feedback) ?: return null + val header = decodeHeader(docStream, docId, feedback) ?: return null + val content = DesignComposeDefinition.parseDelimitedFrom(docStream) - // Disk loads are in the format of DesignComposeDefinition - val content = DesignComposeDefinition.deserialize(deserializer) - val imageSessionData = decodeImageSession(docBytes, deserializer) + val imageSessionData = decodeImageSession(docStream) val viewMap = content.views() val variantMap = createVariantViewMap(viewMap) val variantPropertyMap = createVariantPropertyMap(viewMap) val nodeIdMap = createNodeIdMap(viewMap) - feedback.documentDecodeSuccess(header.dc_version, header.name, header.last_modified, docId) + feedback.documentDecodeSuccess(header.dcVersion, header.name, header.lastModified, docId) return GenericDocContent( docId, @@ -183,56 +179,23 @@ private fun createNodeIdMap(nodes: Map?): HashMap val nodeIdMap = HashMap() fun addViewToMap(view: View) { nodeIdMap[view.id] = view - (view.data.get().view_data_type.get() as? ViewDataType.Container)?.let { container -> - container.value.children.forEach { addViewToMap(it) } + if (view.data.hasContainer()) { + view.data.container.childrenList.forEach { addViewToMap(it) } } } nodes?.values?.forEach { addViewToMap(it) } return nodeIdMap } -fun readDocBytes(doc: InputStream, docId: DesignDocId, feedback: FeedbackImpl): ByteArray { - // Read the doc from assets or network... - feedback.documentDecodeStart(docId) - val buffer = ByteArrayOutputStream() - var nRead: Int - val tmp = ByteArray(128) - - do { - nRead = doc.read(tmp, 0, tmp.size) - if (nRead != -1) buffer.write(tmp, 0, nRead) - } while (nRead != -1) - buffer.flush() - val docBytes = buffer.toByteArray() - feedback.documentDecodeReadBytes(docBytes.size, docId) - return docBytes -} - -fun readErrorBytes(errorStream: InputStream?): String { - if (errorStream == null) return "" - - val buffer = ByteArrayOutputStream() - var nRead: Int - val tmp = ByteArray(128) - - do { - nRead = errorStream.read(tmp, 0, tmp.size) - if (nRead != -1) buffer.write(tmp, 0, nRead) - } while (nRead != -1) - buffer.flush() - val docBytes = buffer.toByteArray() - return String(docBytes) -} - private fun decodeHeader( - deserializer: BincodeDeserializer, + docStream: InputStream, docId: DesignDocId, feedback: FeedbackImpl, ): DesignComposeDefinitionHeader? { // Now attempt to deserialize the doc) - val header = DesignComposeDefinitionHeader.deserialize(deserializer) - if (header.dc_version != FSAAS_DOC_VERSION) { - feedback.documentDecodeVersionMismatch(FSAAS_DOC_VERSION, header.dc_version, docId) + val header = DesignComposeDefinitionHeader.parseDelimitedFrom(docStream) + if (header.dcVersion != FSAAS_DOC_VERSION) { + feedback.documentDecodeVersionMismatch(FSAAS_DOC_VERSION, header.dcVersion, docId) return null } return header @@ -258,12 +221,9 @@ private data class ImageSession(val imageSessionData: ByteArray, var imageSessio } } -private fun decodeImageSession( - docBytes: ByteArray, - deserializer: BincodeDeserializer, -): ImageSession { - // The image session data is a JSON blob attached after the bincode document content. - val imageSessionData = docBytes.copyOfRange(deserializer._buffer_offset, docBytes.size) +private fun decodeImageSession(docStream: InputStream): ImageSession { + // The image session data is a JSON blob attached after the proto document content. + val imageSessionData = docStream.readBytes() val imageSession = if (imageSessionData.isNotEmpty()) { String(imageSessionData, Charsets.UTF_8) diff --git a/common/src/test/kotlin/com/android/designcompose/common/DocSerializationTest.kt b/common/src/test/kotlin/com/android/designcompose/common/DocSerializationTest.kt new file mode 100644 index 000000000..4523ab8f3 --- /dev/null +++ b/common/src/test/kotlin/com/android/designcompose/common/DocSerializationTest.kt @@ -0,0 +1,98 @@ +/* + * Copyright 2024 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.designcompose.common + +import java.io.InputStream +import kotlin.io.path.createTempFile +import kotlin.io.path.toPath +import kotlin.test.assertNotNull +import org.junit.Test + +class DocSerializationTest { + + // Load the DesignSwitcherDoc from the Designcompose module + @Test + fun decodeDesignSwitcher() { + val inputStream: InputStream = + DocSerializationTest::class + .java + .classLoader!! + .getResourceAsStream("figma/DesignSwitcherDoc_Ljph4e3sC0lHcynfXpoh9f.dcf")!! + assertNotNull(inputStream) + + assertNotNull(decodeDiskBaseDoc(inputStream, DesignDocId("test_doc"), Feedback)) + } + + // Load the HelloWorldDoc from HelloWorld + @Test + fun decodeHelloWorld() { + val inputStream: InputStream = + DocSerializationTest::class + .java + .classLoader!! + .getResourceAsStream("figma/HelloWorldDoc_pxVlixodJqZL95zo2RzTHl.dcf")!! + assertNotNull(inputStream) + + assertNotNull(decodeDiskBaseDoc(inputStream, DesignDocId("test_doc"), Feedback)) + } + + @Test + fun loadSaveLoadHelloWorld() { + val inputStream: InputStream = + DocSerializationTest::class + .java + .classLoader!! + .getResourceAsStream("figma/HelloWorldDoc_pxVlixodJqZL95zo2RzTHl.dcf")!! + assertNotNull(inputStream) + val doc = decodeDiskBaseDoc(inputStream, DesignDocId("loadSaveLoad"), Feedback) + assertNotNull(doc) + val savedDoc = createTempFile() + doc.save(savedDoc.toFile(), Feedback) + val loadedDoc = + decodeDiskBaseDoc( + savedDoc.toFile().inputStream(), + DesignDocId("loadSaveLoad"), + Feedback, + ) + assertNotNull(loadedDoc) + } + + // Iterate through all dcf files in the figma/ directory and test them + @Test + fun loadSaveLoadAllDocs() { + val resourcesUrl = DocSerializationTest::class.java.classLoader!!.getResource("figma") + val resourcesFile = resourcesUrl?.toURI()?.toPath()?.toFile() + + resourcesFile!! + .walkTopDown() + .filter { it.name.endsWith(".dcf") } + .forEach { file -> + println("Testing ${file.name}") + val doc = decodeDiskBaseDoc(file.inputStream(), DesignDocId(file.name), Feedback) + assertNotNull(doc) + val savedDoc = createTempFile() + doc.save(savedDoc.toFile(), Feedback) + val loadedDoc = + decodeDiskBaseDoc( + savedDoc.toFile().inputStream(), + DesignDocId(file.name), + Feedback, + ) + assertNotNull(loadedDoc) + } + } +} diff --git a/crates/dc_bundle/src/definition.rs b/crates/dc_bundle/src/definition.rs index 5af8671fd..9230863ad 100644 --- a/crates/dc_bundle/src/definition.rs +++ b/crates/dc_bundle/src/definition.rs @@ -31,6 +31,42 @@ pub mod view; include!(concat!(env!("OUT_DIR"), "/designcompose.definition.rs")); +// LINT.IfChange +pub static CURRENT_VERSION: u32 = 25; +// Lint.ThenChange(common/src/main/java/com/android/designcompose/common/DCDVersion.kt) + +impl DesignComposeDefinitionHeader { + pub fn current( + last_modified: String, + name: String, + response_version: String, + id: String, + ) -> DesignComposeDefinitionHeader { + DesignComposeDefinitionHeader { + dc_version: CURRENT_VERSION, + last_modified, + name, + response_version, + id, + } + } + pub fn current_version() -> u32 { + CURRENT_VERSION + } +} + +impl fmt::Display for DesignComposeDefinitionHeader { + fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { + // NOTE: Using `write!` here instead of typical `format!` + // to keep newlines. + write!( + f, + "DC Version: {}\nDoc ID: {}\nName: {}\nLast Modified: {}\nResponse Version: {}", + &self.dc_version, &self.id, &self.name, &self.last_modified, &self.response_version + ) + } +} + impl DesignComposeDefinition { pub fn new( views: HashMap, diff --git a/crates/dc_bundle/src/definition_file.rs b/crates/dc_bundle/src/definition_file.rs new file mode 100644 index 000000000..57a14436e --- /dev/null +++ b/crates/dc_bundle/src/definition_file.rs @@ -0,0 +1,82 @@ +/* + * Copyright 2024 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +use crate::definition::{DesignComposeDefinition, DesignComposeDefinitionHeader}; +use crate::Error; +use prost::bytes::{Buf, Bytes}; +use prost::Message; +use std::fs::File; +use std::io::{Read, Write}; +use std::path::Path; + +pub fn encode_dcd_with_header( + header: &DesignComposeDefinitionHeader, + doc: &DesignComposeDefinition, +) -> Vec { + let mut encoded = header.encode_length_delimited_to_vec(); + encoded.append(&mut doc.encode_length_delimited_to_vec()); + encoded +} + +pub fn decode_dcd_with_header( + mut msg: B, +) -> Result<(DesignComposeDefinitionHeader, DesignComposeDefinition), Error> +where + B: Buf, +{ + let header = DesignComposeDefinitionHeader::decode_length_delimited(&mut msg)?; + + // Ensure the version of the document matches this version of automotive design compose. + if header.dc_version != DesignComposeDefinitionHeader::current_version() { + return Err(Error::DCDLoadError(format!( + "DesignComposeDefinition incorrect version. Expected {} Found: {}", + DesignComposeDefinitionHeader::current_version(), + header.dc_version + ))); + } + + let dcd = DesignComposeDefinition::decode_length_delimited(msg)?; + Ok((header, dcd)) +} + +/// A helper method to save serialized figma design docs. +pub fn save_design_def

( + save_path: P, + header: &DesignComposeDefinitionHeader, + doc: &DesignComposeDefinition, +) -> Result<(), Error> +where + P: AsRef, +{ + let mut output = File::create(save_path)?; + output.write_all(encode_dcd_with_header(header, doc).as_slice())?; + Ok(()) +} + +/// A helper method to load a DesignCompose Definition from a file. +pub fn load_design_def

( + load_path: P, +) -> Result<(DesignComposeDefinitionHeader, DesignComposeDefinition), Error> +where + P: AsRef, +{ + let mut buf: Vec = vec![]; + let mut document_file = File::open(&load_path)?; + let _bytes = document_file.read_to_end(&mut buf)?; + + let (header, doc) = decode_dcd_with_header(Bytes::from(buf))?; + + Ok((header, doc)) +} diff --git a/crates/dc_bundle/src/legacy_definition.rs b/crates/dc_bundle/src/legacy_definition.rs index a73f947d5..e4f15f663 100644 --- a/crates/dc_bundle/src/legacy_definition.rs +++ b/crates/dc_bundle/src/legacy_definition.rs @@ -17,14 +17,6 @@ // This module holds the original structures that made up the serialized design doc, and which will be replaced with the protobuf implementations of the Design Definition use serde::{Deserialize, Serialize}; -use std::fmt; -// To help keep the legacy definition files clear we alias `crate::definition`, which is the base -// module for the generated protobuf files to `proto`, so that all of the protobuf-generated types -// inside `legacy_definition` must be prepended with `proto::` - -// LINT.IfChange -static CURRENT_VERSION: u32 = 24; -// Lint.ThenChange(common/src/main/java/com/android/designcompose/common/FsaasSession.kt) // This is our serialized document type. #[derive(Serialize, Deserialize, Debug)] @@ -37,45 +29,3 @@ impl DesignComposeDefinitionHeaderV0 { 22 } } - -// This is our serialized document type. -#[derive(Serialize, Deserialize, Debug)] -pub struct DesignComposeDefinitionHeader { - pub dc_version: u32, - pub last_modified: String, - pub name: String, - pub response_version: String, - pub id: String, -} - -impl DesignComposeDefinitionHeader { - pub fn current( - last_modified: String, - name: String, - response_version: String, - id: String, - ) -> DesignComposeDefinitionHeader { - DesignComposeDefinitionHeader { - dc_version: CURRENT_VERSION, - last_modified, - name, - response_version, - id, - } - } - pub fn current_version() -> u32 { - CURRENT_VERSION - } -} - -impl fmt::Display for DesignComposeDefinitionHeader { - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - // NOTE: Using `write!` here instead of typical `format!` - // to keep newlines. - write!( - f, - "DC Version: {}\nDoc ID: {}\nName: {}\nLast Modified: {}\nResponse Version: {}", - CURRENT_VERSION, &self.id, &self.name, &self.last_modified, &self.response_version - ) - } -} diff --git a/crates/dc_bundle/src/lib.rs b/crates/dc_bundle/src/lib.rs index 41a698c33..6b67387f3 100644 --- a/crates/dc_bundle/src/lib.rs +++ b/crates/dc_bundle/src/lib.rs @@ -16,6 +16,7 @@ use thiserror::Error; pub mod android_interface; pub mod definition; +pub mod definition_file; pub mod legacy_definition; #[derive(Error, Debug)] @@ -26,6 +27,12 @@ pub enum Error { UnknownEnumVariant { enum_name: String }, #[error("Attempted to parse unknown NodeQuery string {query}")] InvalidNodeQuery { query: String }, + #[error("IO Error")] + IoError(#[from] std::io::Error), + #[error("Prost Decode error")] + DecodeError(#[from] prost::DecodeError), + #[error("DesignComposeDefinition Load Error")] + DCDLoadError(String), } pub type Result = std::result::Result; diff --git a/crates/figma_import/Cargo.toml b/crates/figma_import/Cargo.toml index 8f25bf4d7..31f15d8e0 100644 --- a/crates/figma_import/Cargo.toml +++ b/crates/figma_import/Cargo.toml @@ -51,6 +51,7 @@ prost-build.workspace = true [dev-dependencies] testdir.workspace = true +tempfile.workspace = true [[bin]] name = "reflection" diff --git a/crates/figma_import/src/design_definition.rs b/crates/figma_import/src/design_definition.rs index 4e7ef680b..d7ea1d4f5 100644 --- a/crates/figma_import/src/design_definition.rs +++ b/crates/figma_import/src/design_definition.rs @@ -12,16 +12,11 @@ // See the License for the specific language governing permissions and // limitations under the License. -use crate::error::Error; +use dc_bundle::legacy_definition::DesignComposeDefinitionHeaderV0; use std::fs::File; -use std::io::{Read, Write}; +use std::io::Read; use std::path::Path; -use dc_bundle::definition::DesignComposeDefinition; -use dc_bundle::legacy_definition::{ - DesignComposeDefinitionHeader, DesignComposeDefinitionHeaderV0, -}; - include!(concat!(env!("OUT_DIR"), "/designcompose.live_update.figma.rs")); impl FigmaDocInfo { @@ -31,7 +26,9 @@ impl FigmaDocInfo { } /// A helper method to load the old DesignCompose Definition header format from a dcf file -pub fn load_design_def_header_v0

(load_path: P) -> Result +pub fn load_design_def_header_v0

( + load_path: P, +) -> Result where P: AsRef, { @@ -44,58 +41,13 @@ where Ok(header) } -/// A helper method to load a DesignCompose Definition from figma. -pub fn load_design_def

( - load_path: P, -) -> Result<(DesignComposeDefinitionHeader, DesignComposeDefinition), Error> -where - P: AsRef, -{ - let mut document_file = File::open(&load_path)?; - - let mut buf: Vec = vec![]; - let _bytes = document_file.read_to_end(&mut buf)?; - - let header: DesignComposeDefinitionHeader = bincode::deserialize(buf.as_slice())?; - - // Ensure the version of the document matches this version of automotive design compose. - if header.dc_version != DesignComposeDefinitionHeader::current_version() { - return Err(Error::DocumentLoadError(format!( - "Serialized Figma doc incorrect version. Expected {} Found: {}", - DesignComposeDefinitionHeader::current_version(), - header.dc_version - ))); - } - - let header_size = bincode::serialized_size(&header)? as usize; - - let doc: DesignComposeDefinition = bincode::deserialize(&buf.as_slice()[header_size..])?; - - Ok((header, doc)) -} - -/// A helper method to save serialized figma design docs. -pub fn save_design_def

( - save_path: P, - header: &DesignComposeDefinitionHeader, - doc: &DesignComposeDefinition, -) -> Result<(), Error> -where - P: AsRef, -{ - let mut output = File::create(save_path)?; - let header = bincode::serialize(header)?; - let doc = bincode::serialize(&doc)?; - output.write_all(header.as_slice())?; - output.write_all(doc.as_slice())?; - Ok(()) -} - #[cfg(test)] mod serialized_document_tests { - use super::*; + + use dc_bundle::definition_file::{load_design_def, save_design_def}; use std::fs::File; + use std::io::Write; use std::path::PathBuf; use testdir::testdir; diff --git a/crates/figma_import/src/fetch.rs b/crates/figma_import/src/fetch.rs index 593c65e2a..cb90efa41 100644 --- a/crates/figma_import/src/fetch.rs +++ b/crates/figma_import/src/fetch.rs @@ -13,8 +13,8 @@ // limitations under the License. use crate::{Document, ImageContextSession, ServerFigmaDoc}; -use dc_bundle::definition::{DesignComposeDefinition, NodeQuery}; -use dc_bundle::legacy_definition::DesignComposeDefinitionHeader; +use dc_bundle::definition::{DesignComposeDefinition, DesignComposeDefinitionHeader, NodeQuery}; +use prost::Message; use serde::{Deserialize, Serialize}; #[derive(Serialize, Deserialize)] @@ -118,19 +118,22 @@ pub fn fetch_doc( doc.component_sets().clone(), variable_map, ); - let mut response = bincode::serialize(&DesignComposeDefinitionHeader::current( + + let header = DesignComposeDefinitionHeader::current( doc.last_modified().clone(), doc.get_name(), doc.get_version(), doc.get_document_id(), - ))?; - response.append(&mut bincode::serialize(&ServerFigmaDoc { + ); + let server_doc = ServerFigmaDoc { figma_doc: Some(figma_doc), errors: error_list, branches: doc.branches.clone(), project_files: vec![], - })?); + }; + let mut response = header.encode_length_delimited_to_vec(); + response.append(&mut server_doc.encode_length_delimited_to_vec()); // Return the image session as a JSON blob; we might want to encode this differently so we // can be more robust if there's corruption. response.append(&mut serde_json::to_vec(&doc.image_session())?); diff --git a/crates/figma_import/src/lib.rs b/crates/figma_import/src/lib.rs index e6502f88f..f41378728 100644 --- a/crates/figma_import/src/lib.rs +++ b/crates/figma_import/src/lib.rs @@ -35,9 +35,8 @@ mod variable_utils; // Exports for library users pub use dc_bundle::definition::element::Rectangle; pub use dc_bundle::definition::DesignComposeDefinition; -pub use dc_bundle::legacy_definition::DesignComposeDefinitionHeader; +pub use dc_bundle::definition::DesignComposeDefinitionHeader; pub use design_definition::ServerFigmaDoc; -pub use design_definition::{load_design_def, load_design_def_header_v0, save_design_def}; pub use document::Document; pub use error::Error; pub use fetch::{fetch_doc, ConvertRequest, ConvertResponse, ProxyConfig}; @@ -47,6 +46,9 @@ pub use image_context::ImageContextSession; pub use dc_bundle::definition::element::Color; pub use dc_bundle::definition::view::{View, ViewData}; pub use dc_bundle::definition::NodeQuery; +pub use dc_bundle::definition_file::load_design_def; +pub use dc_bundle::definition_file::save_design_def; +pub use design_definition::load_design_def_header_v0; /// Functionality related to reflection for deserializing our bincode archives in other /// languages diff --git a/crates/figma_import/src/tools/dcf_info.rs b/crates/figma_import/src/tools/dcf_info.rs index 33390b5e0..8cbb4a7a8 100644 --- a/crates/figma_import/src/tools/dcf_info.rs +++ b/crates/figma_import/src/tools/dcf_info.rs @@ -21,8 +21,9 @@ // or // `cargo run --bin dcf_info --features="dcf_info" -- tests/layout-unit-tests.dcf -n HorizontalFill` -use crate::{load_design_def, load_design_def_header_v0}; +use crate::design_definition::load_design_def_header_v0; use clap::Parser; +use dc_bundle::definition_file::load_design_def; use dc_bundle::legacy_definition::DesignComposeDefinitionHeaderV0; #[derive(Debug)] @@ -45,6 +46,12 @@ impl From for ParseError { ParseError(format!("Figma Import Error: {:?}", e)) } } +impl From for ParseError { + fn from(e: dc_bundle::Error) -> Self { + eprintln!("Error during deserialization: {:?}", e); + ParseError(format!("Error during deserialization: {:?}", e)) + } +} #[derive(Parser, Debug)] pub struct Args { diff --git a/crates/figma_import/src/tools/fetch.rs b/crates/figma_import/src/tools/fetch.rs index 5ff0686e8..f4dc04992 100644 --- a/crates/figma_import/src/tools/fetch.rs +++ b/crates/figma_import/src/tools/fetch.rs @@ -13,13 +13,14 @@ // limitations under the License. use std::env; -use std::io::{Error, ErrorKind, Write}; +use std::io::{Error, ErrorKind}; use crate::{Document, ProxyConfig}; /// Utility program to fetch a doc and serialize it to file use clap::Parser; +use dc_bundle::definition::DesignComposeDefinitionHeader; use dc_bundle::definition::{DesignComposeDefinition, NodeQuery}; -use dc_bundle::legacy_definition::DesignComposeDefinitionHeader; +use dc_bundle::definition_file::save_design_def; #[derive(Debug)] #[allow(dead_code)] @@ -36,6 +37,12 @@ impl From for ConvertError { ConvertError(format!("Error during serialization: {:?}", e)) } } +impl From for ConvertError { + fn from(e: dc_bundle::Error) -> Self { + eprintln!("Error during serialization: {:?}", e); + ConvertError(format!("Error during serialization: {:?}", e)) + } +} impl From for ConvertError { fn from(e: serde_json::Error) -> Self { eprintln!("Error during image session serialization: {:?}", e); @@ -157,16 +164,17 @@ pub fn fetch(args: Args) -> Result<(), ConvertError> { println!(" Version: {}", doc.get_version()); println!(" Name: {}", doc.get_name()); println!(" Last Modified: {}", doc.last_modified().clone()); + // We don't bother with serialization of image sessions with this tool. - let mut output = std::fs::File::create(args.output)?; - let header = bincode::serialize(&DesignComposeDefinitionHeader::current( - doc.last_modified().clone(), - doc.get_name().clone(), - doc.get_version().clone(), - doc.get_document_id().clone(), - ))?; - let doc = bincode::serialize(&dc_definition)?; - output.write_all(header.as_slice())?; - output.write_all(doc.as_slice())?; + save_design_def( + args.output, + &DesignComposeDefinitionHeader::current( + doc.last_modified().clone(), + doc.get_name().clone(), + doc.get_version().clone(), + doc.get_document_id().clone(), + ), + &dc_definition, + )?; Ok(()) } diff --git a/crates/figma_import/src/tools/fetch_layout.rs b/crates/figma_import/src/tools/fetch_layout.rs index 8d99a6be0..9e5192c61 100644 --- a/crates/figma_import/src/tools/fetch_layout.rs +++ b/crates/figma_import/src/tools/fetch_layout.rs @@ -12,7 +12,6 @@ // See the License for the specific language governing permissions and // limitations under the License. -use crate::save_design_def; use crate::{Document, ProxyConfig}; /// Utility program to fetch a doc and serialize it to file use clap::Parser; @@ -22,8 +21,8 @@ use dc_bundle::definition::layout::LayoutSizing; use dc_bundle::definition::view::view_data::ViewDataType; use dc_bundle::definition::view::view_data::ViewDataType::{Container, Text}; use dc_bundle::definition::view::{view_data, View}; -use dc_bundle::definition::{DesignComposeDefinition, NodeQuery}; -use dc_bundle::legacy_definition::DesignComposeDefinitionHeader; +use dc_bundle::definition::{DesignComposeDefinition, DesignComposeDefinitionHeader, NodeQuery}; +use dc_bundle::definition_file::save_design_def; use layout::LayoutManager; use std::collections::HashMap; use std::io; @@ -57,6 +56,12 @@ impl From for ConvertError { ConvertError(format!("Error during serialization: {:?}", e)) } } +impl From for ConvertError { + fn from(e: dc_bundle::Error) -> Self { + eprintln!("Error during serialization: {:?}", e); + ConvertError(format!("Error during serialization: {:?}", e)) + } +} impl From for ConvertError { fn from(e: serde_json::Error) -> Self { eprintln!("Error during image session serialization: {:?}", e); diff --git a/crates/figma_import/tests/layout-unit-tests.dcf b/crates/figma_import/tests/layout-unit-tests.dcf index e8170c157e0e97962f82158c0b8d280bf6bf116a..6d823201039afc018840570aece9c432328303c4 100644 GIT binary patch literal 22657 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 Nq%_I2&&@JV|37&8bcp}} diff --git a/crates/figma_import/tests/layout_tests.rs b/crates/figma_import/tests/layout_tests.rs index 1baac3ec3..b1e06c37b 100644 --- a/crates/figma_import/tests/layout_tests.rs +++ b/crates/figma_import/tests/layout_tests.rs @@ -30,7 +30,7 @@ use dc_bundle::definition::view::view_data::ViewDataType; use dc_bundle::definition::view::view_data::ViewDataType::{Container, Text}; use dc_bundle::definition::view::{view_data, View}; use dc_bundle::definition::{DesignComposeDefinition, NodeQuery}; -use figma_import::load_design_def; +use dc_bundle::definition_file::load_design_def; use layout::LayoutManager; use std::collections::HashMap; diff --git a/crates/figma_import/tests/test_fetches.rs b/crates/figma_import/tests/test_fetches.rs index 2f23c8212..dd3afd363 100644 --- a/crates/figma_import/tests/test_fetches.rs +++ b/crates/figma_import/tests/test_fetches.rs @@ -15,8 +15,13 @@ */ #![cfg(feature = "fetch")] +use dc_bundle::definition::DesignComposeDefinitionHeader; +use dc_bundle::definition_file::{ + load_design_def, save_design_def, +}; use figma_import::tools::fetch::{build_definition, load_figma_token}; use figma_import::{Document, ProxyConfig}; +use tempfile::NamedTempFile; // Simply fetches and serializes a doc fn run_test(doc_id: &str, queries: &[&str]) { @@ -34,8 +39,17 @@ fn run_test(doc_id: &str, queries: &[&str]) { .unwrap(); let dc_definition = build_definition(&mut doc, &queries).unwrap(); + let header = DesignComposeDefinitionHeader::current( + "".to_string(), + "testFetch".to_string(), + "".to_string(), + doc_id.to_string(), + ); - bincode::serialize(&dc_definition).unwrap(); + // Check that we can encode it out to a file and read it back in again + let doc_file = NamedTempFile::new().unwrap(); + save_design_def(doc_file.path(), &header, &dc_definition).expect("Failed to save doc"); + load_design_def(doc_file.path()).expect("Failed to load the doc again"); } #[test] @@ -87,5 +101,5 @@ fn fetch_dials_gauges() { #[test] #[cfg_attr(not(feature = "test_fetches"), ignore)] fn fetch_styled_text_runs() { - run_test("mIYV4YsYYaMTsBMCVskA4N", &["#MainFrame"]) + run_test("mIYV4YsYYaMTsBMCVskA4N", &["#MainFrame"]); } diff --git a/designcompose/src/main/assets/figma/DesignSwitcherDoc_Ljph4e3sC0lHcynfXpoh9f.dcf b/designcompose/src/main/assets/figma/DesignSwitcherDoc_Ljph4e3sC0lHcynfXpoh9f.dcf index ac56b1a948655dcbb631c50877b704c708a4a0fb..587a342b31be3acbc5f2431f5b6c87d5a0869a4d 100644 GIT binary patch literal 247603 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 KLkwF-?W=!xO6Au8 diff --git a/proto/definition/design_compose_definition.proto b/proto/definition/design_compose_definition.proto index af468cc6c..dc51f1ffa 100644 --- a/proto/definition/design_compose_definition.proto +++ b/proto/definition/design_compose_definition.proto @@ -23,6 +23,15 @@ option java_multiple_files = true; option java_package = "com.android.designcompose.definition"; option optimize_for = LITE_RUNTIME; +// A separate header message that quickly identifies the main DesignComposeDefinition +message DesignComposeDefinitionHeader { + uint32 dc_version = 1; // DesignCompose version + string last_modified = 2; // Last modified timestamp + string name = 3; // Design name + string response_version = 4; // Figma response version + string id = 5; // Design ID +} + // A serialized Figma design document, containing views, images, component sets, // version, ID, and variable map. It's used for storing and loading Figma // designs in a DesignCompose project. @@ -39,3 +48,4 @@ message DesignComposeDefinition { map component_sets = 3; definition.element.VariableMap variable_map = 4; } + diff --git a/reference-apps/helloworld/helloworld-app/src/main/assets/figma/HelloWorldDoc_pxVlixodJqZL95zo2RzTHl.dcf b/reference-apps/helloworld/helloworld-app/src/main/assets/figma/HelloWorldDoc_pxVlixodJqZL95zo2RzTHl.dcf index f6ab27ebe75086ca5b1ce9896c5d223d86503ab0..62d5d5b74418f9c8ab83de23084c0700b8cd6abf 100644 GIT binary patch literal 2236 zcmcJQUuY9a9LM)JN!sl+F=4Lt&-!m!5lZfg*-cXFa+*33X@iv#M5Q2-UKd(j8x2v4 zAOu8^>O(mMeX$fos4r4q#3w2Gk{3bnrN=4UJslhfzWb2-&FtpS*{0rAU6`HO-~4uG z<}=^Nm}PbKqpcw5@}7B0a8k4?C_~)K3>n?xgX9Wv0z!GL;%gnW=O- zIhaf);#)7xo^q#Wi<7y_hW|uVnH9%O3yY0~W7mpt zG$%3^vU%@m96Khw$a!p*Xhh`nii|nHz&yZxfJJ~M2rUCV2Vk>uDxrv?%pWm2sc2NQ zePD@3C1Xcfgm$YJVlQC(C(vtq$AsPky0uOZ z*H}k~O`mFzOR7OGyT-VrI>t4kQX{lqP>*|+MHsSWU&l7E1R&WGb_X_uo9k+@9PgF5 z(}LMqak~lPKCymylfd70(KlUR1pYTsi2$C`I^@atN$U0?p;y{I#~-(LnQ8U{Jl`OT%3L2tKdm z_NIh-$HWm@<+$uB9w8ZjB(`0DCI5&RU&ywP8_Pf|KzE)hl%@+4u9GdguJcQIx;Qg3 zX`5zx(6(4%DZ+-KC6_l#}X298biPtL3T@~Ae=0dpp&q{^k%}4oNPhX3!|8aR|ep+>$+N8 zji|eNmu8O<*wtWB_eoT_t~f7=U!G+B0FFZ8`?hWEtNPSI98F&oBXfh&iq}DcJ4hTw zHlR?FUZp&DPN74FrW)X<;1qf163;^>L;8ld5quE^hS!}3fS=@r=ciEsyJ2!tuU^&l zg3U)+$7P#Qf$8T(skfF7wRNc2n%-B^)D&pdS7%3ZRI&O2(th@^ld;dtimEVc?F ziMfQ^L?WGAoQn{Kw6wLIcI`58j~CE4j|D~&28qPS$dCeap>q+yQMxk#jL@PS=)%Z7 z9FAR<%_bKN6>|%d1)=8T1!@H{76)0WBglE~MD|i=&5bmBvx)bb7OVI97vWs`NyR8$ z587Pd_yjKY`B<~v8OMd`oowf+Uyd#+k2DxcQ4nl`nJ-1pGY;v9C-lG2vH#G@w2GK> zk?1%@3v)CbW!ZG^3J#X-kUxK(B3{5gc{irw03D5gPw-h++DyCYQ|8TWPeA%08YCdD zl0E?^uW2v*SeIhoC-?3PL#knd`fgcb2UYyz`0Ax`}LE;0otTnss z=0=vzcd{&fyWQ?=Ew$=#T$`#VL%7^hlzwz6wl|AG$~I!tE_Yh#Nj?&35&4$H8){Mi KLkwF-?W=!xO6Au8