summaryrefslogtreecommitdiff
path: root/libre/iceweasel
diff options
context:
space:
mode:
authorbill-auger <mr.j.spam.me@gmail.com>2022-12-27 09:10:56 -0500
committerbill-auger <mr.j.spam.me@gmail.com>2023-01-02 14:44:34 -0500
commit57efad7f33fd01de5b8c003d9d430dee237a6878 (patch)
treeb9d22aef91705a5cb78bb8d64895476f7df9c22f /libre/iceweasel
parentbbbc063f2d5eaaecb478c2c5fa6282301718eb0e (diff)
[iceweasel]: tweak for i686/armv7h
Diffstat (limited to 'libre/iceweasel')
-rw-r--r--libre/iceweasel/PKGBUILD18
-rw-r--r--libre/iceweasel/update_uniffi_to_0.21.1.patch2236
2 files changed, 2252 insertions, 2 deletions
diff --git a/libre/iceweasel/PKGBUILD b/libre/iceweasel/PKGBUILD
index fd576159f..95e6b3349 100644
--- a/libre/iceweasel/PKGBUILD
+++ b/libre/iceweasel/PKGBUILD
@@ -46,6 +46,9 @@
# - prefer as many system libs as possible, over their vendored couterparts
# - Rebrand to Iceweasel, per the mozilla trademark policy, due to the FSDG changes
# - set user profile directory to ~/.mozilla/iceweasel
+# - FIXME: emergency patch for 32bit arches - update_uniffi_to_0.21.1.patch
+# https://bugzilla.mozilla.org/show_bug.cgi?id=1805809
+# https://hg.mozilla.org/releases/mozilla-beta/rev/42d532d3de54ece48fd29b0b07d160f0ec957b21
#
# privacy:
# - Remove Google API keys and usage
@@ -216,6 +219,12 @@ b2sums_i686=('97035e44cd1deae7bb2422c81eec7294feb51f43f460b4d7ddba083e1d8a48d265
'009789d3bb93ba418929019135804fc3de7de161e5be8efba7fc75646fbde395720be5b7a7d3f5d1671f459fdd2944dd14aca306bbf1c975436d4f7765d62d15'
'e4851eaa9030d9b8811f505f8f1569a41f8dc7cf586269108ebe370ac91896f69d36fc6d2e1937f427656fe4fca63031ca5e11d39a3667205a4b0a6f935cd548'
'd20ce3eff595f85df86eaa0dfb665fc356f8987117a771f76adc4ac12046a7e82b0af182fa99f87ea1362a5026c9d0216c7b714649fef0c7294c61c8e8f4d790')
+source_armv7h+=(update_uniffi_to_0.21.1.patch) # https://hg.mozilla.org/releases/mozilla-beta/raw-rev/42d532d3de54
+source_i686+=( update_uniffi_to_0.21.1.patch) # https://hg.mozilla.org/releases/mozilla-beta/raw-rev/42d532d3de54
+sha256sums_armv7h+=('1cf11d23455b71d5031200ca4dca8db7caa56d420ab7f37c035f08ef3e84351e') # update_uniffi_to_0.21.1.patch
+sha256sums_i686+=( '1cf11d23455b71d5031200ca4dca8db7caa56d420ab7f37c035f08ef3e84351e') # update_uniffi_to_0.21.1.patch
+b2sums_armv7h+=('ef2c5c8f1e827735bb063f08b453e8d6647300dc6625c86fc8ab43fe14c461e357765f74db574af83d141f21240e62136ffca76c7b078007ee70e3f36e7041ab') # update_uniffi_to_0.21.1.patch
+b2sums_i686+=( 'ef2c5c8f1e827735bb063f08b453e8d6647300dc6625c86fc8ab43fe14c461e357765f74db574af83d141f21240e62136ffca76c7b078007ee70e3f36e7041ab') # update_uniffi_to_0.21.1.patch
# Google API keys (see http://www.chromium.org/developers/how-tos/api-keys) # anti-feature
@@ -328,13 +337,13 @@ prepare() {
mkdir mozbuild
cd firefox-$pkgver
+ ## technical patching ##
+
# https://bugs.archlinux.org/task/76231
# https://bugzilla.mozilla.org/show_bug.cgi?id=1790496
# https://src.fedoraproject.org/rpms/firefox/blob/rawhide/f/libwebrtc-screen-cast-sync.patch
patch -Np1 -i ../0001-libwebrtc-screen-cast-sync.patch
- ## technical patching ##
-
# Unbreak build with python-zstandard 0.19.0
echo "applying zstandard-0.19.0.diff"
patch -Np1 -i ../zstandard-0.19.0.diff
@@ -346,8 +355,13 @@ prepare() {
# mozilla #1787405 and #1791267
sed -i "s|# 'LIBYUV_DISABLE_NEON',|'LIBYUV_DISABLE_NEON',|" media/libyuv/libyuv/libyuv.gyp
! grep "# 'LIBYUV_DISABLE_NEON'," media/libyuv/libyuv/libyuv.gyp || ! echo "error patching media/libyuv/libyuv/libyuv.gyp" || exit 1
+
+ # v108 FTBS all arches other than 64bit little-endian
+ patch -Np1 -i ../update_uniffi_to_0.21.1.patch
;;
i686)
+ # v108 FTBS all arches other than 64bit little-endian
+ patch -Np1 -i ../update_uniffi_to_0.21.1.patch
;;
x86_64)
;;
diff --git a/libre/iceweasel/update_uniffi_to_0.21.1.patch b/libre/iceweasel/update_uniffi_to_0.21.1.patch
new file mode 100644
index 000000000..0948f4ff4
--- /dev/null
+++ b/libre/iceweasel/update_uniffi_to_0.21.1.patch
@@ -0,0 +1,2236 @@
+
+# HG changeset patch
+# User Mike Hommey <mh+mozilla@glandium.org>
+# Date 1671490349 0
+# Node ID 42d532d3de54ece48fd29b0b07d160f0ec957b21
+# Parent 0a143142f96de8d71c894c0aa28300c5afc731bb
+Bug 1805809 - Update uniffi to 0.21.1 for more determinism across platforms. r=janerik,supply-chain-reviewers a=RyanVM
+
+Differential Revision: https://phabricator.services.mozilla.com/D164896
+
+diff --git a/Cargo.lock b/Cargo.lock
+--- a/Cargo.lock
++++ b/Cargo.lock
+@@ -5764,19 +5764,19 @@ checksum = "3ed742d4ea2bd1176e236172c842
+ [[package]]
+ name = "unicode-xid"
+ version = "0.2.3"
+ source = "registry+https://github.com/rust-lang/crates.io-index"
+ checksum = "957e51f3646910546462e67d5f7599b9e4fb8acdd304b087a6494730f9eebf04"
+
+ [[package]]
+ name = "uniffi"
+-version = "0.21.0"
+-source = "registry+https://github.com/rust-lang/crates.io-index"
+-checksum = "f54af5ada67d1173457a99a7bb44a7917f63e7466764cb4714865c7a6678b830"
++version = "0.21.1"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "b983553c0d1ad73547c65fa0c399aa800bee4a70ad330198e1c7a523212da5ee"
+ dependencies = [
+ "anyhow",
+ "bytes 1.2.1",
+ "camino",
+ "cargo_metadata",
+ "log",
+ "once_cell",
+ "paste",
+@@ -5874,19 +5874,17 @@ dependencies = [
+ "uniffi",
+ "uniffi-example-geometry",
+ "uniffi_build",
+ "uniffi_macros",
+ ]
+
+ [[package]]
+ name = "uniffi_bindgen"
+-version = "0.21.0"
+-source = "registry+https://github.com/rust-lang/crates.io-index"
+-checksum = "12cc4af3c0180c7e86c4a3acf2b6587af04ba2567b1e948993df10f421796621"
++version = "0.21.1"
+ dependencies = [
+ "anyhow",
+ "askama",
+ "bincode",
+ "camino",
+ "clap",
+ "fs-err",
+ "goblin 0.5.4",
+@@ -5897,51 +5895,63 @@ dependencies = [
+ "serde_json",
+ "toml",
+ "uniffi_meta",
+ "weedle2",
+ ]
+
+ [[package]]
+ name = "uniffi_build"
+-version = "0.21.0"
+-source = "registry+https://github.com/rust-lang/crates.io-index"
+-checksum = "510287c368a9386eb731ebe824a6fc6c82a105e20d020af1aa20519c1c1561db"
++version = "0.21.1"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "d035e50433ee3d52ab0dcdcf3b9b26f2cc2ec39294b3c07d95865a518709455f"
+ dependencies = [
+ "anyhow",
+ "camino",
+ "uniffi_bindgen",
+ ]
+
+ [[package]]
++name = "uniffi_checksum_derive"
++version = "0.21.1"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "78b6e16d46caf942016997af8bbdf4b163bf8ae3deb0b667d9643de7b7ffd4c9"
++dependencies = [
++ "quote",
++ "syn",
++]
++
++[[package]]
+ name = "uniffi_macros"
+-version = "0.21.0"
+-source = "registry+https://github.com/rust-lang/crates.io-index"
+-checksum = "5c8604503caa2cbcf271578dc51ca236d40e3b22e1514ffa2e638e2c39f6ad10"
++version = "0.21.1"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "c96a574677566f83ea8458dac1dd7792fd63e7c3f9dbcd865f0e8d6f8057b127"
+ dependencies = [
+ "bincode",
+ "camino",
+ "fs-err",
+ "once_cell",
+ "proc-macro2",
+ "quote",
+ "serde",
+ "syn",
+ "toml",
+ "uniffi_build",
+ "uniffi_meta",
+ ]
+
+ [[package]]
+ name = "uniffi_meta"
+-version = "0.21.0"
+-source = "registry+https://github.com/rust-lang/crates.io-index"
+-checksum = "cd9417cc653937681436b93838d8c5f97a5b8c58697813982ee8810bd1dc3b57"
++version = "0.21.1"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "729835442da829c9b6f7c111c76cf87b2498e129101203bec94f0c39a3296a38"
+ dependencies = [
+ "serde",
++ "siphasher",
++ "uniffi_checksum_derive",
+ ]
+
+ [[package]]
+ name = "unix_path"
+ version = "1.0.1"
+ source = "registry+https://github.com/rust-lang/crates.io-index"
+ checksum = "af8e291873ae77c4c8d9c9b34d0bee68a35b048fb39c263a5155e0e353783eaf"
+ dependencies = [
+diff --git a/Cargo.toml b/Cargo.toml
+--- a/Cargo.toml
++++ b/Cargo.toml
+@@ -175,13 +175,17 @@ path = "third_party/rust/mio-0.6.23"
+
+ # These are used to test UniFFI functionality. We haven't figured out how we
+ # want to publish these yet, so they are only accessible via git. This works
+ # okay, but it means that their dependencies on UniFFI crates will normally
+ # also be the git versions. Patch them to use the published versions to avoid
+ # duplicate crates.
+
+ [patch."https://github.com/mozilla/uniffi-rs.git"]
+-uniffi = "=0.21.0"
+-uniffi_bindgen = "=0.21.0"
+-uniffi_build = "=0.21.0"
+-uniffi_macros = "=0.21.0"
++uniffi = "=0.21.1"
++#uniffi_bindgen = "=0.21.1"
++uniffi_build = "=0.21.1"
++uniffi_macros = "=0.21.1"
+ weedle2 = "=4.0.0"
++
++# Patched to use uniffi_version = 0.21.0 for checksums.
++[patch.crates-io.uniffi_bindgen]
++path = "third_party/rust/uniffi_bindgen"
+diff --git a/supply-chain/audits.toml b/supply-chain/audits.toml
+--- a/supply-chain/audits.toml
++++ b/supply-chain/audits.toml
+@@ -1469,16 +1469,22 @@ criteria = "safe-to-deploy"
+ delta = "0.19.6 -> 0.20.0"
+
+ [[audits.uniffi]]
+ who = "Jan-Erik Rediger <jrediger@mozilla.com>"
+ criteria = "safe-to-deploy"
+ delta = "0.20.0 -> 0.21.0"
+ notes = "Maintained by the Glean and Application Services team."
+
++[[audits.uniffi]]
++who = "Mike Hommey <mh+mozilla@glandium.org>"
++criteria = "safe-to-deploy"
++delta = "0.21.0 -> 0.21.1"
++notes = "No changes."
++
+ [[audits.uniffi_bindgen]]
+ who = "Travis Long <tlong@mozilla.com>"
+ criteria = "safe-to-deploy"
+ version = "0.19.3"
+ notes = "Maintained by the Glean and Application Services teams."
+
+ [[audits.uniffi_bindgen]]
+ who = "Jan-Erik Rediger <jrediger@mozilla.com>"
+@@ -1492,16 +1498,22 @@ criteria = "safe-to-deploy"
+ delta = "0.19.6 -> 0.20.0"
+
+ [[audits.uniffi_bindgen]]
+ who = "Jan-Erik Rediger <jrediger@mozilla.com>"
+ criteria = "safe-to-deploy"
+ delta = "0.20.0 -> 0.21.0"
+ notes = "Maintained by the Glean and Application Services team."
+
++[[audits.uniffi_bindgen]]
++who = "Mike Hommey <mh+mozilla@glandium.org>"
++criteria = "safe-to-deploy"
++delta = "0.21.0 -> 0.21.1"
++notes = "I authored the changes in this version."
++
+ [[audits.uniffi_build]]
+ who = "Travis Long <tlong@mozilla.com>"
+ criteria = "safe-to-deploy"
+ version = "0.19.3"
+ notes = "Maintained by the Glean and Application Services teams."
+
+ [[audits.uniffi_build]]
+ who = "Jan-Erik Rediger <jrediger@mozilla.com>"
+@@ -1515,16 +1527,28 @@ criteria = "safe-to-deploy"
+ delta = "0.19.6 -> 0.20.0"
+
+ [[audits.uniffi_build]]
+ who = "Jan-Erik Rediger <jrediger@mozilla.com>"
+ criteria = "safe-to-deploy"
+ delta = "0.20.0 -> 0.21.0"
+ notes = "Maintained by the Glean and Application Services team."
+
++[[audits.uniffi_build]]
++who = "Mike Hommey <mh+mozilla@glandium.org>"
++criteria = "safe-to-deploy"
++delta = "0.21.0 -> 0.21.1"
++notes = "No changes."
++
++[[audits.uniffi_checksum_derive]]
++who = "Mike Hommey <mh+mozilla@glandium.org>"
++criteria = "safe-to-deploy"
++version = "0.21.1"
++notes = "I authored this crate."
++
+ [[audits.uniffi_macros]]
+ who = "Travis Long <tlong@mozilla.com>"
+ criteria = "safe-to-deploy"
+ version = "0.19.3"
+ notes = "Maintained by the Glean and Application Services teams."
+
+ [[audits.uniffi_macros]]
+ who = "Jan-Erik Rediger <jrediger@mozilla.com>"
+@@ -1538,16 +1562,22 @@ criteria = "safe-to-deploy"
+ delta = "0.19.6 -> 0.20.0"
+
+ [[audits.uniffi_macros]]
+ who = "Jan-Erik Rediger <jrediger@mozilla.com>"
+ criteria = "safe-to-deploy"
+ delta = "0.20.0 -> 0.21.0"
+ notes = "Maintained by the Glean and Application Services team."
+
++[[audits.uniffi_macros]]
++who = "Mike Hommey <mh+mozilla@glandium.org>"
++criteria = "safe-to-deploy"
++delta = "0.21.0 -> 0.21.1"
++notes = "No changes."
++
+ [[audits.uniffi_meta]]
+ who = "Jan-Erik Rediger <jrediger@mozilla.com>"
+ criteria = "safe-to-deploy"
+ version = "0.19.6"
+ notes = "Maintained by the Glean and Application Services team."
+
+ [[audits.uniffi_meta]]
+ who = "Perry McManis <pmcmanis@mozilla.com>"
+@@ -1555,16 +1585,22 @@ criteria = "safe-to-deploy"
+ delta = "0.19.6 -> 0.20.0"
+
+ [[audits.uniffi_meta]]
+ who = "Jan-Erik Rediger <jrediger@mozilla.com>"
+ criteria = "safe-to-deploy"
+ delta = "0.20.0 -> 0.21.0"
+ notes = "Maintained by the Glean and Application Services team."
+
++[[audits.uniffi_meta]]
++who = "Mike Hommey <mh+mozilla@glandium.org>"
++criteria = "safe-to-deploy"
++delta = "0.21.0 -> 0.21.1"
++notes = "I authored the changes in this version."
++
+ [[audits.void]]
+ who = "Bobby Holley <bobbyholley@gmail.com>"
+ criteria = "safe-to-deploy"
+ version = "1.0.2"
+ notes = "Very small crate, just hosts the Void type for easier cross-crate interfacing."
+
+ [[audits.wasm-encoder]]
+ who = "Ryan Hunt <rhunt@eqrion.net>"
+diff --git a/supply-chain/config.toml b/supply-chain/config.toml
+--- a/supply-chain/config.toml
++++ b/supply-chain/config.toml
+@@ -149,16 +149,20 @@ notes = "We're not shipping this and hav
+ [policy.storage]
+ audit-as-crates-io = false
+ notes = "This is a first-party crate which is entirely unrelated to the crates.io package of the same name."
+
+ [policy.tabs]
+ audit-as-crates-io = false
+ notes = "This is a first-party crate, maintained by the appservices team, which is entirely unrelated to the crates.io package of the same name."
+
++[policy.uniffi_bindgen]
++audit-as-crates-io = false
++notes = "This is a first-party crate, normally vendored, but currently patched in-tree until next update."
++
+ [policy.viaduct]
+ audit-as-crates-io = false
+ notes = "This is a first-party crate, maintained by the appservices team, which is entirely unrelated to the crates.io package of the same name."
+
+ [policy.webdriver]
+ audit-as-crates-io = false
+ criteria = "safe-to-run"
+ notes = "This is a first-party crate which is also published to crates.io. We certify audits for this crate as part of the documented release process, but that step happens after the version bump lands on central so we don't enforce it here. It's also used only for automation, so its subtree can be safe-to-run."
+diff --git a/third_party/rust/uniffi/.cargo-checksum.json b/third_party/rust/uniffi/.cargo-checksum.json
+--- a/third_party/rust/uniffi/.cargo-checksum.json
++++ b/third_party/rust/uniffi/.cargo-checksum.json
+@@ -1,1 +1,1 @@
+-{"files":{"Cargo.toml":"b7bde8b1b6bb7e1420c9c486d7562d1639fbb82a2b6459b8b3b7d15f002377d3","release.toml":"a6602545cd6eb46e44d89ce946d7954957ac00f1c955de54c736fa2cb560b1df","src/ffi/ffidefault.rs":"c7ab752fffed17c3fabb60e818ad1d093482f95dd0bdeae6871287695c583e48","src/ffi/foreignbytes.rs":"37061e2da7135576abccb86fe27b4fefc054586a040f2ca81fe9858d5649e887","src/ffi/foreigncallbacks.rs":"c0974920313ac81dd4bb28a51dd9e9ef50c8ea6d965f0bfdde58c661a4ca719f","src/ffi/mod.rs":"3fb3b74607066e0052fc91168e9473dbf82dbae562f85c33774a7f5f6b350616","src/ffi/rustbuffer.rs":"b773637d9e4651b80cd16f7a02ed75846d02ce0a9e32b718ce644cdba3a83cdd","src/ffi/rustcalls.rs":"4a85a90b0d46974ab9e80e403a1cddaa252337b227e1a672bb6fdbbca5a66259","src/lib.rs":"83614739f8c0c939b217755cfde169a85608a52ea197f63f7850e5765e2c5f97","src/panichook.rs":"9f49c7994a8e5489c1105c488bb3f8c5571bc5f813e7be90441eca15da5c9851","src/testing.rs":"f287d682a8f27465838b2aba91993c635a4dcd281d802dc12c7c75794324123f","tests/ui/proc_macro_arc.rs":"d766dffee3fe6a93522d40f44a7f15592db141fd674034fa5f016e06f510e87b","tests/ui/proc_macro_arc.stderr":"9e7d098abdd47f249ff62fe0a2ee0f8b96282ec5a3be0c48a778baab4624180f","tests/ui/version_mismatch.rs":"16ea359e5853517ee0d0704c015ae8c825533109fbefd715130d0f4a51f15898","tests/ui/version_mismatch.stderr":"aadbd8f3847f5663022d8dd75d6afa3b25dfc8abccd30b386a681f98587d4ceb"},"package":"f54af5ada67d1173457a99a7bb44a7917f63e7466764cb4714865c7a6678b830"}
+\ No newline at end of file
++{"files":{"Cargo.toml":"40a5376941ee93f7d3d013862731eaced1121c852bd4df4affe1cd65bf9b68be","release.toml":"a6602545cd6eb46e44d89ce946d7954957ac00f1c955de54c736fa2cb560b1df","src/ffi/ffidefault.rs":"c7ab752fffed17c3fabb60e818ad1d093482f95dd0bdeae6871287695c583e48","src/ffi/foreignbytes.rs":"37061e2da7135576abccb86fe27b4fefc054586a040f2ca81fe9858d5649e887","src/ffi/foreigncallbacks.rs":"c0974920313ac81dd4bb28a51dd9e9ef50c8ea6d965f0bfdde58c661a4ca719f","src/ffi/mod.rs":"3fb3b74607066e0052fc91168e9473dbf82dbae562f85c33774a7f5f6b350616","src/ffi/rustbuffer.rs":"b773637d9e4651b80cd16f7a02ed75846d02ce0a9e32b718ce644cdba3a83cdd","src/ffi/rustcalls.rs":"4a85a90b0d46974ab9e80e403a1cddaa252337b227e1a672bb6fdbbca5a66259","src/lib.rs":"83614739f8c0c939b217755cfde169a85608a52ea197f63f7850e5765e2c5f97","src/panichook.rs":"9f49c7994a8e5489c1105c488bb3f8c5571bc5f813e7be90441eca15da5c9851","src/testing.rs":"f287d682a8f27465838b2aba91993c635a4dcd281d802dc12c7c75794324123f","tests/ui/proc_macro_arc.rs":"d766dffee3fe6a93522d40f44a7f15592db141fd674034fa5f016e06f510e87b","tests/ui/proc_macro_arc.stderr":"9e7d098abdd47f249ff62fe0a2ee0f8b96282ec5a3be0c48a778baab4624180f","tests/ui/version_mismatch.rs":"16ea359e5853517ee0d0704c015ae8c825533109fbefd715130d0f4a51f15898","tests/ui/version_mismatch.stderr":"aadbd8f3847f5663022d8dd75d6afa3b25dfc8abccd30b386a681f98587d4ceb"},"package":"b983553c0d1ad73547c65fa0c399aa800bee4a70ad330198e1c7a523212da5ee"}
+\ No newline at end of file
+diff --git a/third_party/rust/uniffi/Cargo.toml b/third_party/rust/uniffi/Cargo.toml
+--- a/third_party/rust/uniffi/Cargo.toml
++++ b/third_party/rust/uniffi/Cargo.toml
+@@ -7,28 +7,27 @@
+ #
+ # If you are reading this file be aware that the original Cargo.toml
+ # will likely look very different (and much more reasonable).
+ # See Cargo.toml.orig for the original contents.
+
+ [package]
+ edition = "2021"
+ name = "uniffi"
+-version = "0.21.0"
++version = "0.21.1"
+ authors = ["Firefox Sync Team <sync-team@mozilla.com>"]
+ description = "a multi-language bindings generator for rust (runtime support code)"
+ homepage = "https://mozilla.github.io/uniffi-rs"
+ documentation = "https://mozilla.github.io/uniffi-rs"
+ keywords = [
+ "ffi",
+ "bindgen",
+ ]
+ license = "MPL-2.0"
+ repository = "https://github.com/mozilla/uniffi-rs"
+-resolver = "2"
+
+ [dependencies.anyhow]
+ version = "1"
+
+ [dependencies.bytes]
+ version = "1.0"
+
+ [dependencies.camino]
+@@ -45,20 +44,20 @@ version = "1.12"
+
+ [dependencies.paste]
+ version = "1.0"
+
+ [dependencies.static_assertions]
+ version = "1.1.0"
+
+ [dependencies.uniffi_bindgen]
+-version = "=0.21.0"
++version = "=0.21.1"
+ optional = true
+
+ [dependencies.uniffi_macros]
+-version = "=0.21.0"
++version = "=0.21.1"
+
+ [dev-dependencies.trybuild]
+ version = "1"
+
+ [features]
+ builtin-bindgen = ["uniffi_bindgen"]
+ default = []
+diff --git a/third_party/rust/uniffi_bindgen/.cargo-checksum.json b/third_party/rust/uniffi_bindgen/.cargo-checksum.json
+--- a/third_party/rust/uniffi_bindgen/.cargo-checksum.json
++++ b/third_party/rust/uniffi_bindgen/.cargo-checksum.json
+@@ -1,1 +1,1 @@
+-{"files":{"Cargo.lock":"5ed0714fd87076b5b5f11ca60553f12559e69794c2fec7d487a398f31a577a5f","Cargo.toml":"209b8cb7759ec813ee1e27a4b7e1d2bed2604c37d7c55578058bc7089ee9557e","askama.toml":"1a245b7803adca782837e125c49100147d2de0d5a1c949ff95e91af1701f6058","src/backend/config.rs":"4861dbf251dbb10beb1ed7e3eea7d79499a0de1cd9ce9ee8381a0e729c097dea","src/backend/declarations.rs":"12b8d6e651f84634de5cd02a47601965df7438f64f1a73f136bd89b6b5d515cf","src/backend/mod.rs":"899cd3b816d0467e35789b92ac3b8d5910f6dab98156d405db4803da8721fd36","src/backend/oracle.rs":"9e2b8a45af604a6e4952644e81f43f6aec6e0a1d03939c68b582529dd01a51e0","src/backend/types.rs":"7c49a92096a54eefd2336c48d60fe20ded9490142ab3a229a7c1a99fec14df3d","src/bindings/kotlin/gen_kotlin/callback_interface.rs":"b7fe795670830f3aa8a955c787b1127fe68313ee751013948527948fe5526b01","src/bindings/kotlin/gen_kotlin/compounds.rs":"d1e9a4237ff2ff711a3eae7a564c39e26f598c156ebfd34c0f04879e3533dd4f","src/bindings/kotlin/gen_kotlin/custom.rs":"4176f6ed5f66504f8fd981198bbfbae795dab5ef0d0281881d19b697f5560c44","src/bindings/kotlin/gen_kotlin/enum_.rs":"f85ae8dcb55c8f274139bf321af0ba237ae69894165ad6bd693d793f58af8e5e","src/bindings/kotlin/gen_kotlin/error.rs":"867f583aea5da7aabeb9b6d2544d7e52984cdea4aa008ce5f2ec941074735e1a","src/bindings/kotlin/gen_kotlin/external.rs":"1f7e91d7439891fe3c403274e35880ee4fc3a0da555510bdfa23c1ed2bbd8020","src/bindings/kotlin/gen_kotlin/miscellany.rs":"644ee5bb1f3619be5a36b2b3900af554ea38073cd054004f421e69c3cb8d50bc","src/bindings/kotlin/gen_kotlin/mod.rs":"90412e7927c284668a9eb75823c198182e58e5177d5561896c43b79367564b27","src/bindings/kotlin/gen_kotlin/object.rs":"6478a3e9d5e66186521730d0d481abd1ee4f123050ea050ac5a483842f08b003","src/bindings/kotlin/gen_kotlin/primitives.rs":"914d1f8253ed6a2937f67e8bd8f04f46aef4f22455ceb8a6caa84427adc2093e","src/bindings/kotlin/gen_kotlin/record.rs":"7961fcfbec5ebf8fc010b564ea4bd59402c919f6922898d48226d8c995569dd7","src/bindings/kotlin/mod.rs":"e68f2ea29e66ee62a56704e1e4464eea6d28bbdb52ab187bbe7a57ab3f362ea7","src/bindings/kotlin/templates/BooleanHelper.kt":"28e8a5088c8d58c9bfdbc575af8d8725060521fdd7d092684a8044b24ae567c7","src/bindings/kotlin/templates/CallbackInterfaceRuntime.kt":"6ede374b0fcbb3bcc939894e6f4729b3bec7ec7356831a60fba96ca38dc91aa8","src/bindings/kotlin/templates/CallbackInterfaceTemplate.kt":"5a704eb8c044ed22905e4d526ee3fc0b86f42fe82ac1eb4ad3758ad0552ea8c8","src/bindings/kotlin/templates/CustomTypeTemplate.kt":"5d4dacf29e89bcdcc46d155d993e6059d2df704e775dc853469310198253b231","src/bindings/kotlin/templates/DurationHelper.kt":"414a98161538a26f3a9b357353270c1f245ad6ceed99496aca7162cf473a92fd","src/bindings/kotlin/templates/EnumTemplate.kt":"ab3e2063aad3b91188db839dceb59b854a6a8b60fb35e545e270e64fee7c73fa","src/bindings/kotlin/templates/ErrorTemplate.kt":"a5ec2bdfc026838e1096dbf3301f21aa4ea22e8c93458d45bb1c8c7b9ee1fc5b","src/bindings/kotlin/templates/ExternalTypeTemplate.kt":"2097e0b830640ef18c79449ffa376d1dd35a8c4a5230e413c915f3b868aae872","src/bindings/kotlin/templates/FfiConverterTemplate.kt":"aa22962aaa9f641d48ccf44cb56d9f8a7736cbfaa01e1a1656662cfe5dd5c1d7","src/bindings/kotlin/templates/Float32Helper.kt":"662d95af3b629d143fb4d47cb7e9aa26ed28a5f3846de0341e28b0f9fb08bc25","src/bindings/kotlin/templates/Float64Helper.kt":"a77d099fa7d91e8702c1700e7949ffb6aaba9c6e8041ff48bab34b8e1fc9a0aa","src/bindings/kotlin/templates/Helpers.kt":"46c07798a26b53b06405c8bbbf86e3fcf38fadc1484ea04ce9d482defea89288","src/bindings/kotlin/templates/Int16Helper.kt":"7f83c4a48e1f3b2a59a3ca6a2662be8bc9baf3a5a748b31223cb3f51721ef249","src/bindings/kotlin/templates/Int32Helper.kt":"e02e4702175554b09fd2dd6ac3089dcd2c395f08ec60e762159566a9c9889450","src/bindings/kotlin/templates/Int64Helper.kt":"7a6fd6ca486852c89399c699935a9dfa1c32b9356d9a965cfde532581f05d9fa","src/bindings/kotlin/templates/Int8Helper.kt":"0554545494b6b9a76ce94f9c1723f8cf4230a13076feb75d620b1c9ca1ac4668","src/bindings/kotlin/templates/MapTemplate.kt":"399569d6443e8ad01e2deb95d78d8d2d15bf8eccee8be4fbe9ce4b8ebc0a6101","src/bindings/kotlin/templates/NamespaceLibraryTemplate.kt":"1eba4e77381155c2c96a6af2ef30fca881ade4957852f730fd10aa4f3d9cd3c4","src/bindings/kotlin/templates/ObjectRuntime.kt":"c11d233de41405caa55a56bcaa3bb69ce153ffa6fdff2aa218051929f5c4aeec","src/bindings/kotlin/templates/ObjectTemplate.kt":"7e32d92ec6116da9b7d7f278b15333a2fd2a82dde8c21534e3f6fe371d19f333","src/bindings/kotlin/templates/OptionalTemplate.kt":"5f9f2c1baa829ed3c9b61c3edb0f1fccf5ea3cccc052a69cf8966715d8fcf149","src/bindings/kotlin/templates/RecordTemplate.kt":"193ecdad9322fb5483b95bf2a259270a9b22ba054790794e9abb3fd219196bc5","src/bindings/kotlin/templates/RustBufferTemplate.kt":"415637f80a78c12b3d00db063c14a7ab5c61b098bdb1fc81a0be8bae9511776b","src/bindings/kotlin/templates/SequenceTemplate.kt":"786693b20c608a4f059b91df115278f5f12122b4c14a2e7ce18b6fc9b22b1296","src/bindings/kotlin/templates/StringHelper.kt":"060839663580d8199671b7c3bb3dce5e9106aa766ce2c6e0afc2d2bd788a1d83","src/bindings/kotlin/templates/TimestampHelper.kt":"353c2890f06ad6dda238e9aebb4bdff7bb838e17e46abf351ed3ff1fbc4e6580","src/bindings/kotlin/templates/TopLevelFunctionTemplate.kt":"09b8bb5ffea7075518ee657f83017d44ff0cbf584fd85676b082199139c9be09","src/bindings/kotlin/templates/Types.kt":"db7ed7384b4391a4bc1425ec3a89e0c890538ad30f5e115bae4998c059c8a21b","src/bindings/kotlin/templates/UInt16Helper.kt":"e84a1f30a5a899ba2c5db614d3f3c74f25bccf6dd99bf68b8830829332d051e9","src/bindings/kotlin/templates/UInt32Helper.kt":"7cdf08cc580046935f27ba07b53685968608a102e0a6be305111037c63d7ddf8","src/bindings/kotlin/templates/UInt64Helper.kt":"fd7baacbf3ab6202ff83edcc66e5f7beb11a10053ba66d0b49547616cc7cbe1f","src/bindings/kotlin/templates/UInt8Helper.kt":"bbf5a6d66c995aea9fe2fa9840c6bfa78b03520a09469b984f0e1d43191e453a","src/bindings/kotlin/templates/macros.kt":"eb5e0f9915b8ec9fbf3bf1a714625fbdcef7a7ee7461916e87fec872434ed3ec","src/bindings/kotlin/templates/wrapper.kt":"dd81cf28a4e07c685d29c87a4053eccb6339835cfc7fce3cf581d3d111fed4f5","src/bindings/mod.rs":"51ac55a3d505d5a88eedc83cf12623c2738277a9cd22bf3bbe05be1244de078b","src/bindings/python/gen_python/callback_interface.rs":"e3ffb8ba1aa8ac8ddcfff6554e7ec0d2d695d12955a98a04d114d2d6ca5dacc8","src/bindings/python/gen_python/compounds.rs":"e406c773c3b66368ea74973df742cdcba3014521812048f15de7c0e783eedfaf","src/bindings/python/gen_python/custom.rs":"33756f6bdafbd9b1a3a439c1cced3c83dc1fdb82b5ec235c064e69670ea6086c","src/bindings/python/gen_python/enum_.rs":"634c8406b07cbd24ea4f71cae4c971169e4989ce8019188f4bcd515bc3c77c5d","src/bindings/python/gen_python/error.rs":"d1a3b3edb91d9502064463cc3324770a1a6e0f234d6b49b5d7c43636bfe81d59","src/bindings/python/gen_python/external.rs":"8920b7a2a3b39a9647ec17cdff44308db3bfe9a582f026b060003edd76407599","src/bindings/python/gen_python/miscellany.rs":"f3898b75cf494b39662d886eb78d9cc06685650265fc8a1e87e5de67baa342ae","src/bindings/python/gen_python/mod.rs":"552de45cab20c4467bdcc774c305f298c9d7487c6b89f6786cb7ef1774ccddf6","src/bindings/python/gen_python/object.rs":"b4d3d8a935d4acd689cf1f3857d461dbab3a51c7c8bd821890198fb58ef3a63f","src/bindings/python/gen_python/primitives.rs":"928523bb91d2192d615d044f1fef3714681140562b740cf72dce3168e660e276","src/bindings/python/gen_python/record.rs":"f961dfe8dd1e5caa633754de7ecc684c2211c9b6633a5e6beb6053e60500b9f2","src/bindings/python/mod.rs":"bcf295b334b332c7fd1214ddfdaa727cfe37fed531c3862ce25906b3a70b71c7","src/bindings/python/templates/BooleanHelper.py":"d384ffeefcb5982c4875e819d06e919a295eaa9ff57735e6fef0801bb810d5c9","src/bindings/python/templates/CallbackInterfaceRuntime.py":"7ffef485fc008e2d9efcd07326102f300bd4673b4351353e9e2908355936c3d7","src/bindings/python/templates/CallbackInterfaceTemplate.py":"089b5cc1131e8c9b867c899cb649ce22eb9ba6a4addab4ebf9ba63316c394693","src/bindings/python/templates/CustomType.py":"db3309b3f944fb813d4cef47a04d67a86f824183f7e31289184683155fd985d9","src/bindings/python/templates/DurationHelper.py":"179c14dccd8cc7dc9791f896414f0b5d124ec116eb78173371bd8a0743208da1","src/bindings/python/templates/EnumTemplate.py":"825ca373286f1b3b252b8a1263e29c9e2f0d3e170ceb364bd6c28d6c4595597b","src/bindings/python/templates/ErrorTemplate.py":"b6b1b0d3fc074a7c3ba7db394c5d6cb3279b0fc0e6a331154303c2c6c907458b","src/bindings/python/templates/ExternalTemplate.py":"f582a6e872fe9f8275d33d36ffe017028ca459fe7c53aa680a2512718d0c0fda","src/bindings/python/templates/Float32Helper.py":"7dbc51889cff47ebf1600fad490849e4a87cac4fc0d1756eebd21609eb80b4a9","src/bindings/python/templates/Float64Helper.py":"ba9f334d1339b6eaedcacc1e35068939727170a684f41dec9ee04762ed98cec1","src/bindings/python/templates/Helpers.py":"68f03f651c38c810fa453e123e26f7c94b7a1f9178e0d863b985c3c8fabaa642","src/bindings/python/templates/Int16Helper.py":"60c22fb8b445841ebb3c68be11b81c9eba84a680eaa0e30770953361231da9b5","src/bindings/python/templates/Int32Helper.py":"aff0a017cf767394174e46d8c4fe5a5a704a8e6384fcc38d227634dfe7826916","src/bindings/python/templates/Int64Helper.py":"6c314b91699a6c6ad7db3ef636713bc2a0af9609c82acfd6062b0588177c0026","src/bindings/python/templates/Int8Helper.py":"a6e2d121b1a6d59886fceab3949e571aba1abc06dfede52666954bf15366fb6f","src/bindings/python/templates/MapTemplate.py":"bbe609b865010b98b38c58f2d4fcc97f2adec3e931903bf67263a5e440a84400","src/bindings/python/templates/NamespaceLibraryTemplate.py":"4726dbeb61508a71153436126bc04d03af966dca4f5b37511beb8bcfb6f1f307","src/bindings/python/templates/ObjectTemplate.py":"68302f6da6e4e80fc0cc8eb4ef2d4353d19ad3e9955112a2fabec8bf1b1293c7","src/bindings/python/templates/OptionalTemplate.py":"ab6da433370ba7c1316e266247ee1b7165bc02f6f288e40a7c68806c018e3282","src/bindings/python/templates/RecordTemplate.py":"98cef2adbc2b890e5c67257fb32a57380070988ef4112408eeca85e0b87b566b","src/bindings/python/templates/RustBufferHelper.py":"11f733051e63733c637fb19c4758cb58a40d045792028465f36891f89c7c5f36","src/bindings/python/templates/RustBufferTemplate.py":"90950cfeeb7a028aac9b65aeca897b217eddcfa165a0d59e8af037e834f34146","src/bindings/python/templates/SequenceTemplate.py":"faf2b1d5272a66258972d88c29d5b527cf9e589c8399e30f7ad5a0503133ce9b","src/bindings/python/templates/StringHelper.py":"941a7ad71d9598701efa15323df93766934583a55f4266d26db31e6b744603fc","src/bindings/python/templates/TimestampHelper.py":"b412cea69117858c05bae3210d378c6296658ed02a50e87c52c392dcb62c7892","src/bindings/python/templates/TopLevelFunctionTemplate.py":"2b2883b14f324e543cfeea5293d2a4907fa9ebe93b779da7174a58929d8b0442","src/bindings/python/templates/Types.py":"2eee78ca838f65b7e8ff8f760558c71ca80ad314aaa44efd1d1b8e13b349f1bc","src/bindings/python/templates/UInt16Helper.py":"06be5c9dacdf20e586f8236ed75cf2ca2470078fd8570843ea97c581b25bf860","src/bindings/python/templates/UInt32Helper.py":"41bb9bbf9b7be1060945e1267b1cc052585ec43696b1591f0ee779a0be0feaff","src/bindings/python/templates/UInt64Helper.py":"ba2825fc295a07292d9fb4aeebe74dabb9e6dbe505643e2347875ab12e511f31","src/bindings/python/templates/UInt8Helper.py":"dca5b3fc4a429fb233326224f85c4eccd3a7802ca9958ec309c7f197d59b4e3d","src/bindings/python/templates/macros.py":"3f02a32941e20aea15e136780c24c9695021dbcae08044c4f654f75aadcbd1e1","src/bindings/python/templates/wrapper.py":"627a6e18e72040909887261b8ad918c68104b15110df26b2205d7827c690e8c3","src/bindings/ruby/gen_ruby/mod.rs":"33ae9fc3f69e4c5b7bb6df41e53298f89934cee2bb6d7e7ea8488cefc9d06c03","src/bindings/ruby/gen_ruby/tests.rs":"7dcb86b08e643c43503f4cac6396833497f6988b004321c0067700ee29ffbf32","src/bindings/ruby/mod.rs":"f57fccdfc544210e8cc70e01e4991cee6e72d258ede9d2bb226baad24a3ef0d7","src/bindings/ruby/templates/EnumTemplate.rb":"5480edb347f5829e478d19474691babd72f37616ed846d519b5a61cb1d6cf047","src/bindings/ruby/templates/ErrorTemplate.rb":"147b2c3ff44c19624e7bf7b3a2a04b7badbba5743eaefa0d5e6c05943119c87e","src/bindings/ruby/templates/NamespaceLibraryTemplate.rb":"9b1454208bc83ef8f26aef33713d681e2284dbfea986ec0dd6c9b9c8b7d65e4a","src/bindings/ruby/templates/ObjectTemplate.rb":"c2d2fa2db62d48322b66b53888dcc6de2fc3e579a6b8d0a9f24029c18fffcbb5","src/bindings/ruby/templates/RecordTemplate.rb":"4aeff886928ca972e5dc9b799581b30c66a6f6dce446af3285dd3ed6b422dea9","src/bindings/ruby/templates/RustBufferBuilder.rb":"2ee5a4b97fe590de98ec2119b2dfe103bba75e15b5fb3c178fa51dfa662dfe2c","src/bindings/ruby/templates/RustBufferStream.rb":"ddfc38a6388bdddf8cc24bb6f1af948e4eef2d7ae2091a5130fee57cf53e5a7d","src/bindings/ruby/templates/RustBufferTemplate.rb":"8f37664f5436ba74ccdd801e16220f1b879d2fb56f51f5845b6047c92dc079f8","src/bindings/ruby/templates/TopLevelFunctionTemplate.rb":"88213e7e25bef664da939c04dd5621f438af735ffcb4d2d0c24a529538630069","src/bindings/ruby/templates/macros.rb":"d732a62291c78ccfbc3208227c1b57f6add723fad91b7e699d693e360840e1b0","src/bindings/ruby/templates/wrapper.rb":"542cdf46fb871e66089c9f008cf472cca411fe217d8c66a0a66776c35469aab5","src/bindings/swift/gen_swift/callback_interface.rs":"e331871ac6c9ac9b9533848fb6ddfcabc1e605970343cad307b6d86b72ebe96a","src/bindings/swift/gen_swift/compounds.rs":"f9e87b342f1f9a14295d87bad59d786d4c253a24d22900c2aba44816713718ae","src/bindings/swift/gen_swift/custom.rs":"45cdfa35ef7345dc353d0d2f3cebb17d726e90abdf5ef49422d6b2db65f8fd25","src/bindings/swift/gen_swift/enum_.rs":"018eea78ef85c9f8d715a5bc15c8273030d4f6ba297019949eb578c5cc6276fd","src/bindings/swift/gen_swift/error.rs":"bd95c3303e40f03a321f2cdc8e15a0251f4c7ddbc3c32c4c57eb9569db218488","src/bindings/swift/gen_swift/miscellany.rs":"66f16968f6cccc0b61c544e336a49b96218551731dcce566a176903c9afb3b57","src/bindings/swift/gen_swift/mod.rs":"1e8f98e05a5b03798c91ada854f6a4f2a0682c252143d63c16c6a06bd0419e4b","src/bindings/swift/gen_swift/object.rs":"072a44f484cc66694c57a9fa41ba50a531c9ce19738e11ce9df17cdfc007648f","src/bindings/swift/gen_swift/primitives.rs":"b37b8f3ad3aa7e769e6d465a31282e377f93cd69e4dcf39a56dc833f412ed412","src/bindings/swift/gen_swift/record.rs":"48296332960be3731b9139dc664d4b8a5d56d04cffa34dc995b62cf202b4dbfd","src/bindings/swift/mod.rs":"0ad4afd667ef17b3b577ded9a09cdaa5595afbdb24e7474c6b1e6a8e0a024593","src/bindings/swift/templates/BooleanHelper.swift":"f607928c4d598893421fe9c9f183bab2f23a877a07afeb123dbe90515249ec86","src/bindings/swift/templates/BridgingHeaderTemplate.h":"93a289e393ecdbe1bf986215c3b19d2aed7677d47f79b1833ce73cf6f8762e80","src/bindings/swift/templates/CallbackInterfaceRuntime.swift":"aac01eb4269151be9dde8c95ee8eba7e8d0841b3c2b1dbd88885f01ac64ee147","src/bindings/swift/templates/CallbackInterfaceTemplate.swift":"c9700f52e932556c59a9bfea68fc786746b7f321ff75c33d0a8c1565effaeef5","src/bindings/swift/templates/CustomType.swift":"fe6414f2ce3ea7b148742e2fecf2206d7e69935dd78d56e014aec70f4d6ad3ec","src/bindings/swift/templates/DurationHelper.swift":"bca4a6498b27fe0c877df3c7fbe148538eeda03e68d4e760a7c8a6a15f2067ff","src/bindings/swift/templates/EnumTemplate.swift":"e61bdf7949aa5a7b55a2c10c243e960f683c862e5977f06e7f5956646b4ccb49","src/bindings/swift/templates/ErrorTemplate.swift":"58fb5907d20b7a6db67b128e5f6350015278990fef5945be42477a5b5f82bb18","src/bindings/swift/templates/Float32Helper.swift":"6c1a4da059dd4c6c4392511c93fe9daf4ddeeab71e39afd122797b0e19254318","src/bindings/swift/templates/Float64Helper.swift":"f741568cdfb8e1421369a9a1dc845630a3a0e2dc2d6acf157afd80cd3ef5966f","src/bindings/swift/templates/Helpers.swift":"3cf3a5342a1ef0c7e078b0e58c32ae4437c4fb5dc41acbbd56b1128393c76602","src/bindings/swift/templates/Int16Helper.swift":"76eec2a54a65790c5959380cc9a7362b1e2e201632cccb789153c52e10c8dc4f","src/bindings/swift/templates/Int32Helper.swift":"5afc5e103bf637813fd4b77ab63e47ed38893525101a483218a339f222710061","src/bindings/swift/templates/Int64Helper.swift":"c1a6f6661ef1ad3bd00e8d0bf81adaa6539686eee2b481b046b76dbd87681adf","src/bindings/swift/templates/Int8Helper.swift":"bc46598c966e579cca22d336748c74cdce5674eaaaf75fc24e5fdaa36a43cf9c","src/bindings/swift/templates/MapTemplate.swift":"8b5a9cb41a1ad41b5566fbe3906a1449e5453289208a9fc6a611de1eb937142a","src/bindings/swift/templates/ModuleMapTemplate.modulemap":"99ad1e9bf550a21497296f9248ecd4385dd6d0b5892951d24cf990cdbf3eec2c","src/bindings/swift/templates/ObjectTemplate.swift":"98f744d7baf41e28d9184ae7e1aa9522b1bd951d507e0987879b11d7995782aa","src/bindings/swift/templates/OptionalTemplate.swift":"73f777d2df4fdf42daf0d6035436d168b0d5f0abc15153b97029bc305408f597","src/bindings/swift/templates/RecordTemplate.swift":"af0dc13b32d34254b4cfef3b74f52fd4611aa6c32e055e203414511fd3bbb00a","src/bindings/swift/templates/RustBufferTemplate.swift":"ed16f20cecd264f086c923cd92a5198f444aec99aad4d39e9012f09f530ca809","src/bindings/swift/templates/SequenceTemplate.swift":"977f1409909ff08018c0a80c1330737023b39a8f9fa9a13f5bf9ab4806cac199","src/bindings/swift/templates/StringHelper.swift":"b773c2b3a03f30338ff233881d1b0c0238831b812eff6eb9f0fafcb32ab0743a","src/bindings/swift/templates/TimestampHelper.swift":"6e22e370feae1199bff16bcc6f431decfb7700b02e6afdd84693a0c474eb045e","src/bindings/swift/templates/TopLevelFunctionTemplate.swift":"ca7fcbaa06ee31c7433fd6aa238b6c1135a843f469d9b4f37d4874d514fd80d0","src/bindings/swift/templates/Types.swift":"2f42430cb4ffba8e9b5084c0cf8790fb5bae151878134b8a21e745acf75d2b08","src/bindings/swift/templates/UInt16Helper.swift":"16adb3b50403dad114fad0b86bc220c5adc3bd987c57c290aee7c6407891dfbc","src/bindings/swift/templates/UInt32Helper.swift":"680ddd2815184f520723820f10698a089c222df0388bc0f7734c6d5234194aec","src/bindings/swift/templates/UInt64Helper.swift":"b752852162028a0c132f79f9005c47c263a4dab98833e86758cd7b467e305629","src/bindings/swift/templates/UInt8Helper.swift":"54f4821e704969eeb5c0e002b890d975a20eda3ddc3ee56169ee3c615dfa1079","src/bindings/swift/templates/macros.swift":"0744724c37419e894132b39aea4b8e1f473460583883fa37f38c787a7deea32c","src/bindings/swift/templates/wrapper.swift":"ca1af5fe47bca972c76fb8c9f52b18f727d4343204408de3dd0aae384f0a4171","src/interface/attributes.rs":"2f76377eebdd62e770bb9089885482a49a57e1f8405320bb778353f3e8974447","src/interface/callbacks.rs":"c9f4b97b21195ba2d1787f032f1daa5f4ce2fc40e014942e07e4eb37b5b95ee9","src/interface/enum_.rs":"1a7cda619a986a20fd4d0f145206aba2c500ce5dfca90d01e5324996fd68dc04","src/interface/error.rs":"f31fc0a7e41b4c8f4b81d06958fda14af6f05bfa318206098e0ec351cf4db809","src/interface/ffi.rs":"22d24e4dda327fa78c7632a6e5bbe374ecac0165acc550007feb729d8f4d6adf","src/interface/function.rs":"d6df6d8d412d7c45fe33c7337b37aeb851ae0f21834c4bd8b315aad4ca4ec309","src/interface/literal.rs":"3d2102cb47ff658f329d66d6c867b13a50e7f56535f23c1b414f857741360358","src/interface/mod.rs":"1d1993504ce61a2f578cb6fb42c79b7829a0767c20983581d631ee948819665e","src/interface/namespace.rs":"ab0f63241bb6a0a32f9fd2a1544468cb6daa1f91f6116b7246b52a4a94e4f461","src/interface/object.rs":"44836747d5d00bb40ecadb889c9a6ff32c1cbf625b5a6a337f5891f495fd92fd","src/interface/record.rs":"5859ea6c1f6c5524d1e6f3846954986710d5f74f1c6fd6324c4245b5f70013d5","src/interface/types/finder.rs":"a27f24e64b5bfc796378d1012b5e72001f0a442e8185fdc4430b106595d4b819","src/interface/types/mod.rs":"fe63c3fd233ad905af0358c5d610c85a5a57f263eb899acc756454a1029c4569","src/interface/types/resolver.rs":"7e7ce336ef77c0a6c23deea36856737a97cca9b1c3f5cd0d676fe7df6ade6480","src/lib.rs":"a41b43e3628bb6b3f725580eec255b409947945672887de87c21d5122775a245","src/macro_metadata/ci.rs":"0d6e53d2b5645dd3cc7d196bd3a32ee82c029e1adb9ae93708c27a3fa5c55a88","src/macro_metadata/extract.rs":"ec392692a4601343312f60937987fe460cfb40d2c63a6bb1531fe91903916f10","src/macro_metadata/mod.rs":"1668e6d947fd4a957f557410a8095649de6f8d7fd3eb6a403b8587280dca2d54","src/main.rs":"bbf8e9942d398387e7518533f9b9dc42bfa66156430a87a17605a80a356c0dea","src/scaffolding/mod.rs":"35ae72220843cf3cccefd96e190553e32a5f34ccc58d552fd9165faea12db260","src/scaffolding/templates/CallbackInterfaceTemplate.rs":"3c8caa2e148add8d80701894ee6904fc2d3c5c6424d6d414b36edb6f593b5023","src/scaffolding/templates/EnumTemplate.rs":"eb8802f04f1fd1c9451ad72c1195c136288fdb4e488922b24db75b2fdae65cd7","src/scaffolding/templates/ErrorTemplate.rs":"e7ca4538908a273dd7ba3834219b30fa0e537b2171144f06b6a96fbefb90cd1d","src/scaffolding/templates/ExternalTypesTemplate.rs":"8ecc805cf119abac8c5f60605f9183ee9ec8d37f9ec75bba5e18bb8b482a1abb","src/scaffolding/templates/ObjectTemplate.rs":"34de640428486e17a61ded4f42ce13d8eac3e66cc9f60196ce2575cdc0bd8df6","src/scaffolding/templates/RecordTemplate.rs":"e8d5af954f46f023a243721d6fc70aa176c3a4c0a9dd340048bfe46f3eeed783","src/scaffolding/templates/ReexportUniFFIScaffolding.rs":"559a17c8e39c473ff1effe9651f05b83d443ecd8abed13e03f2b63872d7e1593","src/scaffolding/templates/RustBuffer.rs":"ccf7521012d93c41265375c6d2e80ce861ec93b41383da83c37718386dd726f6","src/scaffolding/templates/TopLevelFunctionTemplate.rs":"35eaefb0862f25ff683d58fb0be6ad5f74bbe2fc85047273200c3a5f4c728434","src/scaffolding/templates/macros.rs":"a41c9690d411074c59fc4609f897431669b9d939625a08f5304a71a88901ba7c","src/scaffolding/templates/scaffolding_template.rs":"3589f8e8e1f9b194ff4a6245665d3a421c771dec3cc947c4264bfcd34573550e"},"package":"12cc4af3c0180c7e86c4a3acf2b6587af04ba2567b1e948993df10f421796621"}
+\ No newline at end of file
++{"files":{"Cargo.lock":"3b1693f0ada97ba7e0527d763402404b39fe341da22bd45aaf057e4be3fa3234","Cargo.toml":"58662147277f1620eccd6592f83623cf71959df8326e9d700fdaac47c6e6cf35","askama.toml":"1a245b7803adca782837e125c49100147d2de0d5a1c949ff95e91af1701f6058","src/backend/config.rs":"4861dbf251dbb10beb1ed7e3eea7d79499a0de1cd9ce9ee8381a0e729c097dea","src/backend/declarations.rs":"12b8d6e651f84634de5cd02a47601965df7438f64f1a73f136bd89b6b5d515cf","src/backend/mod.rs":"899cd3b816d0467e35789b92ac3b8d5910f6dab98156d405db4803da8721fd36","src/backend/oracle.rs":"9e2b8a45af604a6e4952644e81f43f6aec6e0a1d03939c68b582529dd01a51e0","src/backend/types.rs":"7c49a92096a54eefd2336c48d60fe20ded9490142ab3a229a7c1a99fec14df3d","src/bindings/kotlin/gen_kotlin/callback_interface.rs":"b7fe795670830f3aa8a955c787b1127fe68313ee751013948527948fe5526b01","src/bindings/kotlin/gen_kotlin/compounds.rs":"d1e9a4237ff2ff711a3eae7a564c39e26f598c156ebfd34c0f04879e3533dd4f","src/bindings/kotlin/gen_kotlin/custom.rs":"4176f6ed5f66504f8fd981198bbfbae795dab5ef0d0281881d19b697f5560c44","src/bindings/kotlin/gen_kotlin/enum_.rs":"f85ae8dcb55c8f274139bf321af0ba237ae69894165ad6bd693d793f58af8e5e","src/bindings/kotlin/gen_kotlin/error.rs":"867f583aea5da7aabeb9b6d2544d7e52984cdea4aa008ce5f2ec941074735e1a","src/bindings/kotlin/gen_kotlin/external.rs":"1f7e91d7439891fe3c403274e35880ee4fc3a0da555510bdfa23c1ed2bbd8020","src/bindings/kotlin/gen_kotlin/miscellany.rs":"644ee5bb1f3619be5a36b2b3900af554ea38073cd054004f421e69c3cb8d50bc","src/bindings/kotlin/gen_kotlin/mod.rs":"90412e7927c284668a9eb75823c198182e58e5177d5561896c43b79367564b27","src/bindings/kotlin/gen_kotlin/object.rs":"6478a3e9d5e66186521730d0d481abd1ee4f123050ea050ac5a483842f08b003","src/bindings/kotlin/gen_kotlin/primitives.rs":"914d1f8253ed6a2937f67e8bd8f04f46aef4f22455ceb8a6caa84427adc2093e","src/bindings/kotlin/gen_kotlin/record.rs":"7961fcfbec5ebf8fc010b564ea4bd59402c919f6922898d48226d8c995569dd7","src/bindings/kotlin/mod.rs":"e68f2ea29e66ee62a56704e1e4464eea6d28bbdb52ab187bbe7a57ab3f362ea7","src/bindings/kotlin/templates/BooleanHelper.kt":"28e8a5088c8d58c9bfdbc575af8d8725060521fdd7d092684a8044b24ae567c7","src/bindings/kotlin/templates/CallbackInterfaceRuntime.kt":"6ede374b0fcbb3bcc939894e6f4729b3bec7ec7356831a60fba96ca38dc91aa8","src/bindings/kotlin/templates/CallbackInterfaceTemplate.kt":"5a704eb8c044ed22905e4d526ee3fc0b86f42fe82ac1eb4ad3758ad0552ea8c8","src/bindings/kotlin/templates/CustomTypeTemplate.kt":"5d4dacf29e89bcdcc46d155d993e6059d2df704e775dc853469310198253b231","src/bindings/kotlin/templates/DurationHelper.kt":"414a98161538a26f3a9b357353270c1f245ad6ceed99496aca7162cf473a92fd","src/bindings/kotlin/templates/EnumTemplate.kt":"ab3e2063aad3b91188db839dceb59b854a6a8b60fb35e545e270e64fee7c73fa","src/bindings/kotlin/templates/ErrorTemplate.kt":"a5ec2bdfc026838e1096dbf3301f21aa4ea22e8c93458d45bb1c8c7b9ee1fc5b","src/bindings/kotlin/templates/ExternalTypeTemplate.kt":"2097e0b830640ef18c79449ffa376d1dd35a8c4a5230e413c915f3b868aae872","src/bindings/kotlin/templates/FfiConverterTemplate.kt":"aa22962aaa9f641d48ccf44cb56d9f8a7736cbfaa01e1a1656662cfe5dd5c1d7","src/bindings/kotlin/templates/Float32Helper.kt":"662d95af3b629d143fb4d47cb7e9aa26ed28a5f3846de0341e28b0f9fb08bc25","src/bindings/kotlin/templates/Float64Helper.kt":"a77d099fa7d91e8702c1700e7949ffb6aaba9c6e8041ff48bab34b8e1fc9a0aa","src/bindings/kotlin/templates/Helpers.kt":"46c07798a26b53b06405c8bbbf86e3fcf38fadc1484ea04ce9d482defea89288","src/bindings/kotlin/templates/Int16Helper.kt":"7f83c4a48e1f3b2a59a3ca6a2662be8bc9baf3a5a748b31223cb3f51721ef249","src/bindings/kotlin/templates/Int32Helper.kt":"e02e4702175554b09fd2dd6ac3089dcd2c395f08ec60e762159566a9c9889450","src/bindings/kotlin/templates/Int64Helper.kt":"7a6fd6ca486852c89399c699935a9dfa1c32b9356d9a965cfde532581f05d9fa","src/bindings/kotlin/templates/Int8Helper.kt":"0554545494b6b9a76ce94f9c1723f8cf4230a13076feb75d620b1c9ca1ac4668","src/bindings/kotlin/templates/MapTemplate.kt":"399569d6443e8ad01e2deb95d78d8d2d15bf8eccee8be4fbe9ce4b8ebc0a6101","src/bindings/kotlin/templates/NamespaceLibraryTemplate.kt":"1eba4e77381155c2c96a6af2ef30fca881ade4957852f730fd10aa4f3d9cd3c4","src/bindings/kotlin/templates/ObjectRuntime.kt":"c11d233de41405caa55a56bcaa3bb69ce153ffa6fdff2aa218051929f5c4aeec","src/bindings/kotlin/templates/ObjectTemplate.kt":"7e32d92ec6116da9b7d7f278b15333a2fd2a82dde8c21534e3f6fe371d19f333","src/bindings/kotlin/templates/OptionalTemplate.kt":"5f9f2c1baa829ed3c9b61c3edb0f1fccf5ea3cccc052a69cf8966715d8fcf149","src/bindings/kotlin/templates/RecordTemplate.kt":"193ecdad9322fb5483b95bf2a259270a9b22ba054790794e9abb3fd219196bc5","src/bindings/kotlin/templates/RustBufferTemplate.kt":"415637f80a78c12b3d00db063c14a7ab5c61b098bdb1fc81a0be8bae9511776b","src/bindings/kotlin/templates/SequenceTemplate.kt":"786693b20c608a4f059b91df115278f5f12122b4c14a2e7ce18b6fc9b22b1296","src/bindings/kotlin/templates/StringHelper.kt":"060839663580d8199671b7c3bb3dce5e9106aa766ce2c6e0afc2d2bd788a1d83","src/bindings/kotlin/templates/TimestampHelper.kt":"353c2890f06ad6dda238e9aebb4bdff7bb838e17e46abf351ed3ff1fbc4e6580","src/bindings/kotlin/templates/TopLevelFunctionTemplate.kt":"09b8bb5ffea7075518ee657f83017d44ff0cbf584fd85676b082199139c9be09","src/bindings/kotlin/templates/Types.kt":"db7ed7384b4391a4bc1425ec3a89e0c890538ad30f5e115bae4998c059c8a21b","src/bindings/kotlin/templates/UInt16Helper.kt":"e84a1f30a5a899ba2c5db614d3f3c74f25bccf6dd99bf68b8830829332d051e9","src/bindings/kotlin/templates/UInt32Helper.kt":"7cdf08cc580046935f27ba07b53685968608a102e0a6be305111037c63d7ddf8","src/bindings/kotlin/templates/UInt64Helper.kt":"fd7baacbf3ab6202ff83edcc66e5f7beb11a10053ba66d0b49547616cc7cbe1f","src/bindings/kotlin/templates/UInt8Helper.kt":"bbf5a6d66c995aea9fe2fa9840c6bfa78b03520a09469b984f0e1d43191e453a","src/bindings/kotlin/templates/macros.kt":"eb5e0f9915b8ec9fbf3bf1a714625fbdcef7a7ee7461916e87fec872434ed3ec","src/bindings/kotlin/templates/wrapper.kt":"dd81cf28a4e07c685d29c87a4053eccb6339835cfc7fce3cf581d3d111fed4f5","src/bindings/mod.rs":"51ac55a3d505d5a88eedc83cf12623c2738277a9cd22bf3bbe05be1244de078b","src/bindings/python/gen_python/callback_interface.rs":"e3ffb8ba1aa8ac8ddcfff6554e7ec0d2d695d12955a98a04d114d2d6ca5dacc8","src/bindings/python/gen_python/compounds.rs":"e406c773c3b66368ea74973df742cdcba3014521812048f15de7c0e783eedfaf","src/bindings/python/gen_python/custom.rs":"33756f6bdafbd9b1a3a439c1cced3c83dc1fdb82b5ec235c064e69670ea6086c","src/bindings/python/gen_python/enum_.rs":"634c8406b07cbd24ea4f71cae4c971169e4989ce8019188f4bcd515bc3c77c5d","src/bindings/python/gen_python/error.rs":"d1a3b3edb91d9502064463cc3324770a1a6e0f234d6b49b5d7c43636bfe81d59","src/bindings/python/gen_python/external.rs":"8920b7a2a3b39a9647ec17cdff44308db3bfe9a582f026b060003edd76407599","src/bindings/python/gen_python/miscellany.rs":"f3898b75cf494b39662d886eb78d9cc06685650265fc8a1e87e5de67baa342ae","src/bindings/python/gen_python/mod.rs":"552de45cab20c4467bdcc774c305f298c9d7487c6b89f6786cb7ef1774ccddf6","src/bindings/python/gen_python/object.rs":"b4d3d8a935d4acd689cf1f3857d461dbab3a51c7c8bd821890198fb58ef3a63f","src/bindings/python/gen_python/primitives.rs":"928523bb91d2192d615d044f1fef3714681140562b740cf72dce3168e660e276","src/bindings/python/gen_python/record.rs":"f961dfe8dd1e5caa633754de7ecc684c2211c9b6633a5e6beb6053e60500b9f2","src/bindings/python/mod.rs":"bcf295b334b332c7fd1214ddfdaa727cfe37fed531c3862ce25906b3a70b71c7","src/bindings/python/templates/BooleanHelper.py":"d384ffeefcb5982c4875e819d06e919a295eaa9ff57735e6fef0801bb810d5c9","src/bindings/python/templates/CallbackInterfaceRuntime.py":"7ffef485fc008e2d9efcd07326102f300bd4673b4351353e9e2908355936c3d7","src/bindings/python/templates/CallbackInterfaceTemplate.py":"089b5cc1131e8c9b867c899cb649ce22eb9ba6a4addab4ebf9ba63316c394693","src/bindings/python/templates/CustomType.py":"db3309b3f944fb813d4cef47a04d67a86f824183f7e31289184683155fd985d9","src/bindings/python/templates/DurationHelper.py":"179c14dccd8cc7dc9791f896414f0b5d124ec116eb78173371bd8a0743208da1","src/bindings/python/templates/EnumTemplate.py":"825ca373286f1b3b252b8a1263e29c9e2f0d3e170ceb364bd6c28d6c4595597b","src/bindings/python/templates/ErrorTemplate.py":"b6b1b0d3fc074a7c3ba7db394c5d6cb3279b0fc0e6a331154303c2c6c907458b","src/bindings/python/templates/ExternalTemplate.py":"f582a6e872fe9f8275d33d36ffe017028ca459fe7c53aa680a2512718d0c0fda","src/bindings/python/templates/Float32Helper.py":"7dbc51889cff47ebf1600fad490849e4a87cac4fc0d1756eebd21609eb80b4a9","src/bindings/python/templates/Float64Helper.py":"ba9f334d1339b6eaedcacc1e35068939727170a684f41dec9ee04762ed98cec1","src/bindings/python/templates/Helpers.py":"68f03f651c38c810fa453e123e26f7c94b7a1f9178e0d863b985c3c8fabaa642","src/bindings/python/templates/Int16Helper.py":"60c22fb8b445841ebb3c68be11b81c9eba84a680eaa0e30770953361231da9b5","src/bindings/python/templates/Int32Helper.py":"aff0a017cf767394174e46d8c4fe5a5a704a8e6384fcc38d227634dfe7826916","src/bindings/python/templates/Int64Helper.py":"6c314b91699a6c6ad7db3ef636713bc2a0af9609c82acfd6062b0588177c0026","src/bindings/python/templates/Int8Helper.py":"a6e2d121b1a6d59886fceab3949e571aba1abc06dfede52666954bf15366fb6f","src/bindings/python/templates/MapTemplate.py":"bbe609b865010b98b38c58f2d4fcc97f2adec3e931903bf67263a5e440a84400","src/bindings/python/templates/NamespaceLibraryTemplate.py":"4726dbeb61508a71153436126bc04d03af966dca4f5b37511beb8bcfb6f1f307","src/bindings/python/templates/ObjectTemplate.py":"68302f6da6e4e80fc0cc8eb4ef2d4353d19ad3e9955112a2fabec8bf1b1293c7","src/bindings/python/templates/OptionalTemplate.py":"ab6da433370ba7c1316e266247ee1b7165bc02f6f288e40a7c68806c018e3282","src/bindings/python/templates/RecordTemplate.py":"98cef2adbc2b890e5c67257fb32a57380070988ef4112408eeca85e0b87b566b","src/bindings/python/templates/RustBufferHelper.py":"11f733051e63733c637fb19c4758cb58a40d045792028465f36891f89c7c5f36","src/bindings/python/templates/RustBufferTemplate.py":"90950cfeeb7a028aac9b65aeca897b217eddcfa165a0d59e8af037e834f34146","src/bindings/python/templates/SequenceTemplate.py":"faf2b1d5272a66258972d88c29d5b527cf9e589c8399e30f7ad5a0503133ce9b","src/bindings/python/templates/StringHelper.py":"941a7ad71d9598701efa15323df93766934583a55f4266d26db31e6b744603fc","src/bindings/python/templates/TimestampHelper.py":"b412cea69117858c05bae3210d378c6296658ed02a50e87c52c392dcb62c7892","src/bindings/python/templates/TopLevelFunctionTemplate.py":"2b2883b14f324e543cfeea5293d2a4907fa9ebe93b779da7174a58929d8b0442","src/bindings/python/templates/Types.py":"2eee78ca838f65b7e8ff8f760558c71ca80ad314aaa44efd1d1b8e13b349f1bc","src/bindings/python/templates/UInt16Helper.py":"06be5c9dacdf20e586f8236ed75cf2ca2470078fd8570843ea97c581b25bf860","src/bindings/python/templates/UInt32Helper.py":"41bb9bbf9b7be1060945e1267b1cc052585ec43696b1591f0ee779a0be0feaff","src/bindings/python/templates/UInt64Helper.py":"ba2825fc295a07292d9fb4aeebe74dabb9e6dbe505643e2347875ab12e511f31","src/bindings/python/templates/UInt8Helper.py":"dca5b3fc4a429fb233326224f85c4eccd3a7802ca9958ec309c7f197d59b4e3d","src/bindings/python/templates/macros.py":"3f02a32941e20aea15e136780c24c9695021dbcae08044c4f654f75aadcbd1e1","src/bindings/python/templates/wrapper.py":"627a6e18e72040909887261b8ad918c68104b15110df26b2205d7827c690e8c3","src/bindings/ruby/gen_ruby/mod.rs":"33ae9fc3f69e4c5b7bb6df41e53298f89934cee2bb6d7e7ea8488cefc9d06c03","src/bindings/ruby/gen_ruby/tests.rs":"7dcb86b08e643c43503f4cac6396833497f6988b004321c0067700ee29ffbf32","src/bindings/ruby/mod.rs":"f57fccdfc544210e8cc70e01e4991cee6e72d258ede9d2bb226baad24a3ef0d7","src/bindings/ruby/templates/EnumTemplate.rb":"5480edb347f5829e478d19474691babd72f37616ed846d519b5a61cb1d6cf047","src/bindings/ruby/templates/ErrorTemplate.rb":"147b2c3ff44c19624e7bf7b3a2a04b7badbba5743eaefa0d5e6c05943119c87e","src/bindings/ruby/templates/NamespaceLibraryTemplate.rb":"9b1454208bc83ef8f26aef33713d681e2284dbfea986ec0dd6c9b9c8b7d65e4a","src/bindings/ruby/templates/ObjectTemplate.rb":"c2d2fa2db62d48322b66b53888dcc6de2fc3e579a6b8d0a9f24029c18fffcbb5","src/bindings/ruby/templates/RecordTemplate.rb":"4aeff886928ca972e5dc9b799581b30c66a6f6dce446af3285dd3ed6b422dea9","src/bindings/ruby/templates/RustBufferBuilder.rb":"2ee5a4b97fe590de98ec2119b2dfe103bba75e15b5fb3c178fa51dfa662dfe2c","src/bindings/ruby/templates/RustBufferStream.rb":"ddfc38a6388bdddf8cc24bb6f1af948e4eef2d7ae2091a5130fee57cf53e5a7d","src/bindings/ruby/templates/RustBufferTemplate.rb":"8f37664f5436ba74ccdd801e16220f1b879d2fb56f51f5845b6047c92dc079f8","src/bindings/ruby/templates/TopLevelFunctionTemplate.rb":"88213e7e25bef664da939c04dd5621f438af735ffcb4d2d0c24a529538630069","src/bindings/ruby/templates/macros.rb":"d732a62291c78ccfbc3208227c1b57f6add723fad91b7e699d693e360840e1b0","src/bindings/ruby/templates/wrapper.rb":"542cdf46fb871e66089c9f008cf472cca411fe217d8c66a0a66776c35469aab5","src/bindings/swift/gen_swift/callback_interface.rs":"e331871ac6c9ac9b9533848fb6ddfcabc1e605970343cad307b6d86b72ebe96a","src/bindings/swift/gen_swift/compounds.rs":"f9e87b342f1f9a14295d87bad59d786d4c253a24d22900c2aba44816713718ae","src/bindings/swift/gen_swift/custom.rs":"45cdfa35ef7345dc353d0d2f3cebb17d726e90abdf5ef49422d6b2db65f8fd25","src/bindings/swift/gen_swift/enum_.rs":"018eea78ef85c9f8d715a5bc15c8273030d4f6ba297019949eb578c5cc6276fd","src/bindings/swift/gen_swift/error.rs":"bd95c3303e40f03a321f2cdc8e15a0251f4c7ddbc3c32c4c57eb9569db218488","src/bindings/swift/gen_swift/miscellany.rs":"66f16968f6cccc0b61c544e336a49b96218551731dcce566a176903c9afb3b57","src/bindings/swift/gen_swift/mod.rs":"1e8f98e05a5b03798c91ada854f6a4f2a0682c252143d63c16c6a06bd0419e4b","src/bindings/swift/gen_swift/object.rs":"072a44f484cc66694c57a9fa41ba50a531c9ce19738e11ce9df17cdfc007648f","src/bindings/swift/gen_swift/primitives.rs":"b37b8f3ad3aa7e769e6d465a31282e377f93cd69e4dcf39a56dc833f412ed412","src/bindings/swift/gen_swift/record.rs":"48296332960be3731b9139dc664d4b8a5d56d04cffa34dc995b62cf202b4dbfd","src/bindings/swift/mod.rs":"0ad4afd667ef17b3b577ded9a09cdaa5595afbdb24e7474c6b1e6a8e0a024593","src/bindings/swift/templates/BooleanHelper.swift":"f607928c4d598893421fe9c9f183bab2f23a877a07afeb123dbe90515249ec86","src/bindings/swift/templates/BridgingHeaderTemplate.h":"93a289e393ecdbe1bf986215c3b19d2aed7677d47f79b1833ce73cf6f8762e80","src/bindings/swift/templates/CallbackInterfaceRuntime.swift":"aac01eb4269151be9dde8c95ee8eba7e8d0841b3c2b1dbd88885f01ac64ee147","src/bindings/swift/templates/CallbackInterfaceTemplate.swift":"c9700f52e932556c59a9bfea68fc786746b7f321ff75c33d0a8c1565effaeef5","src/bindings/swift/templates/CustomType.swift":"fe6414f2ce3ea7b148742e2fecf2206d7e69935dd78d56e014aec70f4d6ad3ec","src/bindings/swift/templates/DurationHelper.swift":"bca4a6498b27fe0c877df3c7fbe148538eeda03e68d4e760a7c8a6a15f2067ff","src/bindings/swift/templates/EnumTemplate.swift":"e61bdf7949aa5a7b55a2c10c243e960f683c862e5977f06e7f5956646b4ccb49","src/bindings/swift/templates/ErrorTemplate.swift":"58fb5907d20b7a6db67b128e5f6350015278990fef5945be42477a5b5f82bb18","src/bindings/swift/templates/Float32Helper.swift":"6c1a4da059dd4c6c4392511c93fe9daf4ddeeab71e39afd122797b0e19254318","src/bindings/swift/templates/Float64Helper.swift":"f741568cdfb8e1421369a9a1dc845630a3a0e2dc2d6acf157afd80cd3ef5966f","src/bindings/swift/templates/Helpers.swift":"3cf3a5342a1ef0c7e078b0e58c32ae4437c4fb5dc41acbbd56b1128393c76602","src/bindings/swift/templates/Int16Helper.swift":"76eec2a54a65790c5959380cc9a7362b1e2e201632cccb789153c52e10c8dc4f","src/bindings/swift/templates/Int32Helper.swift":"5afc5e103bf637813fd4b77ab63e47ed38893525101a483218a339f222710061","src/bindings/swift/templates/Int64Helper.swift":"c1a6f6661ef1ad3bd00e8d0bf81adaa6539686eee2b481b046b76dbd87681adf","src/bindings/swift/templates/Int8Helper.swift":"bc46598c966e579cca22d336748c74cdce5674eaaaf75fc24e5fdaa36a43cf9c","src/bindings/swift/templates/MapTemplate.swift":"8b5a9cb41a1ad41b5566fbe3906a1449e5453289208a9fc6a611de1eb937142a","src/bindings/swift/templates/ModuleMapTemplate.modulemap":"99ad1e9bf550a21497296f9248ecd4385dd6d0b5892951d24cf990cdbf3eec2c","src/bindings/swift/templates/ObjectTemplate.swift":"98f744d7baf41e28d9184ae7e1aa9522b1bd951d507e0987879b11d7995782aa","src/bindings/swift/templates/OptionalTemplate.swift":"73f777d2df4fdf42daf0d6035436d168b0d5f0abc15153b97029bc305408f597","src/bindings/swift/templates/RecordTemplate.swift":"af0dc13b32d34254b4cfef3b74f52fd4611aa6c32e055e203414511fd3bbb00a","src/bindings/swift/templates/RustBufferTemplate.swift":"ed16f20cecd264f086c923cd92a5198f444aec99aad4d39e9012f09f530ca809","src/bindings/swift/templates/SequenceTemplate.swift":"977f1409909ff08018c0a80c1330737023b39a8f9fa9a13f5bf9ab4806cac199","src/bindings/swift/templates/StringHelper.swift":"b773c2b3a03f30338ff233881d1b0c0238831b812eff6eb9f0fafcb32ab0743a","src/bindings/swift/templates/TimestampHelper.swift":"6e22e370feae1199bff16bcc6f431decfb7700b02e6afdd84693a0c474eb045e","src/bindings/swift/templates/TopLevelFunctionTemplate.swift":"ca7fcbaa06ee31c7433fd6aa238b6c1135a843f469d9b4f37d4874d514fd80d0","src/bindings/swift/templates/Types.swift":"2f42430cb4ffba8e9b5084c0cf8790fb5bae151878134b8a21e745acf75d2b08","src/bindings/swift/templates/UInt16Helper.swift":"16adb3b50403dad114fad0b86bc220c5adc3bd987c57c290aee7c6407891dfbc","src/bindings/swift/templates/UInt32Helper.swift":"680ddd2815184f520723820f10698a089c222df0388bc0f7734c6d5234194aec","src/bindings/swift/templates/UInt64Helper.swift":"b752852162028a0c132f79f9005c47c263a4dab98833e86758cd7b467e305629","src/bindings/swift/templates/UInt8Helper.swift":"54f4821e704969eeb5c0e002b890d975a20eda3ddc3ee56169ee3c615dfa1079","src/bindings/swift/templates/macros.swift":"0744724c37419e894132b39aea4b8e1f473460583883fa37f38c787a7deea32c","src/bindings/swift/templates/wrapper.swift":"ca1af5fe47bca972c76fb8c9f52b18f727d4343204408de3dd0aae384f0a4171","src/interface/attributes.rs":"6c062b60deb332fbb76e70bc675e65c2bc3f2060fad7cec87492609fa9ce166c","src/interface/callbacks.rs":"e311fe8c80fae1d84c1e867a3c36a47a6d6a41847bb2d633edefac7c69402c84","src/interface/enum_.rs":"4ff34ff12c19be0bc9d807020fd4c8e20660c418741e68408671a18165e4b95b","src/interface/error.rs":"85a61e5bb38b369b60110928a78dc84ae77a06d0cbae4dfe9ff9dff2b8c27e5a","src/interface/ffi.rs":"22d24e4dda327fa78c7632a6e5bbe374ecac0165acc550007feb729d8f4d6adf","src/interface/function.rs":"19219c6c984d4117362ee5c269712ec2ad462476902442062ef2a3b0619b014c","src/interface/literal.rs":"d93d168176ba2824d26c490396f4baffc1d418c3c94e4a1ef0ceb3cfca16a239","src/interface/mod.rs":"88dd169859004da79bd1488e6432bc7dae8b6cba9238cab1d676e570dad31d62","src/interface/namespace.rs":"ab0f63241bb6a0a32f9fd2a1544468cb6daa1f91f6116b7246b52a4a94e4f461","src/interface/object.rs":"106cbf5ec2a684700dd99c9748ba161320abb2cecec3c5022d5dd1a9ec4f5b85","src/interface/record.rs":"5b9db093c0c90f5c757e09e6c9afee6b99e2e724c7b388924990b1a6f46357e9","src/interface/types/finder.rs":"a27f24e64b5bfc796378d1012b5e72001f0a442e8185fdc4430b106595d4b819","src/interface/types/mod.rs":"25a598fd206975cc1e62aaa269b461654c913ad6c0b6a2719c486acfcc68b45b","src/interface/types/resolver.rs":"7e7ce336ef77c0a6c23deea36856737a97cca9b1c3f5cd0d676fe7df6ade6480","src/lib.rs":"a41b43e3628bb6b3f725580eec255b409947945672887de87c21d5122775a245","src/macro_metadata/ci.rs":"0d6e53d2b5645dd3cc7d196bd3a32ee82c029e1adb9ae93708c27a3fa5c55a88","src/macro_metadata/extract.rs":"ec392692a4601343312f60937987fe460cfb40d2c63a6bb1531fe91903916f10","src/macro_metadata/mod.rs":"1668e6d947fd4a957f557410a8095649de6f8d7fd3eb6a403b8587280dca2d54","src/main.rs":"bbf8e9942d398387e7518533f9b9dc42bfa66156430a87a17605a80a356c0dea","src/scaffolding/mod.rs":"35ae72220843cf3cccefd96e190553e32a5f34ccc58d552fd9165faea12db260","src/scaffolding/templates/CallbackInterfaceTemplate.rs":"3c8caa2e148add8d80701894ee6904fc2d3c5c6424d6d414b36edb6f593b5023","src/scaffolding/templates/EnumTemplate.rs":"eb8802f04f1fd1c9451ad72c1195c136288fdb4e488922b24db75b2fdae65cd7","src/scaffolding/templates/ErrorTemplate.rs":"e7ca4538908a273dd7ba3834219b30fa0e537b2171144f06b6a96fbefb90cd1d","src/scaffolding/templates/ExternalTypesTemplate.rs":"8ecc805cf119abac8c5f60605f9183ee9ec8d37f9ec75bba5e18bb8b482a1abb","src/scaffolding/templates/ObjectTemplate.rs":"34de640428486e17a61ded4f42ce13d8eac3e66cc9f60196ce2575cdc0bd8df6","src/scaffolding/templates/RecordTemplate.rs":"e8d5af954f46f023a243721d6fc70aa176c3a4c0a9dd340048bfe46f3eeed783","src/scaffolding/templates/ReexportUniFFIScaffolding.rs":"559a17c8e39c473ff1effe9651f05b83d443ecd8abed13e03f2b63872d7e1593","src/scaffolding/templates/RustBuffer.rs":"ccf7521012d93c41265375c6d2e80ce861ec93b41383da83c37718386dd726f6","src/scaffolding/templates/TopLevelFunctionTemplate.rs":"35eaefb0862f25ff683d58fb0be6ad5f74bbe2fc85047273200c3a5f4c728434","src/scaffolding/templates/macros.rs":"a41c9690d411074c59fc4609f897431669b9d939625a08f5304a71a88901ba7c","src/scaffolding/templates/scaffolding_template.rs":"3589f8e8e1f9b194ff4a6245665d3a421c771dec3cc947c4264bfcd34573550e"},"package":"5d46080a4840abccf7c0cce21931dae53215cbd7dd969b5e63c486235ce91a2a"}
+\ No newline at end of file
+diff --git a/third_party/rust/uniffi_bindgen/Cargo.lock b/third_party/rust/uniffi_bindgen/Cargo.lock
+--- a/third_party/rust/uniffi_bindgen/Cargo.lock
++++ b/third_party/rust/uniffi_bindgen/Cargo.lock
+@@ -1,17 +1,17 @@
+ # This file is automatically @generated by Cargo.
+ # It is not intended for manual editing.
+ version = 3
+
+ [[package]]
+ name = "anyhow"
+-version = "1.0.65"
++version = "1.0.66"
+ source = "registry+https://github.com/rust-lang/crates.io-index"
+-checksum = "98161a4e3e2184da77bb14f02184cdd111e83bbbcc9979dfee3c44b9a85f5602"
++checksum = "216261ddc8289130e551ddcd5ce8a064710c0d064a4d2895c67151c92b5443f6"
+
+ [[package]]
+ name = "askama"
+ version = "0.11.1"
+ source = "registry+https://github.com/rust-lang/crates.io-index"
+ checksum = "fb98f10f371286b177db5eeb9a6e5396609555686a35e1d4f7b9a9c6d8af0139"
+ dependencies = [
+ "askama_derive",
+@@ -94,19 +94,19 @@ checksum = "88ad0e1e3e88dd237a156ab9f571
+ [[package]]
+ name = "cfg-if"
+ version = "1.0.0"
+ source = "registry+https://github.com/rust-lang/crates.io-index"
+ checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd"
+
+ [[package]]
+ name = "clap"
+-version = "3.2.22"
++version = "3.2.23"
+ source = "registry+https://github.com/rust-lang/crates.io-index"
+-checksum = "86447ad904c7fb335a790c9d7fe3d0d971dc523b8ccd1561a520de9a85302750"
++checksum = "71655c45cb9845d3270c9d6df84ebe72b4dad3c2ba3f7023ad47c144e4e473a5"
+ dependencies = [
+ "atty",
+ "bitflags",
+ "clap_derive",
+ "clap_lex",
+ "indexmap",
+ "once_cell",
+ "strsim",
+@@ -133,19 +133,19 @@ version = "0.2.4"
+ source = "registry+https://github.com/rust-lang/crates.io-index"
+ checksum = "2850f2f5a82cbf437dd5af4d49848fbdfc27c157c3d010345776f952765261c5"
+ dependencies = [
+ "os_str_bytes",
+ ]
+
+ [[package]]
+ name = "fs-err"
+-version = "2.8.1"
++version = "2.9.0"
+ source = "registry+https://github.com/rust-lang/crates.io-index"
+-checksum = "64db3e262960f0662f43a6366788d5f10f7f244b8f7d7d987f560baf5ded5c50"
++checksum = "0845fa252299212f0389d64ba26f34fa32cfe41588355f21ed507c59a0f64541"
+
+ [[package]]
+ name = "goblin"
+ version = "0.5.4"
+ source = "registry+https://github.com/rust-lang/crates.io-index"
+ checksum = "a7666983ed0dd8d21a6f6576ee00053ca0926fb281a5522577a4dbd0f1b54143"
+ dependencies = [
+ "log",
+@@ -171,35 +171,35 @@ version = "0.1.19"
+ source = "registry+https://github.com/rust-lang/crates.io-index"
+ checksum = "62b467343b94ba476dcb2500d242dadbb39557df889310ac77c5d99100aaac33"
+ dependencies = [
+ "libc",
+ ]
+
+ [[package]]
+ name = "indexmap"
+-version = "1.9.1"
++version = "1.9.2"
+ source = "registry+https://github.com/rust-lang/crates.io-index"
+-checksum = "10a35a97730320ffe8e2d410b5d3b69279b98d2c14bdb8b70ea89ecf7888d41e"
++checksum = "1885e79c1fc4b10f0e172c475f458b7f7b93061064d98c3293e98c5ba0c8b399"
+ dependencies = [
+ "autocfg",
+ "hashbrown",
+ ]
+
+ [[package]]
+ name = "itoa"
+ version = "1.0.4"
+ source = "registry+https://github.com/rust-lang/crates.io-index"
+ checksum = "4217ad341ebadf8d8e724e264f13e593e0648f5b3e94b3896a5df283be015ecc"
+
+ [[package]]
+ name = "libc"
+-version = "0.2.135"
++version = "0.2.138"
+ source = "registry+https://github.com/rust-lang/crates.io-index"
+-checksum = "68783febc7782c6c5cb401fbda4de5a9898be1762314da0bb2c10ced61f18b0c"
++checksum = "db6d7e329c562c5dfab7a46a2afabc8b987ab9a4834c9d1ca04dc54c1546cef8"
+
+ [[package]]
+ name = "log"
+ version = "0.4.17"
+ source = "registry+https://github.com/rust-lang/crates.io-index"
+ checksum = "abb12e687cfb44aa40f41fc3978ef76448f9b6038cad6aef4259d3c095a2382e"
+ dependencies = [
+ "cfg-if",
+@@ -240,31 +240,31 @@ source = "registry+https://github.com/ru
+ checksum = "a8903e5a29a317527874d0402f867152a3d21c908bb0b933e416c65e301d4c36"
+ dependencies = [
+ "memchr",
+ "minimal-lexical",
+ ]
+
+ [[package]]
+ name = "once_cell"
+-version = "1.15.0"
++version = "1.16.0"
+ source = "registry+https://github.com/rust-lang/crates.io-index"
+-checksum = "e82dad04139b71a90c080c8463fe0dc7902db5192d939bd0950f074d014339e1"
++checksum = "86f0b0d4bf799edbc74508c1e8bf170ff5f41238e5f8225603ca7caaae2b7860"
+
+ [[package]]
+ name = "os_str_bytes"
+-version = "6.3.0"
++version = "6.4.1"
+ source = "registry+https://github.com/rust-lang/crates.io-index"
+-checksum = "9ff7415e9ae3fff1225851df9e0d9e4e5479f947619774677a63572e55e80eff"
++checksum = "9b7820b9daea5457c9f21c69448905d723fbd21136ccf521748f23fd49e723ee"
+
+ [[package]]
+ name = "paste"
+-version = "1.0.9"
++version = "1.0.10"
+ source = "registry+https://github.com/rust-lang/crates.io-index"
+-checksum = "b1de2e551fb905ac83f73f7aedf2f0cb4a0da7e35efa24a202a936269f1f18e1"
++checksum = "cf1c2c742266c2f1041c914ba65355a83ae8747b05f208319784083583494b4b"
+
+ [[package]]
+ name = "plain"
+ version = "0.2.3"
+ source = "registry+https://github.com/rust-lang/crates.io-index"
+ checksum = "b4596b6d070b27117e987119b4dac604f3c58cfb0b191112e24771b2faeac1a6"
+
+ [[package]]
+@@ -288,19 +288,19 @@ checksum = "a1be40180e52ecc98ad80b184934
+ dependencies = [
+ "proc-macro2",
+ "quote",
+ "version_check",
+ ]
+
+ [[package]]
+ name = "proc-macro2"
+-version = "1.0.46"
++version = "1.0.47"
+ source = "registry+https://github.com/rust-lang/crates.io-index"
+-checksum = "94e2ef8dbfc347b10c094890f778ee2e36ca9bb4262e86dc99cd217e35f3470b"
++checksum = "5ea3d908b0e36316caf9e9e2c4625cdde190a7e6f440d794667ed17a1855e725"
+ dependencies = [
+ "unicode-ident",
+ ]
+
+ [[package]]
+ name = "quote"
+ version = "1.0.21"
+ source = "registry+https://github.com/rust-lang/crates.io-index"
+@@ -332,56 +332,62 @@ checksum = "bdbda6ac5cd1321e724fa9cee216
+ dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn",
+ ]
+
+ [[package]]
+ name = "serde"
+-version = "1.0.145"
++version = "1.0.150"
+ source = "registry+https://github.com/rust-lang/crates.io-index"
+-checksum = "728eb6351430bccb993660dfffc5a72f91ccc1295abaa8ce19b27ebe4f75568b"
++checksum = "e326c9ec8042f1b5da33252c8a37e9ffbd2c9bef0155215b6e6c80c790e05f91"
+ dependencies = [
+ "serde_derive",
+ ]
+
+ [[package]]
+ name = "serde_derive"
+-version = "1.0.145"
++version = "1.0.150"
+ source = "registry+https://github.com/rust-lang/crates.io-index"
+-checksum = "81fa1584d3d1bcacd84c277a0dfe21f5b0f6accf4a23d04d4c6d61f1af522b4c"
++checksum = "42a3df25b0713732468deadad63ab9da1f1fd75a48a15024b50363f128db627e"
+ dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn",
+ ]
+
+ [[package]]
+ name = "serde_json"
+-version = "1.0.86"
++version = "1.0.89"
+ source = "registry+https://github.com/rust-lang/crates.io-index"
+-checksum = "41feea4228a6f1cd09ec7a3593a682276702cd67b5273544757dae23c096f074"
++checksum = "020ff22c755c2ed3f8cf162dbb41a7268d934702f3ed3631656ea597e08fc3db"
+ dependencies = [
+ "itoa",
+ "ryu",
+ "serde",
+ ]
+
+ [[package]]
++name = "siphasher"
++version = "0.3.10"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "7bd3e3206899af3f8b12af284fafc038cc1dc2b41d1b89dd17297221c5d225de"
++
++[[package]]
+ name = "strsim"
+ version = "0.10.0"
+ source = "registry+https://github.com/rust-lang/crates.io-index"
+ checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623"
+
+ [[package]]
+ name = "syn"
+-version = "1.0.102"
++version = "1.0.105"
+ source = "registry+https://github.com/rust-lang/crates.io-index"
+-checksum = "3fcd952facd492f9be3ef0d0b7032a6e442ee9b361d4acc2b1d0c4aaa5f613a1"
++checksum = "60b9b43d45702de4c839cb9b51d9f529c5dd26a4aff255b42b1ebc03e88ee908"
+ dependencies = [
+ "proc-macro2",
+ "quote",
+ "unicode-ident",
+ ]
+
+ [[package]]
+ name = "termcolor"
+@@ -389,25 +395,25 @@ version = "1.1.3"
+ source = "registry+https://github.com/rust-lang/crates.io-index"
+ checksum = "bab24d30b911b2376f3a13cc2cd443142f0c81dda04c118693e35b3835757755"
+ dependencies = [
+ "winapi-util",
+ ]
+
+ [[package]]
+ name = "textwrap"
+-version = "0.15.1"
++version = "0.16.0"
+ source = "registry+https://github.com/rust-lang/crates.io-index"
+-checksum = "949517c0cf1bf4ee812e2e07e08ab448e3ae0d23472aee8a06c985f0c8815b16"
++checksum = "222a222a5bfe1bba4a77b45ec488a741b3cb8872e5e499451fd7d0129c9c7c3d"
+
+ [[package]]
+ name = "toml"
+-version = "0.5.9"
++version = "0.5.10"
+ source = "registry+https://github.com/rust-lang/crates.io-index"
+-checksum = "8d82e1a7758622a465f8cee077614c73484dac5b836c02ff6a40d5d1010324d7"
++checksum = "1333c76748e868a4d9d1017b5ab53171dfd095f70c712fdb4653a406547f598f"
+ dependencies = [
+ "serde",
+ ]
+
+ [[package]]
+ name = "unicase"
+ version = "2.6.0"
+ source = "registry+https://github.com/rust-lang/crates.io-index"
+@@ -419,17 +425,17 @@ dependencies = [
+ [[package]]
+ name = "unicode-ident"
+ version = "1.0.5"
+ source = "registry+https://github.com/rust-lang/crates.io-index"
+ checksum = "6ceab39d59e4c9499d4e5a8ee0e2735b891bb7308ac83dfb4e80cad195c9f6f3"
+
+ [[package]]
+ name = "uniffi_bindgen"
+-version = "0.21.0"
++version = "0.21.1"
+ dependencies = [
+ "anyhow",
+ "askama",
+ "bincode",
+ "camino",
+ "clap",
+ "fs-err",
+ "goblin",
+@@ -439,22 +445,34 @@ dependencies = [
+ "serde",
+ "serde_json",
+ "toml",
+ "uniffi_meta",
+ "weedle2",
+ ]
+
+ [[package]]
++name = "uniffi_checksum_derive"
++version = "0.21.1"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "78b6e16d46caf942016997af8bbdf4b163bf8ae3deb0b667d9643de7b7ffd4c9"
++dependencies = [
++ "quote",
++ "syn",
++]
++
++[[package]]
+ name = "uniffi_meta"
+-version = "0.21.0"
++version = "0.21.1"
+ source = "registry+https://github.com/rust-lang/crates.io-index"
+-checksum = "cd9417cc653937681436b93838d8c5f97a5b8c58697813982ee8810bd1dc3b57"
++checksum = "729835442da829c9b6f7c111c76cf87b2498e129101203bec94f0c39a3296a38"
+ dependencies = [
+ "serde",
++ "siphasher",
++ "uniffi_checksum_derive",
+ ]
+
+ [[package]]
+ name = "version_check"
+ version = "0.9.4"
+ source = "registry+https://github.com/rust-lang/crates.io-index"
+ checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f"
+
+diff --git a/third_party/rust/uniffi_bindgen/Cargo.toml b/third_party/rust/uniffi_bindgen/Cargo.toml
+--- a/third_party/rust/uniffi_bindgen/Cargo.toml
++++ b/third_party/rust/uniffi_bindgen/Cargo.toml
+@@ -7,28 +7,27 @@
+ #
+ # If you are reading this file be aware that the original Cargo.toml
+ # will likely look very different (and much more reasonable).
+ # See Cargo.toml.orig for the original contents.
+
+ [package]
+ edition = "2021"
+ name = "uniffi_bindgen"
+-version = "0.21.0"
++version = "0.21.1"
+ authors = ["Firefox Sync Team <sync-team@mozilla.com>"]
+ description = "a multi-language bindings generator for rust (codegen and cli tooling)"
+ homepage = "https://mozilla.github.io/uniffi-rs"
+ documentation = "https://mozilla.github.io/uniffi-rs"
+ keywords = [
+ "ffi",
+ "bindgen",
+ ]
+ license = "MPL-2.0"
+ repository = "https://github.com/mozilla/uniffi-rs"
+-resolver = "2"
+
+ [[bin]]
+ name = "uniffi-bindgen"
+ path = "src/main.rs"
+
+ [dependencies.anyhow]
+ version = "1"
+
+@@ -71,12 +70,12 @@ version = "1"
+
+ [dependencies.serde_json]
+ version = "1.0.80"
+
+ [dependencies.toml]
+ version = "0.5"
+
+ [dependencies.uniffi_meta]
+-version = "=0.21.0"
++version = "=0.21.1"
+
+ [dependencies.weedle2]
+ version = "4.0.0"
+diff --git a/third_party/rust/uniffi_bindgen/src/interface/attributes.rs b/third_party/rust/uniffi_bindgen/src/interface/attributes.rs
+--- a/third_party/rust/uniffi_bindgen/src/interface/attributes.rs
++++ b/third_party/rust/uniffi_bindgen/src/interface/attributes.rs
+@@ -10,23 +10,24 @@
+ //! support. You can also use the [`parse_attributes`] function to parse an
+ //! `ExtendedAttributeList` into a vec of same.
+ //!
+ //! We only support a small number of attributes, so it's manageable to have them
+ //! all handled by a single abstraction. This might need to be refactored in future
+ //! if we grow significantly more complicated attribute handling.
+
+ use anyhow::{bail, Result};
++use uniffi_meta::Checksum;
+
+ /// Represents an attribute parsed from UDL, like `[ByRef]` or `[Throws]`.
+ ///
+ /// This is a convenience enum for parsing UDL attributes and erroring out if we encounter
+ /// any unsupported ones. These don't convert directly into parts of a `ComponentInterface`, but
+ /// may influence the properties of things like functions and arguments.
+-#[derive(Debug, Clone, Hash)]
++#[derive(Debug, Clone, Checksum)]
+ pub(super) enum Attribute {
+ ByRef,
+ Enum,
+ Error,
+ Name(String),
+ SelfType(SelfType),
+ Threadsafe, // N.B. the `[Threadsafe]` attribute is deprecated and will be removed
+ Throws(String),
+@@ -114,17 +115,17 @@ where
+ validator(attr)?;
+ }
+
+ Ok(attrs)
+ }
+
+ /// Attributes that can be attached to an `enum` definition in the UDL.
+ /// There's only one case here: using `[Error]` to mark an enum as an error class.
+-#[derive(Debug, Clone, Hash, Default)]
++#[derive(Debug, Clone, Checksum, Default)]
+ pub(super) struct EnumAttributes(Vec<Attribute>);
+
+ impl EnumAttributes {
+ pub fn contains_error_attr(&self) -> bool {
+ self.0.iter().any(|attr| attr.is_error())
+ }
+ }
+
+@@ -150,17 +151,17 @@ impl<T: TryInto<EnumAttributes, Error =
+ }
+ }
+ }
+
+ /// Represents UDL attributes that might appear on a function.
+ ///
+ /// This supports the `[Throws=ErrorName]` attribute for functions that
+ /// can produce an error.
+-#[derive(Debug, Clone, Hash, Default)]
++#[derive(Debug, Clone, Checksum, Default)]
+ pub(super) struct FunctionAttributes(Vec<Attribute>);
+
+ impl FunctionAttributes {
+ pub(super) fn get_throws_err(&self) -> Option<&str> {
+ self.0.iter().find_map(|attr| match attr {
+ // This will hopefully return a helpful compilation error
+ // if the error is not defined.
+ Attribute::Throws(inner) => Some(inner.as_ref()),
+@@ -193,17 +194,17 @@ impl<T: TryInto<FunctionAttributes, Erro
+ }
+ }
+ }
+
+ /// Represents UDL attributes that might appear on a function argument.
+ ///
+ /// This supports the `[ByRef]` attribute for arguments that should be passed
+ /// by reference in the generated Rust scaffolding.
+-#[derive(Debug, Clone, Hash, Default)]
++#[derive(Debug, Clone, Checksum, Default)]
+ pub(super) struct ArgumentAttributes(Vec<Attribute>);
+
+ impl ArgumentAttributes {
+ pub fn by_ref(&self) -> bool {
+ self.0.iter().any(|attr| matches!(attr, Attribute::ByRef))
+ }
+ }
+
+@@ -228,17 +229,17 @@ impl<T: TryInto<ArgumentAttributes, Erro
+ match value {
+ None => Ok(Default::default()),
+ Some(v) => v.try_into(),
+ }
+ }
+ }
+
+ /// Represents UDL attributes that might appear on an `interface` definition.
+-#[derive(Debug, Clone, Hash, Default)]
++#[derive(Debug, Clone, Checksum, Default)]
+ pub(super) struct InterfaceAttributes(Vec<Attribute>);
+
+ impl InterfaceAttributes {
+ pub fn contains_enum_attr(&self) -> bool {
+ self.0.iter().any(|attr| attr.is_enum())
+ }
+
+ pub fn contains_error_attr(&self) -> bool {
+@@ -282,17 +283,17 @@ impl<T: TryInto<InterfaceAttributes, Err
+ }
+ }
+ }
+
+ /// Represents UDL attributes that might appear on a constructor.
+ ///
+ /// This supports the `[Throws=ErrorName]` attribute for constructors that can produce
+ /// an error, and the `[Name=MethodName]` for non-default constructors.
+-#[derive(Debug, Clone, Hash, Default)]
++#[derive(Debug, Clone, Checksum, Default)]
+ pub(super) struct ConstructorAttributes(Vec<Attribute>);
+
+ impl ConstructorAttributes {
+ pub(super) fn get_throws_err(&self) -> Option<&str> {
+ self.0.iter().find_map(|attr| match attr {
+ // This will hopefully return a helpful compilation error
+ // if the error is not defined.
+ Attribute::Throws(inner) => Some(inner.as_ref()),
+@@ -321,17 +322,17 @@ impl TryFrom<&weedle::attribute::Extende
+ Ok(Self(attrs))
+ }
+ }
+
+ /// Represents UDL attributes that might appear on a method.
+ ///
+ /// This supports the `[Throws=ErrorName]` attribute for methods that can produce
+ /// an error, and the `[Self=ByArc]` attribute for methods that take `Arc<Self>` as receiver.
+-#[derive(Debug, Clone, Hash, Default)]
++#[derive(Debug, Clone, Checksum, Default)]
+ pub(super) struct MethodAttributes(Vec<Attribute>);
+
+ impl MethodAttributes {
+ pub(super) fn get_throws_err(&self) -> Option<&str> {
+ self.0.iter().find_map(|attr| match attr {
+ // This will hopefully return a helpful compilation error
+ // if the error is not defined.
+ Attribute::Throws(inner) => Some(inner.as_ref()),
+@@ -370,17 +371,17 @@ impl<T: TryInto<MethodAttributes, Error
+ }
+ }
+
+ /// Represents the different possible types of method call receiver.
+ ///
+ /// Actually we only support one of these right now, `[Self=ByArc]`.
+ /// We might add more in future, e.g. a `[Self=ByRef]` if there are cases
+ /// where we need to force the receiver to be taken by reference.
+-#[derive(Debug, Clone, Hash)]
++#[derive(Debug, Clone, Checksum)]
+ pub(super) enum SelfType {
+ ByArc, // Method receiver is `Arc<Self>`.
+ }
+
+ impl TryFrom<&weedle::attribute::IdentifierOrString<'_>> for SelfType {
+ type Error = anyhow::Error;
+ fn try_from(nm: &weedle::attribute::IdentifierOrString<'_>) -> Result<Self, Self::Error> {
+ Ok(match nm {
+@@ -393,17 +394,17 @@ impl TryFrom<&weedle::attribute::Identif
+ }
+ })
+ }
+ }
+
+ /// Represents UDL attributes that might appear on a typedef
+ ///
+ /// This supports the `[External="crate_name"]` and `[Custom]` attributes for types.
+-#[derive(Debug, Clone, Hash, Default)]
++#[derive(Debug, Clone, Checksum, Default)]
+ pub(super) struct TypedefAttributes(Vec<Attribute>);
+
+ impl TypedefAttributes {
+ pub(super) fn get_crate_name(&self) -> String {
+ self.0
+ .iter()
+ .find_map(|attr| match attr {
+ Attribute::External(crate_name) => Some(crate_name.clone()),
+diff --git a/third_party/rust/uniffi_bindgen/src/interface/callbacks.rs b/third_party/rust/uniffi_bindgen/src/interface/callbacks.rs
+--- a/third_party/rust/uniffi_bindgen/src/interface/callbacks.rs
++++ b/third_party/rust/uniffi_bindgen/src/interface/callbacks.rs
+@@ -28,29 +28,35 @@
+ //! # };
+ //! # "##)?;
+ //! let callback = ci.get_callback_interface_definition("Example").unwrap();
+ //! assert_eq!(callback.name(), "Example");
+ //! assert_eq!(callback.methods()[0].name(), "hello");
+ //! # Ok::<(), anyhow::Error>(())
+ //! ```
+
+-use std::hash::{Hash, Hasher};
+-
+ use anyhow::{bail, Result};
++use uniffi_meta::Checksum;
+
+ use super::ffi::{FFIArgument, FFIFunction, FFIType};
+ use super::object::Method;
+ use super::types::{Type, TypeIterator};
+ use super::{APIConverter, ComponentInterface};
+
+-#[derive(Debug, Clone)]
++#[derive(Debug, Clone, Checksum)]
+ pub struct CallbackInterface {
+ pub(super) name: String,
+ pub(super) methods: Vec<Method>,
++ // We don't include the FFIFunc in the hash calculation, because:
++ // - it is entirely determined by the other fields,
++ // so excluding it is safe.
++ // - its `name` property includes a checksum derived from the very
++ // hash value we're trying to calculate here, so excluding it
++ // avoids a weird circular depenendency in the calculation.
++ #[checksum_ignore]
+ pub(super) ffi_init_callback: FFIFunction,
+ }
+
+ impl CallbackInterface {
+ fn new(name: String) -> CallbackInterface {
+ CallbackInterface {
+ name,
+ methods: Default::default(),
+@@ -83,29 +89,16 @@ impl CallbackInterface {
+ self.ffi_init_callback.return_type = None;
+ }
+
+ pub fn iter_types(&self) -> TypeIterator<'_> {
+ Box::new(self.methods.iter().flat_map(Method::iter_types))
+ }
+ }
+
+-impl Hash for CallbackInterface {
+- fn hash<H: Hasher>(&self, state: &mut H) {
+- // We don't include the FFIFunc in the hash calculation, because:
+- // - it is entirely determined by the other fields,
+- // so excluding it is safe.
+- // - its `name` property includes a checksum derived from the very
+- // hash value we're trying to calculate here, so excluding it
+- // avoids a weird circular depenendency in the calculation.
+- self.name.hash(state);
+- self.methods.hash(state);
+- }
+-}
+-
+ impl APIConverter<CallbackInterface> for weedle::CallbackInterfaceDefinition<'_> {
+ fn convert(&self, ci: &mut ComponentInterface) -> Result<CallbackInterface> {
+ if self.attributes.is_some() {
+ bail!("callback interface attributes are not supported yet");
+ }
+ if self.inheritance.is_some() {
+ bail!("callback interface inheritence is not supported");
+ }
+diff --git a/third_party/rust/uniffi_bindgen/src/interface/enum_.rs b/third_party/rust/uniffi_bindgen/src/interface/enum_.rs
+--- a/third_party/rust/uniffi_bindgen/src/interface/enum_.rs
++++ b/third_party/rust/uniffi_bindgen/src/interface/enum_.rs
+@@ -72,27 +72,28 @@
+ //! assert_eq!(e.variants()[0].fields().len(), 0);
+ //! assert_eq!(e.variants()[1].name(), "One");
+ //! assert_eq!(e.variants()[1].fields().len(), 1);
+ //! assert_eq!(e.variants()[1].fields()[0].name(), "first");
+ //! # Ok::<(), anyhow::Error>(())
+ //! ```
+
+ use anyhow::{bail, Result};
++use uniffi_meta::Checksum;
+
+ use super::record::Field;
+ use super::types::{Type, TypeIterator};
+ use super::{APIConverter, ComponentInterface};
+
+ /// Represents an enum with named variants, each of which may have named
+ /// and typed fields.
+ ///
+ /// Enums are passed across the FFI by serializing to a bytebuffer, with a
+ /// i32 indicating the variant followed by the serialization of each field.
+-#[derive(Debug, Clone, Hash)]
++#[derive(Debug, Clone, Checksum)]
+ pub struct Enum {
+ pub(super) name: String,
+ pub(super) variants: Vec<Variant>,
+ // "Flat" enums do not have, and will never have, variants with associated data.
+ pub(super) flat: bool,
+ }
+
+ impl Enum {
+@@ -169,17 +170,17 @@ impl APIConverter<Enum> for weedle::Inte
+ flat: false,
+ })
+ }
+ }
+
+ /// Represents an individual variant in an Enum.
+ ///
+ /// Each variant has a name and zero or more fields.
+-#[derive(Debug, Clone, Default, Hash)]
++#[derive(Debug, Clone, Default, Checksum)]
+ pub struct Variant {
+ pub(super) name: String,
+ pub(super) fields: Vec<Field>,
+ }
+
+ impl Variant {
+ pub fn name(&self) -> &str {
+ &self.name
+diff --git a/third_party/rust/uniffi_bindgen/src/interface/error.rs b/third_party/rust/uniffi_bindgen/src/interface/error.rs
+--- a/third_party/rust/uniffi_bindgen/src/interface/error.rs
++++ b/third_party/rust/uniffi_bindgen/src/interface/error.rs
+@@ -78,28 +78,29 @@
+ //! assert_eq!(err.variants()[2].fields().len(), 2);
+ //! assert_eq!(err.variants()[2].fields()[0].name(), "x");
+ //! assert_eq!(err.variants()[2].fields()[1].name(), "y");
+ //! assert_eq!(err.is_flat(), false);
+ //! # Ok::<(), anyhow::Error>(())
+ //! ```
+
+ use anyhow::Result;
++use uniffi_meta::Checksum;
+
+ use super::enum_::{Enum, Variant};
+ use super::types::{Type, TypeIterator};
+ use super::{APIConverter, ComponentInterface};
+
+ /// Represents an Error that might be thrown by functions/methods in the component interface.
+ ///
+ /// Errors are represented in the UDL as enums with the special `[Error]` attribute, but
+ /// they're handled in the FFI very differently. We create them in `uniffi::call_with_result()` if
+ /// the wrapped function returns an `Err` value
+ /// struct and assign an integer error code to each variant.
+-#[derive(Debug, Clone, Hash)]
++#[derive(Debug, Clone, Checksum)]
+ pub struct Error {
+ pub name: String,
+ enum_: Enum,
+ }
+
+ impl Error {
+ pub fn from_enum(enum_: Enum) -> Self {
+ Self {
+diff --git a/third_party/rust/uniffi_bindgen/src/interface/function.rs b/third_party/rust/uniffi_bindgen/src/interface/function.rs
+--- a/third_party/rust/uniffi_bindgen/src/interface/function.rs
++++ b/third_party/rust/uniffi_bindgen/src/interface/function.rs
+@@ -27,40 +27,47 @@
+ //! # "##)?;
+ //! let func = ci.get_function_definition("hello").unwrap();
+ //! assert_eq!(func.name(), "hello");
+ //! assert!(matches!(func.return_type(), Some(Type::String)));
+ //! assert_eq!(func.arguments().len(), 0);
+ //! # Ok::<(), anyhow::Error>(())
+ //! ```
+ use std::convert::TryFrom;
+-use std::hash::{Hash, Hasher};
+
+ use anyhow::{bail, Result};
++use uniffi_meta::Checksum;
+
+ use super::ffi::{FFIArgument, FFIFunction};
+ use super::literal::{convert_default_value, Literal};
+ use super::types::{Type, TypeIterator};
+ use super::{
+ attributes::{ArgumentAttributes, FunctionAttributes},
+ convert_type,
+ };
+ use super::{APIConverter, ComponentInterface};
+
+ /// Represents a standalone function.
+ ///
+ /// Each `Function` corresponds to a standalone function in the rust module,
+ /// and has a corresponding standalone function in the foreign language bindings.
+ ///
+ /// In the FFI, this will be a standalone function with appropriately lowered types.
+-#[derive(Debug, Clone)]
++#[derive(Debug, Clone, Checksum)]
+ pub struct Function {
+ pub(super) name: String,
+ pub(super) arguments: Vec<Argument>,
+ pub(super) return_type: Option<Type>,
++ // We don't include the FFIFunc in the hash calculation, because:
++ // - it is entirely determined by the other fields,
++ // so excluding it is safe.
++ // - its `name` property includes a checksum derived from the very
++ // hash value we're trying to calculate here, so excluding it
++ // avoids a weird circular depenendency in the calculation.
++ #[checksum_ignore]
+ pub(super) ffi_func: FFIFunction,
+ pub(super) attributes: FunctionAttributes,
+ }
+
+ impl Function {
+ pub fn name(&self) -> &str {
+ &self.name
+ }
+@@ -137,31 +144,16 @@ impl From<uniffi_meta::FnMetadata> for F
+ arguments,
+ return_type,
+ ffi_func,
+ attributes: Default::default(),
+ }
+ }
+ }
+
+-impl Hash for Function {
+- fn hash<H: Hasher>(&self, state: &mut H) {
+- // We don't include the FFIFunc in the hash calculation, because:
+- // - it is entirely determined by the other fields,
+- // so excluding it is safe.
+- // - its `name` property includes a checksum derived from the very
+- // hash value we're trying to calculate here, so excluding it
+- // avoids a weird circular depenendency in the calculation.
+- self.name.hash(state);
+- self.arguments.hash(state);
+- self.return_type.hash(state);
+- self.attributes.hash(state);
+- }
+-}
+-
+ impl APIConverter<Function> for weedle::namespace::NamespaceMember<'_> {
+ fn convert(&self, ci: &mut ComponentInterface) -> Result<Function> {
+ match self {
+ weedle::namespace::NamespaceMember::Operation(f) => f.convert(ci),
+ _ => bail!("no support for namespace member type {:?} yet", self),
+ }
+ }
+ }
+@@ -180,17 +172,17 @@ impl APIConverter<Function> for weedle::
+ attributes: FunctionAttributes::try_from(self.attributes.as_ref())?,
+ })
+ }
+ }
+
+ /// Represents an argument to a function/constructor/method call.
+ ///
+ /// Each argument has a name and a type, along with some optional metadata.
+-#[derive(Debug, Clone, Hash)]
++#[derive(Debug, Clone, Checksum)]
+ pub struct Argument {
+ pub(super) name: String,
+ pub(super) type_: Type,
+ pub(super) by_ref: bool,
+ pub(super) optional: bool,
+ pub(super) default: Option<Literal>,
+ }
+
+diff --git a/third_party/rust/uniffi_bindgen/src/interface/literal.rs b/third_party/rust/uniffi_bindgen/src/interface/literal.rs
+--- a/third_party/rust/uniffi_bindgen/src/interface/literal.rs
++++ b/third_party/rust/uniffi_bindgen/src/interface/literal.rs
+@@ -3,22 +3,23 @@
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+ //! # Support for literal values.
+ //!
+ //! This module provides support for interpreting literal values from the UDL,
+ //! which appear in places such as default arguments.
+
+ use anyhow::{bail, Result};
++use uniffi_meta::Checksum;
+
+ use super::types::Type;
+
+ // Represents a literal value.
+ // Used for e.g. default argument values.
+-#[derive(Debug, Clone, Hash)]
++#[derive(Debug, Clone, Checksum)]
+ pub enum Literal {
+ Boolean(bool),
+ String(String),
+ // Integers are represented as the widest representation we can.
+ // Number formatting vary with language and radix, so we avoid a lot of parsing and
+ // formatting duplication by using only signed and unsigned variants.
+ UInt(u64, Radix, Type),
+ Int(i64, Radix, Type),
+@@ -30,17 +31,17 @@ pub enum Literal {
+ Enum(String, Type),
+ EmptySequence,
+ EmptyMap,
+ Null,
+ }
+
+ // Represent the radix of integer literal values.
+ // We preserve the radix into the generated bindings for readability reasons.
+-#[derive(Debug, Clone, Copy, Hash)]
++#[derive(Debug, Clone, Copy, Checksum)]
+ pub enum Radix {
+ Decimal = 10,
+ Octal = 8,
+ Hexadecimal = 16,
+ }
+
+ pub(super) fn convert_default_value(
+ default_value: &weedle::literal::DefaultValue<'_>,
+diff --git a/third_party/rust/uniffi_bindgen/src/interface/mod.rs b/third_party/rust/uniffi_bindgen/src/interface/mod.rs
+--- a/third_party/rust/uniffi_bindgen/src/interface/mod.rs
++++ b/third_party/rust/uniffi_bindgen/src/interface/mod.rs
+@@ -39,22 +39,17 @@
+ //! guarantee that there's not some edge-case where it produces valid-but-incorrect code.
+ //!
+ //! * There is a *lot* of cloning going on, in the spirit of "first make it work". There's probably
+ //! a good opportunity here for e.g. interned strings, but we're nowhere near the point were we need
+ //! that kind of optimization just yet.
+ //!
+ //! * Error messages and general developer experience leave a lot to be desired.
+
+-use std::{
+- collections::HashSet,
+- convert::TryFrom,
+- hash::{Hash, Hasher},
+- iter,
+-};
++use std::{collections::HashSet, convert::TryFrom, iter};
+
+ use anyhow::{bail, Result};
+
+ pub mod types;
+ pub use types::Type;
+ use types::{TypeIterator, TypeUniverse};
+
+ mod attributes;
+@@ -72,47 +67,51 @@ mod namespace;
+ pub use namespace::Namespace;
+ mod object;
+ pub use object::{Constructor, Method, Object};
+ mod record;
+ pub use record::{Field, Record};
+
+ pub mod ffi;
+ pub use ffi::{FFIArgument, FFIFunction, FFIType};
+-use uniffi_meta::{MethodMetadata, ObjectMetadata};
++use uniffi_meta::{Checksum, MethodMetadata, ObjectMetadata};
+
+ /// The main public interface for this module, representing the complete details of an interface exposed
+ /// by a rust component and the details of consuming it via an extern-C FFI layer.
+ ///
+-#[derive(Debug, Default)]
++#[derive(Debug, Default, Checksum)]
+ pub struct ComponentInterface {
+ /// Every ComponentInterface gets tagged with the version of uniffi used to create it.
+ /// This helps us avoid using a lib compiled with one version together with bindings created
+ /// using a different version, which might introduce unsafety.
+ uniffi_version: String,
+ /// All of the types used in the interface.
++ // We can't checksum `self.types`, but its contents are implied by the other fields
++ // anyway, so it's safe to ignore it.
++ #[checksum_ignore]
+ pub(super) types: TypeUniverse,
+ /// The unique prefix that we'll use for namespacing when exposing this component's API.
+ namespace: String,
+ /// The internal unique prefix used to namespace FFI symbols
++ #[checksum_ignore]
+ ffi_namespace: String,
+ /// The high-level API provided by the component.
+ enums: Vec<Enum>,
+ records: Vec<Record>,
+ functions: Vec<Function>,
+ objects: Vec<Object>,
+ callback_interfaces: Vec<CallbackInterface>,
+ errors: Vec<Error>,
+ }
+
+ impl ComponentInterface {
+ /// Parse a `ComponentInterface` from a string containing a WebIDL definition.
+ pub fn from_webidl(idl: &str) -> Result<Self> {
+ let mut ci = Self {
+- uniffi_version: env!("CARGO_PKG_VERSION").to_string(),
++ uniffi_version: "0.21.0".to_string(),
+ ..Default::default()
+ };
+ // There's some lifetime thing with the errors returned from weedle::Definitions::parse
+ // that my own lifetime is too short to worry about figuring out; unwrap and move on.
+
+ // Note we use `weedle::Definitions::parse` instead of `weedle::parse` so
+ // on parse errors we can see how far weedle got, which helps locate the problem.
+ use weedle::Parse; // this trait must be in scope for parse to work.
+@@ -316,26 +315,18 @@ impl ComponentInterface {
+ /// version of that interface. It offers the following properties:
+ ///
+ /// - Two ComponentIntefaces generated from the same WebIDL file, using the same version of uniffi
+ /// and the same version of Rust, will always have the same checksum value.
+ /// - Two ComponentInterfaces will, with high probability, have different checksum values if:
+ /// - They were generated from two different WebIDL files.
+ /// - They were generated by two different versions of uniffi
+ ///
+- /// The checksum may or may not change depending on the version of Rust used; since we expect
+- /// consumers to be using the same executable to generate both the scaffolding and the bindings,
+- /// assuming the same version of Rust seems acceptable.
+- ///
+ /// Note that this is designed to prevent accidents, not attacks, so there is no need for the
+ /// checksum to be cryptographically secure.
+- ///
+- /// TODO: it's not clear to me if the derivation of `Hash` is actually deterministic enough to
+- /// ensure the guarantees above, or if it might be sensitive to e.g. compiler-driven re-ordering
+- /// of struct field. Let's see how it goes...
+ pub fn checksum(&self) -> u16 {
+ uniffi_meta::checksum(self)
+ }
+
+ /// The namespace to use in FFI-level function definitions.
+ ///
+ /// The value returned by this method is used as a prefix to namespace all UDL-defined FFI
+ /// functions used in this ComponentInterface.
+@@ -667,33 +658,16 @@ impl ComponentInterface {
+ }
+ for callback in self.callback_interfaces.iter_mut() {
+ callback.derive_ffi_funcs(&ci_prefix);
+ }
+ Ok(())
+ }
+ }
+
+-/// `ComponentInterface` structs can be hashed, but this is mostly a convenient way to
+-/// produce a checksum of their contents. They're not really intended to live in a hashtable.
+-impl Hash for ComponentInterface {
+- fn hash<H: Hasher>(&self, state: &mut H) {
+- // We can't hash `self.types`, but its contents are implied by the other fields
+- // anyway, so it's safe to ignore it.
+- self.uniffi_version.hash(state);
+- self.namespace.hash(state);
+- self.enums.hash(state);
+- self.records.hash(state);
+- self.functions.hash(state);
+- self.objects.hash(state);
+- self.callback_interfaces.hash(state);
+- self.errors.hash(state);
+- }
+-}
+-
+ fn get_or_insert_object<'a>(objects: &'a mut Vec<Object>, name: &str) -> &'a mut Object {
+ // The find-based way of writing this currently runs into a borrow checker
+ // error, so we use position
+ match objects.iter_mut().position(|o| o.name == name) {
+ Some(idx) => &mut objects[idx],
+ None => {
+ objects.push(Object::new(name.to_owned()));
+ objects.last_mut().unwrap()
+diff --git a/third_party/rust/uniffi_bindgen/src/interface/object.rs b/third_party/rust/uniffi_bindgen/src/interface/object.rs
+--- a/third_party/rust/uniffi_bindgen/src/interface/object.rs
++++ b/third_party/rust/uniffi_bindgen/src/interface/object.rs
+@@ -53,20 +53,20 @@
+ //! # "##)?;
+ //! let obj = ci.get_object_definition("Example").unwrap();
+ //! assert_eq!(obj.name(), "Example");
+ //! assert_eq!(obj.constructors().len(), 0);
+ //! # Ok::<(), anyhow::Error>(())
+ //! ```
+
+ use std::convert::TryFrom;
+-use std::hash::{Hash, Hasher};
+ use std::{collections::HashSet, iter};
+
+ use anyhow::{bail, Result};
++use uniffi_meta::Checksum;
+
+ use super::ffi::{FFIArgument, FFIFunction, FFIType};
+ use super::function::Argument;
+ use super::types::{Type, TypeIterator};
+ use super::{
+ attributes::{ConstructorAttributes, InterfaceAttributes, MethodAttributes},
+ convert_type,
+ };
+@@ -81,22 +81,30 @@ use super::{APIConverter, ComponentInter
+ /// At the FFI layer, objects are represented by an opaque integer handle and a set of functions
+ /// a common prefix. The object's constuctors are functions that return new objects by handle,
+ /// and its methods are functions that take a handle as first argument. The foreign language
+ /// binding code is expected to stitch these functions back together into an appropriate class
+ /// definition (or that language's equivalent thereof).
+ ///
+ /// TODO:
+ /// - maybe "Class" would be a better name than "Object" here?
+-#[derive(Debug, Clone)]
++#[derive(Debug, Clone, Checksum)]
+ pub struct Object {
+ pub(super) name: String,
+ pub(super) constructors: Vec<Constructor>,
+ pub(super) methods: Vec<Method>,
++ // We don't include the FFIFunc in the hash calculation, because:
++ // - it is entirely determined by the other fields,
++ // so excluding it is safe.
++ // - its `name` property includes a checksum derived from the very
++ // hash value we're trying to calculate here, so excluding it
++ // avoids a weird circular depenendency in the calculation.
++ #[checksum_ignore]
+ pub(super) ffi_func_free: FFIFunction,
++ #[checksum_ignore]
+ pub(super) uses_deprecated_threadsafe_attribute: bool,
+ }
+
+ impl Object {
+ pub(super) fn new(name: String) -> Object {
+ Object {
+ name,
+ constructors: Default::default(),
+@@ -185,30 +193,16 @@ impl Object {
+ .iter()
+ .map(Method::iter_types)
+ .chain(self.constructors.iter().map(Constructor::iter_types))
+ .flatten(),
+ )
+ }
+ }
+
+-impl Hash for Object {
+- fn hash<H: Hasher>(&self, state: &mut H) {
+- // We don't include the FFIFunc in the hash calculation, because:
+- // - it is entirely determined by the other fields,
+- // so excluding it is safe.
+- // - its `name` property includes a checksum derived from the very
+- // hash value we're trying to calculate here, so excluding it
+- // avoids a weird circular depenendency in the calculation.
+- self.name.hash(state);
+- self.constructors.hash(state);
+- self.methods.hash(state);
+- }
+-}
+-
+ impl APIConverter<Object> for weedle::InterfaceDefinition<'_> {
+ fn convert(&self, ci: &mut ComponentInterface) -> Result<Object> {
+ if self.inheritance.is_some() {
+ bail!("interface inheritence is not supported");
+ }
+ let mut object = Object::new(self.identifier.0.to_string());
+ let attributes = match &self.attributes {
+ Some(attrs) => InterfaceAttributes::try_from(attrs)?,
+@@ -240,20 +234,27 @@ impl APIConverter<Object> for weedle::In
+ Ok(object)
+ }
+ }
+
+ // Represents a constructor for an object type.
+ //
+ // In the FFI, this will be a function that returns a pointer to an instance
+ // of the corresponding object type.
+-#[derive(Debug, Clone)]
++#[derive(Debug, Clone, Checksum)]
+ pub struct Constructor {
+ pub(super) name: String,
+ pub(super) arguments: Vec<Argument>,
++ // We don't include the FFIFunc in the hash calculation, because:
++ // - it is entirely determined by the other fields,
++ // so excluding it is safe.
++ // - its `name` property includes a checksum derived from the very
++ // hash value we're trying to calculate here, so excluding it
++ // avoids a weird circular depenendency in the calculation.
++ #[checksum_ignore]
+ pub(super) ffi_func: FFIFunction,
+ pub(super) attributes: ConstructorAttributes,
+ }
+
+ impl Constructor {
+ pub fn name(&self) -> &str {
+ &self.name
+ }
+@@ -294,30 +295,16 @@ impl Constructor {
+ self.ffi_func.return_type = Some(FFIType::RustArcPtr(obj_name.to_string()));
+ }
+
+ pub fn iter_types(&self) -> TypeIterator<'_> {
+ Box::new(self.arguments.iter().flat_map(Argument::iter_types))
+ }
+ }
+
+-impl Hash for Constructor {
+- fn hash<H: Hasher>(&self, state: &mut H) {
+- // We don't include the FFIFunc in the hash calculation, because:
+- // - it is entirely determined by the other fields,
+- // so excluding it is safe.
+- // - its `name` property includes a checksum derived from the very
+- // hash value we're trying to calculate here, so excluding it
+- // avoids a weird circular depenendency in the calculation.
+- self.name.hash(state);
+- self.arguments.hash(state);
+- self.attributes.hash(state);
+- }
+-}
+-
+ impl Default for Constructor {
+ fn default() -> Self {
+ Constructor {
+ name: String::from("new"),
+ arguments: Vec::new(),
+ ffi_func: Default::default(),
+ attributes: Default::default(),
+ }
+@@ -338,22 +325,29 @@ impl APIConverter<Constructor> for weedl
+ })
+ }
+ }
+
+ // Represents an instance method for an object type.
+ //
+ // The FFI will represent this as a function whose first/self argument is a
+ // `FFIType::RustArcPtr` to the instance.
+-#[derive(Debug, Clone)]
++#[derive(Debug, Clone, Checksum)]
+ pub struct Method {
+ pub(super) name: String,
+ pub(super) object_name: String,
++ pub(super) arguments: Vec<Argument>,
+ pub(super) return_type: Option<Type>,
+- pub(super) arguments: Vec<Argument>,
++ // We don't include the FFIFunc in the hash calculation, because:
++ // - it is entirely determined by the other fields,
++ // so excluding it is safe.
++ // - its `name` property includes a checksum derived from the very
++ // hash value we're trying to calculate here, so excluding it
++ // avoids a weird circular depenendency in the calculation.
++ #[checksum_ignore]
+ pub(super) ffi_func: FFIFunction,
+ pub(super) attributes: MethodAttributes,
+ }
+
+ impl Method {
+ pub fn name(&self) -> &str {
+ &self.name
+ }
+@@ -445,32 +439,16 @@ impl From<uniffi_meta::MethodMetadata> f
+ arguments,
+ return_type,
+ ffi_func,
+ attributes: Default::default(),
+ }
+ }
+ }
+
+-impl Hash for Method {
+- fn hash<H: Hasher>(&self, state: &mut H) {
+- // We don't include the FFIFunc in the hash calculation, because:
+- // - it is entirely determined by the other fields,
+- // so excluding it is safe.
+- // - its `name` property includes a checksum derived from the very
+- // hash value we're trying to calculate here, so excluding it
+- // avoids a weird circular depenendency in the calculation.
+- self.name.hash(state);
+- self.object_name.hash(state);
+- self.arguments.hash(state);
+- self.return_type.hash(state);
+- self.attributes.hash(state);
+- }
+-}
+-
+ impl APIConverter<Method> for weedle::interface::OperationInterfaceMember<'_> {
+ fn convert(&self, ci: &mut ComponentInterface) -> Result<Method> {
+ if self.special.is_some() {
+ bail!("special operations not supported");
+ }
+ if self.modifier.is_some() {
+ bail!("method modifiers are not supported")
+ }
+diff --git a/third_party/rust/uniffi_bindgen/src/interface/record.rs b/third_party/rust/uniffi_bindgen/src/interface/record.rs
+--- a/third_party/rust/uniffi_bindgen/src/interface/record.rs
++++ b/third_party/rust/uniffi_bindgen/src/interface/record.rs
+@@ -40,30 +40,31 @@
+ //! let record = ci.get_record_definition("Example").unwrap();
+ //! assert_eq!(record.name(), "Example");
+ //! assert_eq!(record.fields()[0].name(), "name");
+ //! assert_eq!(record.fields()[1].name(), "value");
+ //! # Ok::<(), anyhow::Error>(())
+ //! ```
+
+ use anyhow::{bail, Result};
++use uniffi_meta::Checksum;
+
+ use super::types::{Type, TypeIterator};
+ use super::{
+ convert_type,
+ literal::{convert_default_value, Literal},
+ };
+ use super::{APIConverter, ComponentInterface};
+
+ /// Represents a "data class" style object, for passing around complex values.
+ ///
+ /// In the FFI these are represented as a byte buffer, which one side explicitly
+ /// serializes the data into and the other serializes it out of. So I guess they're
+ /// kind of like "pass by clone" values.
+-#[derive(Debug, Clone, Hash)]
++#[derive(Debug, Clone, Checksum)]
+ pub struct Record {
+ pub(super) name: String,
+ pub(super) fields: Vec<Field>,
+ }
+
+ impl Record {
+ pub fn name(&self) -> &str {
+ &self.name
+@@ -104,17 +105,17 @@ impl APIConverter<Record> for weedle::Di
+ Ok(Record {
+ name: self.identifier.0.to_string(),
+ fields: self.members.body.convert(ci)?,
+ })
+ }
+ }
+
+ // Represents an individual field on a Record.
+-#[derive(Debug, Clone, Hash)]
++#[derive(Debug, Clone, Checksum)]
+ pub struct Field {
+ pub(super) name: String,
+ pub(super) type_: Type,
+ pub(super) required: bool,
+ pub(super) default: Option<Literal>,
+ }
+
+ impl Field {
+diff --git a/third_party/rust/uniffi_bindgen/src/interface/types/mod.rs b/third_party/rust/uniffi_bindgen/src/interface/types/mod.rs
+--- a/third_party/rust/uniffi_bindgen/src/interface/types/mod.rs
++++ b/third_party/rust/uniffi_bindgen/src/interface/types/mod.rs
+@@ -20,28 +20,29 @@
+ //! As a developer working on UniFFI itself, you're likely to spend a fair bit of time thinking
+ //! about how these API-level types map into the lower-level types of the FFI layer as represented
+ //! by the [`ffi::FFIType`](super::ffi::FFIType) enum, but that's a detail that is invisible to end users.
+
+ use std::{collections::hash_map::Entry, collections::BTreeSet, collections::HashMap, iter};
+
+ use anyhow::{bail, Result};
+ use heck::ToUpperCamelCase;
++use uniffi_meta::Checksum;
+
+ use super::ffi::FFIType;
+
+ mod finder;
+ pub(super) use finder::TypeFinder;
+ mod resolver;
+ pub(super) use resolver::{resolve_builtin_type, TypeResolver};
+
+ /// Represents all the different high-level types that can be used in a component interface.
+ /// At this level we identify user-defined types by name, without knowing any details
+ /// of their internal structure apart from what type of thing they are (record, enum, etc).
+-#[derive(Debug, Clone, Eq, PartialEq, Hash, Ord, PartialOrd)]
++#[derive(Debug, Clone, Eq, PartialEq, Checksum, Ord, PartialOrd)]
+ pub enum Type {
+ // Primitive types.
+ UInt8,
+ Int8,
+ UInt16,
+ Int16,
+ UInt32,
+ Int32,
+diff --git a/third_party/rust/uniffi_build/.cargo-checksum.json b/third_party/rust/uniffi_build/.cargo-checksum.json
+--- a/third_party/rust/uniffi_build/.cargo-checksum.json
++++ b/third_party/rust/uniffi_build/.cargo-checksum.json
+@@ -1,1 +1,1 @@
+-{"files":{"Cargo.toml":"bf9105f53978ecdccad9a75fc3645f97982d3c4162a5a9b49ab16554162b51c1","src/lib.rs":"485a0c0ab99077a1d4037f4deec9801e87a248196e7589a002556fb84973528a"},"package":"510287c368a9386eb731ebe824a6fc6c82a105e20d020af1aa20519c1c1561db"}
+\ No newline at end of file
++{"files":{"Cargo.toml":"30736876caf953bd0040b6c0fc824744556bf52fe23d656c7d01442d4c180674","src/lib.rs":"485a0c0ab99077a1d4037f4deec9801e87a248196e7589a002556fb84973528a"},"package":"d035e50433ee3d52ab0dcdcf3b9b26f2cc2ec39294b3c07d95865a518709455f"}
+\ No newline at end of file
+diff --git a/third_party/rust/uniffi_build/Cargo.toml b/third_party/rust/uniffi_build/Cargo.toml
+--- a/third_party/rust/uniffi_build/Cargo.toml
++++ b/third_party/rust/uniffi_build/Cargo.toml
+@@ -7,34 +7,33 @@
+ #
+ # If you are reading this file be aware that the original Cargo.toml
+ # will likely look very different (and much more reasonable).
+ # See Cargo.toml.orig for the original contents.
+
+ [package]
+ edition = "2021"
+ name = "uniffi_build"
+-version = "0.21.0"
++version = "0.21.1"
+ authors = ["Firefox Sync Team <sync-team@mozilla.com>"]
+ description = "a multi-language bindings generator for rust (build script helpers)"
+ homepage = "https://mozilla.github.io/uniffi-rs"
+ documentation = "https://mozilla.github.io/uniffi-rs"
+ keywords = [
+ "ffi",
+ "bindgen",
+ ]
+ license = "MPL-2.0"
+ repository = "https://github.com/mozilla/uniffi-rs"
+-resolver = "2"
+
+ [dependencies.anyhow]
+ version = "1"
+
+ [dependencies.camino]
+ version = "1.0.8"
+
+ [dependencies.uniffi_bindgen]
+-version = "=0.21.0"
++version = "=0.21.1"
+ optional = true
+
+ [features]
+ builtin-bindgen = ["uniffi_bindgen"]
+ default = []
+diff --git a/third_party/rust/uniffi_checksum_derive/.cargo-checksum.json b/third_party/rust/uniffi_checksum_derive/.cargo-checksum.json
+new file mode 100644
+--- /dev/null
++++ b/third_party/rust/uniffi_checksum_derive/.cargo-checksum.json
+@@ -0,0 +1,1 @@
++{"files":{"Cargo.toml":"2ab3c60724c4c504297f8876bf0a8d1291f76a2fc46f5e83634aa147e89ffc71","src/lib.rs":"c68c69a1cf6a69e5fe78f7b069364a265c5bb6ce8c0abf0b5745eca01c79604a"},"package":"78b6e16d46caf942016997af8bbdf4b163bf8ae3deb0b667d9643de7b7ffd4c9"}
+\ No newline at end of file
+diff --git a/third_party/rust/uniffi_checksum_derive/Cargo.toml b/third_party/rust/uniffi_checksum_derive/Cargo.toml
+new file mode 100644
+--- /dev/null
++++ b/third_party/rust/uniffi_checksum_derive/Cargo.toml
+@@ -0,0 +1,42 @@
++# THIS FILE IS AUTOMATICALLY GENERATED BY CARGO
++#
++# When uploading crates to the registry Cargo will automatically
++# "normalize" Cargo.toml files for maximal compatibility
++# with all versions of Cargo and also rewrite `path` dependencies
++# to registry (e.g., crates.io) dependencies.
++#
++# If you are reading this file be aware that the original Cargo.toml
++# will likely look very different (and much more reasonable).
++# See Cargo.toml.orig for the original contents.
++
++[package]
++edition = "2021"
++name = "uniffi_checksum_derive"
++version = "0.21.1"
++authors = ["Firefox Sync Team <sync-team@mozilla.com>"]
++description = "a multi-language bindings generator for rust (checksum custom derive)"
++homepage = "https://mozilla.github.io/uniffi-rs"
++documentation = "https://mozilla.github.io/uniffi-rs"
++keywords = [
++ "ffi",
++ "bindgen",
++]
++license = "MPL-2.0"
++repository = "https://github.com/mozilla/uniffi-rs"
++
++[lib]
++proc-macro = true
++
++[dependencies.quote]
++version = "1.0"
++
++[dependencies.syn]
++version = "1.0"
++features = [
++ "derive",
++ "parsing",
++]
++
++[features]
++default = []
++nightly = []
+diff --git a/third_party/rust/uniffi_checksum_derive/src/lib.rs b/third_party/rust/uniffi_checksum_derive/src/lib.rs
+new file mode 100644
+--- /dev/null
++++ b/third_party/rust/uniffi_checksum_derive/src/lib.rs
+@@ -0,0 +1,134 @@
++/* This Source Code Form is subject to the terms of the Mozilla Public
++ * License, v. 2.0. If a copy of the MPL was not distributed with this
++ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
++#![cfg_attr(feature = "nightly", feature(proc_macro_expand))]
++
++//! Custom derive for uniffi_meta::Checksum
++
++use proc_macro::TokenStream;
++use quote::{format_ident, quote};
++use syn::{parse_macro_input, Attribute, Data, DeriveInput, Expr, ExprLit, Fields, Index, Lit};
++
++fn has_ignore_attribute(attrs: &[Attribute]) -> bool {
++ attrs.iter().any(|attr| {
++ if attr.path.is_ident("checksum_ignore") {
++ if !attr.tokens.is_empty() {
++ panic!("#[checksum_ignore] doesn't accept extra information");
++ }
++ true
++ } else {
++ false
++ }
++ })
++}
++
++#[proc_macro_derive(Checksum, attributes(checksum_ignore))]
++pub fn checksum_derive(input: TokenStream) -> TokenStream {
++ let input: DeriveInput = parse_macro_input!(input);
++
++ let name = input.ident;
++
++ let (impl_generics, ty_generics, where_clause) = input.generics.split_for_impl();
++
++ let code = match input.data {
++ Data::Enum(enum_)
++ if enum_.variants.len() == 1
++ && enum_
++ .variants
++ .iter()
++ .all(|variant| matches!(variant.fields, Fields::Unit)) =>
++ {
++ quote!()
++ }
++ Data::Enum(enum_) => {
++ let mut next_discriminant = 0u64;
++ let match_inner = enum_.variants.iter().map(|variant| {
++ let ident = &variant.ident;
++ if has_ignore_attribute(&variant.attrs) {
++ panic!("#[checksum_ignore] is not supported in enums");
++ }
++ match &variant.discriminant {
++ Some((_, Expr::Lit(ExprLit { lit: Lit::Int(value), .. }))) => {
++ next_discriminant = value.base10_parse::<u64>().unwrap();
++ }
++ Some(_) => {
++ panic!("#[derive(Checksum)] doesn't support non-numeric explicit discriminants in enums");
++ }
++ None => {}
++ }
++ let discriminant = quote! { state.write(&#next_discriminant.to_le_bytes()) };
++ next_discriminant += 1;
++ match &variant.fields {
++ Fields::Unnamed(fields) => {
++ let field_idents = fields
++ .unnamed
++ .iter()
++ .enumerate()
++ .map(|(num, _)| format_ident!("__self_{}", num));
++ let field_stmts = field_idents
++ .clone()
++ .map(|ident| quote! { Checksum::checksum(#ident, state); });
++ quote! {
++ Self::#ident(#(#field_idents,)*) => {
++ #discriminant;
++ #(#field_stmts)*
++ }
++ }
++ }
++ Fields::Named(fields) => {
++ let field_idents = fields
++ .named
++ .iter()
++ .map(|field| field.ident.as_ref().unwrap());
++ let field_stmts = field_idents
++ .clone()
++ .map(|ident| quote! { Checksum::checksum(#ident, state); });
++ quote! {
++ Self::#ident { #(#field_idents,)* } => {
++ #discriminant;
++ #(#field_stmts)*
++ }
++ }
++ }
++ Fields::Unit => quote! { Self::#ident => #discriminant, },
++ }
++ });
++ quote! {
++ match self {
++ #(#match_inner)*
++ }
++ }
++ }
++ Data::Struct(struct_) => {
++ let stmts = struct_
++ .fields
++ .iter()
++ .enumerate()
++ .filter_map(|(num, field)| {
++ (!has_ignore_attribute(&field.attrs)).then(|| match field.ident.as_ref() {
++ Some(ident) => quote! { Checksum::checksum(&self.#ident, state); },
++ None => {
++ let i = Index::from(num);
++ quote! { Checksum::checksum(&self.#i, state); }
++ }
++ })
++ });
++ quote! {
++ #(#stmts)*
++ }
++ }
++ Data::Union(_) => {
++ panic!("#[derive(Checksum)] is not supported for unions");
++ }
++ };
++
++ quote! {
++ #[automatically_derived]
++ impl #impl_generics Checksum for #name #ty_generics #where_clause {
++ fn checksum<__H: ::core::hash::Hasher>(&self, state: &mut __H) {
++ #code
++ }
++ }
++ }
++ .into()
++}
+diff --git a/third_party/rust/uniffi_macros/.cargo-checksum.json b/third_party/rust/uniffi_macros/.cargo-checksum.json
+--- a/third_party/rust/uniffi_macros/.cargo-checksum.json
++++ b/third_party/rust/uniffi_macros/.cargo-checksum.json
+@@ -1,1 +1,1 @@
+-{"files":{"Cargo.toml":"55f7e114dd34b0c60b58890120f8707601a5401e9d49d42a239b03da2e660d4f","src/export.rs":"e23929cf6fb5542d29514fe668f3b3d836fad968eacd9c6fcba74c5cd9cf2b61","src/export/metadata.rs":"af89a9942c7c0c4043a3cd57d1e6bd71cde19005e1f9f246efac761f47eff6be","src/export/metadata/convert.rs":"81060fb3390165d77db021f44142a2f3f10882515f859d7393857083370f2d35","src/export/metadata/function.rs":"11833cabd37e7671c0a01944bec73b8892a15df814bbe4c26fdae57aad89a2ba","src/export/metadata/impl_.rs":"ecfdaa132f05dd946414281e52165ef19c90c0bfd76ec651d4ec86837bd41d1c","src/export/scaffolding.rs":"66939405063e56fc983126f249e2d7ddc3257cb045a738abd0cf813a4aafc59c","src/lib.rs":"ca77b437a58cfb3ddeb106d3c1c8378545c46ef241298e62ab1190c5136d1fb1","src/object.rs":"955b596f344304013692042bdc1760bbb1192ec33950b0dd2932cb8de94ec297","src/record.rs":"67a5c7ed6a448f7ad8f5c8e930c5e3007b2b0cac32f52cc8596bdae6fb3c816e","src/util.rs":"6389a9b4258808a3af168cf85658fb7c069172d5e528ee0e94210fa664f2a414"},"package":"5c8604503caa2cbcf271578dc51ca236d40e3b22e1514ffa2e638e2c39f6ad10"}
+\ No newline at end of file
++{"files":{"Cargo.toml":"6511b493b676ac3941d70477c91abec62642c3c9aab088ecdf4f733eef3f1faa","src/export.rs":"e23929cf6fb5542d29514fe668f3b3d836fad968eacd9c6fcba74c5cd9cf2b61","src/export/metadata.rs":"af89a9942c7c0c4043a3cd57d1e6bd71cde19005e1f9f246efac761f47eff6be","src/export/metadata/convert.rs":"81060fb3390165d77db021f44142a2f3f10882515f859d7393857083370f2d35","src/export/metadata/function.rs":"11833cabd37e7671c0a01944bec73b8892a15df814bbe4c26fdae57aad89a2ba","src/export/metadata/impl_.rs":"ecfdaa132f05dd946414281e52165ef19c90c0bfd76ec651d4ec86837bd41d1c","src/export/scaffolding.rs":"66939405063e56fc983126f249e2d7ddc3257cb045a738abd0cf813a4aafc59c","src/lib.rs":"ca77b437a58cfb3ddeb106d3c1c8378545c46ef241298e62ab1190c5136d1fb1","src/object.rs":"955b596f344304013692042bdc1760bbb1192ec33950b0dd2932cb8de94ec297","src/record.rs":"67a5c7ed6a448f7ad8f5c8e930c5e3007b2b0cac32f52cc8596bdae6fb3c816e","src/util.rs":"6389a9b4258808a3af168cf85658fb7c069172d5e528ee0e94210fa664f2a414"},"package":"c96a574677566f83ea8458dac1dd7792fd63e7c3f9dbcd865f0e8d6f8057b127"}
+\ No newline at end of file
+diff --git a/third_party/rust/uniffi_macros/Cargo.toml b/third_party/rust/uniffi_macros/Cargo.toml
+--- a/third_party/rust/uniffi_macros/Cargo.toml
++++ b/third_party/rust/uniffi_macros/Cargo.toml
+@@ -7,28 +7,27 @@
+ #
+ # If you are reading this file be aware that the original Cargo.toml
+ # will likely look very different (and much more reasonable).
+ # See Cargo.toml.orig for the original contents.
+
+ [package]
+ edition = "2021"
+ name = "uniffi_macros"
+-version = "0.21.0"
++version = "0.21.1"
+ authors = ["Firefox Sync Team <sync-team@mozilla.com>"]
+ description = "a multi-language bindings generator for rust (convenience macros)"
+ homepage = "https://mozilla.github.io/uniffi-rs"
+ documentation = "https://mozilla.github.io/uniffi-rs"
+ keywords = [
+ "ffi",
+ "bindgen",
+ ]
+ license = "MPL-2.0"
+ repository = "https://github.com/mozilla/uniffi-rs"
+-resolver = "2"
+
+ [lib]
+ proc-macro = true
+
+ [dependencies.bincode]
+ version = "1.3"
+
+ [dependencies.camino]
+@@ -55,17 +54,17 @@ features = [
+ "full",
+ "visit-mut",
+ ]
+
+ [dependencies.toml]
+ version = "0.5.9"
+
+ [dependencies.uniffi_build]
+-version = "=0.21.0"
++version = "=0.21.1"
+
+ [dependencies.uniffi_meta]
+-version = "=0.21.0"
++version = "=0.21.1"
+
+ [features]
+ builtin-bindgen = ["uniffi_build/builtin-bindgen"]
+ default = []
+ nightly = []
+diff --git a/third_party/rust/uniffi_meta/.cargo-checksum.json b/third_party/rust/uniffi_meta/.cargo-checksum.json
+--- a/third_party/rust/uniffi_meta/.cargo-checksum.json
++++ b/third_party/rust/uniffi_meta/.cargo-checksum.json
+@@ -1,1 +1,1 @@
+-{"files":{"Cargo.toml":"4a474782b3acac7e99435c0cfc6cd4790817ee5c15980b10dc927d95795b977f","src/lib.rs":"dc4c91763c01e8c09ef55cdb103bc02c7aba71c5660ba88f776a8a03a747d6e8"},"package":"cd9417cc653937681436b93838d8c5f97a5b8c58697813982ee8810bd1dc3b57"}
+\ No newline at end of file
++{"files":{"Cargo.toml":"4c34032ec5fadf8b996c671425d5afa38e0e5c223ab0b2ed3b44099fb78157d3","src/lib.rs":"a9854421f120e1c4a9d7d36bb006a4c5e7d2e054564f95aa9b6956e7ebb348fd"},"package":"729835442da829c9b6f7c111c76cf87b2498e129101203bec94f0c39a3296a38"}
+\ No newline at end of file
+diff --git a/third_party/rust/uniffi_meta/Cargo.toml b/third_party/rust/uniffi_meta/Cargo.toml
+--- a/third_party/rust/uniffi_meta/Cargo.toml
++++ b/third_party/rust/uniffi_meta/Cargo.toml
+@@ -7,22 +7,27 @@
+ #
+ # If you are reading this file be aware that the original Cargo.toml
+ # will likely look very different (and much more reasonable).
+ # See Cargo.toml.orig for the original contents.
+
+ [package]
+ edition = "2021"
+ name = "uniffi_meta"
+-version = "0.21.0"
++version = "0.21.1"
+ description = "uniffi_meta"
+ homepage = "https://mozilla.github.io/uniffi-rs"
+ keywords = [
+ "ffi",
+ "bindgen",
+ ]
+ license = "MPL-2.0"
+ repository = "https://github.com/mozilla/uniffi-rs"
+-resolver = "2"
+
+ [dependencies.serde]
+ version = "1.0.136"
+ features = ["derive"]
++
++[dependencies.siphasher]
++version = "0.3"
++
++[dependencies.uniffi_checksum_derive]
++version = "0.21.0"
+diff --git a/third_party/rust/uniffi_meta/src/lib.rs b/third_party/rust/uniffi_meta/src/lib.rs
+--- a/third_party/rust/uniffi_meta/src/lib.rs
++++ b/third_party/rust/uniffi_meta/src/lib.rs
+@@ -1,57 +1,127 @@
+ /* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+-use std::{
+- collections::hash_map::DefaultHasher,
+- hash::{Hash, Hasher},
+-};
++use std::hash::Hasher;
++pub use uniffi_checksum_derive::Checksum;
+
+ use serde::{Deserialize, Serialize};
+
+-#[derive(Clone, Debug, Hash, Deserialize, Serialize)]
++/// Similar to std::hash::Hash.
++///
++/// Implementations of this trait are expected to update the hasher state in
++/// the same way across platforms. #[derive(Checksum)] will do the right thing.
++pub trait Checksum {
++ fn checksum<H: Hasher>(&self, state: &mut H);
++}
++
++impl Checksum for bool {
++ fn checksum<H: Hasher>(&self, state: &mut H) {
++ state.write_u8(*self as u8);
++ }
++}
++
++impl Checksum for u64 {
++ fn checksum<H: Hasher>(&self, state: &mut H) {
++ state.write(&self.to_le_bytes());
++ }
++}
++
++impl Checksum for i64 {
++ fn checksum<H: Hasher>(&self, state: &mut H) {
++ state.write(&self.to_le_bytes());
++ }
++}
++
++impl<T: Checksum> Checksum for Box<T> {
++ fn checksum<H: Hasher>(&self, state: &mut H) {
++ (**self).checksum(state)
++ }
++}
++
++impl<T: Checksum> Checksum for [T] {
++ fn checksum<H: Hasher>(&self, state: &mut H) {
++ state.write(&(self.len() as u64).to_le_bytes());
++ for item in self {
++ Checksum::checksum(item, state);
++ }
++ }
++}
++
++impl<T: Checksum> Checksum for Vec<T> {
++ fn checksum<H: Hasher>(&self, state: &mut H) {
++ Checksum::checksum(&**self, state);
++ }
++}
++
++impl<T: Checksum> Checksum for Option<T> {
++ fn checksum<H: Hasher>(&self, state: &mut H) {
++ match self {
++ None => state.write(&0u64.to_le_bytes()),
++ Some(value) => {
++ state.write(&1u64.to_le_bytes());
++ Checksum::checksum(value, state)
++ }
++ }
++ }
++}
++
++impl Checksum for str {
++ fn checksum<H: Hasher>(&self, state: &mut H) {
++ state.write(self.as_bytes());
++ state.write_u8(0xff);
++ }
++}
++
++impl Checksum for String {
++ fn checksum<H: Hasher>(&self, state: &mut H) {
++ (**self).checksum(state)
++ }
++}
++
++#[derive(Clone, Debug, Checksum, Deserialize, Serialize)]
+ pub struct FnMetadata {
+ pub module_path: Vec<String>,
+ pub name: String,
+ pub inputs: Vec<FnParamMetadata>,
+ pub return_type: Option<Type>,
+ }
+
+ impl FnMetadata {
+ pub fn ffi_symbol_name(&self) -> String {
+ fn_ffi_symbol_name(&self.module_path, &self.name, checksum(self))
+ }
+ }
+
+-#[derive(Clone, Debug, Hash, Deserialize, Serialize)]
++#[derive(Clone, Debug, Checksum, Deserialize, Serialize)]
+ pub struct MethodMetadata {
+ pub module_path: Vec<String>,
+ pub self_name: String,
+ pub name: String,
+ pub inputs: Vec<FnParamMetadata>,
+ pub return_type: Option<Type>,
+ }
+
+ impl MethodMetadata {
+ pub fn ffi_symbol_name(&self) -> String {
+ let full_name = format!("impl_{}_{}", self.self_name, self.name);
+ fn_ffi_symbol_name(&self.module_path, &full_name, checksum(self))
+ }
+ }
+
+-#[derive(Clone, Debug, Hash, Deserialize, Serialize)]
++#[derive(Clone, Debug, Checksum, Deserialize, Serialize)]
+ pub struct FnParamMetadata {
+ pub name: String,
+ #[serde(rename = "type")]
+ pub ty: Type,
+ }
+
+-#[derive(Clone, Debug, PartialEq, Eq, PartialOrd, Ord, Hash, Deserialize, Serialize)]
++#[derive(Clone, Debug, PartialEq, Eq, PartialOrd, Ord, Checksum, Deserialize, Serialize)]
+ pub enum Type {
+ U8,
+ U16,
+ U32,
+ U64,
+ I8,
+ I16,
+ I32,
+@@ -73,63 +143,63 @@ pub enum Type {
+ ArcObject {
+ object_name: String,
+ },
+ Unresolved {
+ name: String,
+ },
+ }
+
+-#[derive(Clone, Debug, Hash, Deserialize, Serialize)]
++#[derive(Clone, Debug, Checksum, Deserialize, Serialize)]
+ pub struct RecordMetadata {
+ pub module_path: Vec<String>,
+ pub name: String,
+ pub fields: Vec<FieldMetadata>,
+ }
+
+-#[derive(Clone, Debug, Hash, Deserialize, Serialize)]
++#[derive(Clone, Debug, Checksum, Deserialize, Serialize)]
+ pub struct FieldMetadata {
+ pub name: String,
+ #[serde(rename = "type")]
+ pub ty: Type,
+ }
+
+-#[derive(Clone, Debug, Hash, Deserialize, Serialize)]
++#[derive(Clone, Debug, Checksum, Deserialize, Serialize)]
+ pub struct ObjectMetadata {
+ pub module_path: Vec<String>,
+ pub name: String,
+ }
+
+ impl ObjectMetadata {
+ /// FFI symbol name for the `free` function for this object.
+ ///
+ /// This function is used to free the memory used by this object.
+ pub fn free_ffi_symbol_name(&self) -> String {
+ let free_name = format!("object_free_{}", self.name);
+ fn_ffi_symbol_name(&self.module_path, &free_name, checksum(self))
+ }
+ }
+
+-/// Returns the last 16 bits of the value's hash as computed with [`DefaultHasher`].
++/// Returns the last 16 bits of the value's hash as computed with [`SipHasher13`].
+ ///
+ /// To be used as a checksum of FFI symbols, as a safeguard against different UniFFI versions being
+ /// used for scaffolding and bindings generation.
+-pub fn checksum<T: Hash>(val: &T) -> u16 {
+- let mut hasher = DefaultHasher::new();
+- val.hash(&mut hasher);
++pub fn checksum<T: Checksum>(val: &T) -> u16 {
++ let mut hasher = siphasher::sip::SipHasher13::new();
++ val.checksum(&mut hasher);
+ (hasher.finish() & 0x000000000000FFFF) as u16
+ }
+
+ pub fn fn_ffi_symbol_name(mod_path: &[String], name: &str, checksum: u16) -> String {
+ let mod_path = mod_path.join("__");
+ format!("_uniffi_{mod_path}_{name}_{checksum:x}")
+ }
+
+ /// Enum covering all the possible metadata types
+-#[derive(Clone, Debug, Hash, Deserialize, Serialize)]
++#[derive(Clone, Debug, Checksum, Deserialize, Serialize)]
+ pub enum Metadata {
+ Func(FnMetadata),
+ Method(MethodMetadata),
+ Record(RecordMetadata),
+ Object(ObjectMetadata),
+ }
+
+ impl From<FnMetadata> for Metadata {
+