Skip to content

Commit

Permalink
Fix issue 43: Add package name to RustBufferI if it needs it
Browse files Browse the repository at this point in the history
Signed-off-by: Kegan Dougal <[email protected]>
  • Loading branch information
kegsay authored and arg0d committed Mar 14, 2024
1 parent 880251c commit f262fb3
Show file tree
Hide file tree
Showing 10 changed files with 80 additions and 4 deletions.
15 changes: 15 additions & 0 deletions bindgen/src/gen_go/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -475,6 +475,21 @@ pub mod filters {
Ok(result)
}

// Return the Go package name for the given type, if it has one, followed by a '.'
// Returns the empty string if the type has no package name associated with it e.g primitive types.
//
// for multi-package bindings, it may be required to specify which
// RustBufferI should be used when creating completeFunc. Failure to
// specify the right package here will result in compilation errors.
pub fn maybe_namespace(type_: &impl AsType) -> Result<String, askama::Error> {
let type_label = oracle().find(type_).type_label();
if let Some((package_name, _)) = type_label.split_once(".") {
Ok(format!("{}.", package_name))
} else {
Ok(String::from(""))
}
}

/// FFI type name to be used to reference cgo types. Such that they exactly match to the cgo bindings and can be used with `//export`.
pub fn ffi_type_name_cgo_safe<T: Clone + Into<FfiType>>(
type_: &T,
Expand Down
2 changes: 1 addition & 1 deletion bindgen/templates/macros.go
Original file line number Diff line number Diff line change
Expand Up @@ -60,7 +60,7 @@
{% macro return_type_decl_async(func) %}
{%- match func.return_type() -%}
{%- when Some with (return_type) -%}
{{ return_type|ffi_type_name }}
{{return_type|maybe_namespace}}{{ return_type|ffi_type_name }}
{%- when None -%}
{%- endmatch %}
{%- endmacro %}
Expand Down
21 changes: 21 additions & 0 deletions binding_tests/issue43_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
/* 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/. */

package binding_tests

import (
"testing"

"github.com/NordSecurity/uniffi-bindgen-go/binding_tests/generated/issue43"
"github.com/stretchr/testify/assert"
)

// Ensure you can call async functions which return types in a different package.
// See https://github.com/NordSecurity/uniffi-bindgen-go/issues/43

func TestIssue43(t *testing.T) {
record := issue43.GetAsyncExternalType()
assert.Equal(t, record.Id, "foo")
assert.Equal(t, record.Tag, "bar")
}
1 change: 1 addition & 0 deletions fixtures/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -41,4 +41,5 @@ uniffi-go-fixture-destroy = { path = "destroy" }
uniffi-go-fixture-errors = { path = "errors" }
uniffi-go-fixture-name-case = { path = "name-case" }
uniffi-go-fixture-objects = { path = "objects" }
uniffi-go-fixture-issue43 = { path = "regressions/issue43" }
uniffi-go-fixture-issue45 = { path = "regressions/issue45" }
17 changes: 17 additions & 0 deletions fixtures/regressions/issue43/Cargo.toml
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
[package]
name = "uniffi-go-fixture-issue43"
version = "1.0.0"
edition = "2021"
publish = false

[lib]
crate-type = ["lib", "cdylib"]
name = "uniffi_go_issue43"

[dependencies]
uniffi = {path = "../../../3rd-party/uniffi-rs/uniffi"}
uniffi_macros = {path = "../../../3rd-party/uniffi-rs/uniffi_macros"}
uniffi-go-fixture-issue45 = {path = "../issue45"}

[build-dependencies]
uniffi_build = {path = "../../../3rd-party/uniffi-rs/uniffi_build", features=["builtin-bindgen"]}
7 changes: 7 additions & 0 deletions fixtures/regressions/issue43/build.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
/* 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/. */

fn main() {
uniffi_build::generate_scaffolding("./src/issue43.udl").unwrap();
}
1 change: 1 addition & 0 deletions fixtures/regressions/issue43/src/issue43.udl
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
namespace issue43 {};
13 changes: 13 additions & 0 deletions fixtures/regressions/issue43/src/lib.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
/* 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/. */

#[uniffi::export]
async fn get_async_external_type() -> uniffi_go_issue45::Record {
uniffi_go_issue45::Record {
id: "foo".to_string(),
tag: "bar".to_string(),
}
}

include!(concat!(env!("OUT_DIR"), "/issue43.uniffi.rs"));
6 changes: 3 additions & 3 deletions fixtures/regressions/issue45/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -3,9 +3,9 @@
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */

#[derive(uniffi::Record)]
struct Record {
id: String,
tag: String,
pub struct Record {
pub id: String,
pub tag: String,
}

// Ensure multiple futures packages work fine together, the other one being
Expand Down
1 change: 1 addition & 0 deletions fixtures/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,7 @@ mod uniffi_fixtures {
// Go specific
uniffi_go_destroy::uniffi_reexport_scaffolding!();
uniffi_go_errors::uniffi_reexport_scaffolding!();
uniffi_go_issue43::uniffi_reexport_scaffolding!();
uniffi_go_issue45::uniffi_reexport_scaffolding!();
uniffi_go_name_case::uniffi_reexport_scaffolding!();
uniffi_go_objects::uniffi_reexport_scaffolding!();
Expand Down

0 comments on commit f262fb3

Please sign in to comment.