From 26a029d407be480d791972afb5975cf62c9360a6 Mon Sep 17 00:00:00 2001 From: Daniel Baumann Date: Fri, 19 Apr 2024 02:47:55 +0200 Subject: Adding upstream version 124.0.1. Signed-off-by: Daniel Baumann --- .../uniffi-example-custom-types/src/lib.rs | 52 ++++++++++++++++++++++ 1 file changed, 52 insertions(+) create mode 100644 toolkit/components/uniffi-example-custom-types/src/lib.rs (limited to 'toolkit/components/uniffi-example-custom-types/src/lib.rs') diff --git a/toolkit/components/uniffi-example-custom-types/src/lib.rs b/toolkit/components/uniffi-example-custom-types/src/lib.rs new file mode 100644 index 0000000000..61aea7a11a --- /dev/null +++ b/toolkit/components/uniffi-example-custom-types/src/lib.rs @@ -0,0 +1,52 @@ +/* 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 url::Url; + +// Custom Handle type which trivially wraps an i64. +pub struct Handle(pub i64); + +// We must implement the UniffiCustomTypeConverter trait for each custom type on the scaffolding side +impl UniffiCustomTypeConverter for Handle { + // The `Builtin` type will be used to marshall values across the FFI + type Builtin = i64; + + // Convert Builtin to our custom type + fn into_custom(val: Self::Builtin) -> uniffi::Result { + Ok(Handle(val)) + } + + // Convert our custom type to Builtin + fn from_custom(obj: Self) -> Self::Builtin { + obj.0 + } +} + +// Use `url::Url` as a custom type, with `String` as the Builtin +impl UniffiCustomTypeConverter for Url { + type Builtin = String; + + fn into_custom(val: Self::Builtin) -> uniffi::Result { + Ok(Url::parse(&val)?) + } + + fn from_custom(obj: Self) -> Self::Builtin { + obj.to_string() + } +} + +// And a little struct and function that ties them together. +pub struct CustomTypesDemo { + url: Url, + handle: Handle, +} + +pub fn get_custom_types_demo(v: Option) -> CustomTypesDemo { + v.unwrap_or_else(|| CustomTypesDemo { + url: Url::parse("http://example.com/").unwrap(), + handle: Handle(123), + }) +} + +include!(concat!(env!("OUT_DIR"), "/custom-types.uniffi.rs")); -- cgit v1.2.3