Raw JSON report machine-readable
{
"data": {
"repo": {
"topics": [
"rust",
"swift",
"ffi",
"interop",
"ios"
],
"is_fork": false,
"size_kb": 7239,
"has_wiki": true,
"homepage": "https://chinedufn.github.io/swift-bridge",
"languages": {
"C": 1310,
"Rust": 1234454,
"Shell": 3321,
"Swift": 102500
},
"pushed_at": "2026-01-06T09:04:46Z",
"created_at": "2021-11-14T04:24:28Z",
"owner_type": "User",
"updated_at": "2026-07-18T12:28:55Z",
"description": "swift-bridge facilitates Rust and Swift interop.",
"is_archived": false,
"is_disabled": false,
"license_spdx": "Apache-2.0",
"default_branch": "master",
"license_spdx_raw": "Apache-2.0",
"primary_language": "Rust",
"significant_languages": [
"Rust"
]
},
"owner": {
"blog": "https://chinedufn.com",
"name": "Chinedu Francis Nwafili",
"type": "User",
"login": "chinedufn",
"company": null,
"location": "New Jersey",
"followers": 539,
"avatar_url": "https://avatars.githubusercontent.com/u/2099811?v=4",
"created_at": "2012-08-05T21:09:44Z",
"is_verified": null,
"public_repos": 106,
"account_age_days": 5101
},
"license": {
"state": "standard",
"spdx_id": "Apache-2.0",
"raw_spdx": "Apache-2.0",
"file_present": true,
"scorecard_found": true,
"profile_has_license": true
},
"activity": {
"releases": [
{
"tag": "0.1.59",
"kind": "patch",
"published_at": "2026-01-06T09:04:46Z"
},
{
"tag": "0.1.58",
"kind": "patch",
"published_at": "2025-12-06T16:06:29Z"
},
{
"tag": "0.1.57",
"kind": "patch",
"published_at": "2024-08-15T13:36:22Z"
},
{
"tag": "0.1.56",
"kind": "patch",
"published_at": "2024-08-08T09:34:25Z"
},
{
"tag": "0.1.55",
"kind": "patch",
"published_at": "2024-04-29T03:20:16Z"
},
{
"tag": "0.1.54",
"kind": "patch",
"published_at": "2024-04-28T17:52:24Z"
},
{
"tag": "0.1.53",
"kind": "patch",
"published_at": "2024-03-26T00:39:25Z"
},
{
"tag": "0.1.52",
"kind": "patch",
"published_at": "2023-07-10T12:14:46Z"
},
{
"tag": "0.1.51",
"kind": "patch",
"published_at": "2023-02-28T01:13:22Z"
},
{
"tag": "0.1.50",
"kind": "patch",
"published_at": "2023-02-20T18:06:23Z"
},
{
"tag": "0.1.49",
"kind": "patch",
"published_at": "2023-02-09T12:28:10Z"
},
{
"tag": "0.1.48",
"kind": "patch",
"published_at": "2023-01-29T19:37:47Z"
},
{
"tag": "0.1.47",
"kind": "patch",
"published_at": "2023-01-25T01:53:02Z"
},
{
"tag": "0.1.46",
"kind": "patch",
"published_at": "2023-01-19T16:26:39Z"
},
{
"tag": "0.1.45",
"kind": "patch",
"published_at": "2023-01-12T13:47:37Z"
},
{
"tag": "0.1.44",
"kind": "patch",
"published_at": "2022-12-15T21:19:14Z"
},
{
"tag": "0.1.43",
"kind": "patch",
"published_at": "2022-12-15T17:29:22Z"
},
{
"tag": "0.1.42",
"kind": "patch",
"published_at": "2022-12-15T02:12:36Z"
},
{
"tag": "0.1.41",
"kind": "patch",
"published_at": "2022-10-28T19:38:24Z"
},
{
"tag": "0.1.40",
"kind": "patch",
"published_at": "2022-10-03T21:51:47Z"
},
{
"tag": "0.1.39",
"kind": "patch",
"published_at": "2022-10-02T11:14:46Z"
},
{
"tag": "0.1.38",
"kind": "patch",
"published_at": "2022-09-20T23:32:50Z"
},
{
"tag": "0.1.37",
"kind": "patch",
"published_at": "2022-09-15T16:31:15Z"
},
{
"tag": "0.1.36",
"kind": "patch",
"published_at": "2022-08-23T17:14:30Z"
},
{
"tag": "0.1.35",
"kind": "patch",
"published_at": "2022-07-27T03:25:47Z"
},
{
"tag": "0.1.34",
"kind": "patch",
"published_at": "2022-06-06T20:15:45Z"
},
{
"tag": "0.1.33",
"kind": "patch",
"published_at": "2022-05-10T22:39:52Z"
},
{
"tag": "0.1.32",
"kind": "patch",
"published_at": "2022-04-24T04:31:18Z"
},
{
"tag": "0.1.31",
"kind": "patch",
"published_at": "2022-04-21T12:23:45Z"
},
{
"tag": "0.1.30",
"kind": "patch",
"published_at": "2022-04-20T01:55:03Z"
},
{
"tag": "0.1.29",
"kind": "patch",
"published_at": "2022-03-12T15:18:27Z"
},
{
"tag": "0.1.28",
"kind": "patch",
"published_at": "2022-02-17T02:22:59Z"
},
{
"tag": "0.1.27",
"kind": "patch",
"published_at": "2022-02-09T01:05:41Z"
},
{
"tag": "0.1.26",
"kind": "patch",
"published_at": "2022-02-02T15:49:36Z"
},
{
"tag": "0.1.25",
"kind": "patch",
"published_at": "2022-01-28T20:39:24Z"
},
{
"tag": "0.1.24",
"kind": "patch",
"published_at": "2022-01-26T13:19:13Z"
},
{
"tag": "0.1.23",
"kind": "patch",
"published_at": "2022-01-25T12:56:45Z"
},
{
"tag": "0.1.22",
"kind": "patch",
"published_at": "2022-01-25T01:35:25Z"
},
{
"tag": "0.1.21",
"kind": "patch",
"published_at": "2022-01-24T21:03:39Z"
},
{
"tag": "0.1.20",
"kind": "patch",
"published_at": "2022-01-22T19:56:11Z"
},
{
"tag": "0.1.19",
"kind": "patch",
"published_at": "2022-01-17T11:49:36Z"
},
{
"tag": "v0.1.18",
"kind": "patch",
"published_at": "2022-01-17T09:29:43Z"
}
],
"recent_commits": [
{
"oid": "e527dc7454bebbfab537d842990bf3a1672e676c",
"body": null,
"is_bot": false,
"headline": "0.1.59",
"author_name": "Chinedu Francis Nwafili",
"author_login": "chinedufn",
"committed_at": "2026-01-06T09:00:54Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "ea55b2a5a25e6e05ea25505d2890d09d79457c89",
"body": "Add Swift 6 strict concurrency compatibility for generated async function code\nAdd `@MainActor` to test classes using XCTContext.runActivity\nAdd CI matrix to test with both Swift 5.0 and Swift 6.0",
"is_bot": false,
"headline": "Add Swift 6 compatibility for async function code generation (#362)",
"author_name": "Vladimir Pankratov",
"author_login": "Choochmeque",
"committed_at": "2026-01-06T08:49:54Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "82b08851a9a6ebeed8fd6084f1a41176d904fae5",
"body": "Just cosmetic fix. It removes warning of non-camel case type.\n\n<img width=\"845\" height=\"310\" alt=\"image\" src=\"https://github.com/user-attachments/assets/34189676-cb3c-4fd5-b4cd-e7e361308a0c\" />",
"is_bot": false,
"headline": "Fix non camel case warning ffi types (#361)",
"author_name": "Vladimir Pankratov",
"author_login": "Choochmeque",
"committed_at": "2025-12-19T15:05:01Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "b80238fd55e9ffedfabfafb134bd93b1920ff7f6",
"body": "Adds support for Option<String> fields in shared structs.\n\n## Example\n\n```rust\n// rust\n#[swift_bridge::bridge]\nmod ffi {\n #[swift_bridge(swift_repr = \"struct\")]\n struct UserProfile {\n name: String,\n bio: Option<String>, // Now supported!\n }\n\n extern \"Rust\" {\n fn cre\n[…]\nNone value \nlet profileWithoutBio = UserProfile(\n name: \"Bob\".intoRustString(),\n bio: nil\n)\n\n// Access optional field\nif let bio = profileWithBio.bio {\n print(\"Bio: \\(bio.toString())\")\n}\n```",
"is_bot": false,
"headline": "Support `Option<String>` fields in shared structs (#354)",
"author_name": "Vladimir Pankratov",
"author_login": "Choochmeque",
"committed_at": "2025-12-08T12:59:02Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "69bda0e98df3d8df67bb9367e979ad7d96d230d4",
"body": "- Add support for calling async Swift functions that throw errors from Rust and return void\n- Swift throwing functions are mapped to Rust Result<(), E> return type\n\n## Example\n\n```rust\n// rust\n#[swift_bridge::bridge]\nmod ffi {\n enum SwiftError {\n SomeError,\n }\n\n extern \"Swift\" {\n \n[…]\n: Bool) -> Result<(), SwiftError>;\n }\n}\n```\n\n```swift\n// swift\nfunc swift_throwing_function_void(succeed: Bool) throws(SwiftError) {\n if !succeed {\n throw SwiftError.SomeError\n }\n}\n```",
"is_bot": false,
"headline": "Support Rust calls Swift async throwing function (#348)",
"author_name": "Vladimir Pankratov",
"author_login": "Choochmeque",
"committed_at": "2025-12-08T11:50:58Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "aee3e37e2990a252aea234ed5734165afc32df6e",
"body": null,
"is_bot": false,
"headline": "0.1.58",
"author_name": "Chinedu Francis Nwafili",
"author_login": "chinedufn",
"committed_at": "2025-12-08T11:50:58Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "81e1aa0b83aa89c2b615ff32ae0a3558930b3850",
"body": "This commit makes the README's example demonstrate support of Rust\ncalling an async Swift function.",
"is_bot": false,
"headline": "Add async function demo to README",
"author_name": "Chinedu Francis Nwafili",
"author_login": "chinedufn",
"committed_at": "2025-12-07T10:50:05Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "8d764dacf2a7ffec52e34edb3aa9e858b46cc397",
"body": "Adds #[swift_bridge(label = \"...\")] attribute for swift function parameters (fixes #337)\n\n## Example:\n\n```rust\n// rust\nextern \"Swift\" {\n fn swift_func_with_unlabeled_params(\n #[swift_bridge(label = \"_\")] a: i32,\n #[swift_bridge(label = \"_\")] b: i32,\n ) -> i32;\n\n fn swift_func_\n[…]\nswift\nfunc swift_func_with_unlabeled_params(_ a: Int32, _ b: Int32) -> Int32 {\n return a + b\n}\n\nfunc swift_func_with_custom_labels(first a: Int32, second b: Int32) -> Int32 {\n return a + b\n}\n```",
"is_bot": false,
"headline": "Support Swift function argument labels (#349)",
"author_name": "Vladimir Pankratov",
"author_login": "Choochmeque",
"committed_at": "2025-12-06T15:25:08Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "15062f374b1cc85b8c8ab5da3b70cf2e0bd53a63",
"body": "- Add support for calling synchronous Swift functions that throw errors from Rust\n- Swift throwing functions are mapped to Rust Result<T, E> return types (T = void also supported)\n\n## Example\n\n```rust\n// rust\n#[swift_bridge::bridge]\nmod ffi {\n enum SwiftError {\n SomeError,\n }\n\n exter\n[…]\neturn 42\n } else {\n throw SwiftError.SomeError\n }\n}\n\nfunc swift_throwing_function_void(succeed: Bool) throws(SwiftError) {\n if !succeed {\n throw SwiftError.SomeError\n }\n}\n```",
"is_bot": false,
"headline": "Support call Swift throwing function from Rust (#347)",
"author_name": "Vladimir Pankratov",
"author_login": "Choochmeque",
"committed_at": "2025-12-05T00:31:13Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "f69a5e633a12094a309cc959168e144c5c68841f",
"body": "This enables Rust code to call async Swift functions declared in\nextern \"Swift\" blocks (fixes #345). The implementation uses a callback-based\napproach where:\n\n- Rust generates an async wrapper that creates a oneshot channel\n- Swift wraps the call in Task { } and invokes callbacks on completion\n- Sup\n[…]\nror {}\n\nfunc fetch_count() async -> UInt32 {\n return 42\n}\n\nfunc fetch_data(succeed: Bool) async throws(FetchError) -> UInt32 {\n if !succeed { throw FetchError.NetworkError }\n return 123\n}\n```",
"is_bot": false,
"headline": "Support call async Swift function from Rust (#346)",
"author_name": "Vladimir Pankratov",
"author_login": "Choochmeque",
"committed_at": "2025-12-01T21:23:49Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "09171dcad46d7f55a1eb823ee4e6fa679dbdea07",
"body": "This commit fixes #334, adding support for generating a Hashable conformance for Copy types.\n\nFor example, the following is now possible:\n\n```rust\nextern \"Rust\" {\n #[swift_bridge(Copy(8), Equatable, Hashable)]\n type T;\n}\n```",
"is_bot": false,
"headline": "Generate Hashable conformance for Copy types (#339)",
"author_name": "Jonathan Tanner",
"author_login": "aDifferentJT",
"committed_at": "2025-10-26T14:32:16Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "93da216d126987bb89cea8765dab0934a33d9955",
"body": "This commit adds documentation to the internal book explaining why pull\nrequests should not simply link to existing issues.\n\nThe pull request must also include enough information for a maintainer\nto understand the change while working offline.",
"is_bot": false,
"headline": "Clarify why linking to issues is not enough (#343)",
"author_name": "Chinedu Francis Nwafili",
"author_login": "chinedufn",
"committed_at": "2025-10-11T23:43:30Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "36193c8a8fe68586b328c3e5b9dc9d6e401271a3",
"body": "This commit adds documentation explaining our expectations of pull\nrequest titles and bodies.",
"is_bot": false,
"headline": "Document pull request guidelines (#342)",
"author_name": "Chinedu Francis Nwafili",
"author_login": "chinedufn",
"committed_at": "2025-10-11T23:25:01Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "5350b061aeb3d06463b2bddefe71a412c7630a3e",
"body": "Without this fix I get errors like the following under Swift 6:\n\n```\n/home/colinmarc/dev/swift-bridge/integration-tests/Sources/SharedLib/Generated/SharedLib.swift:4159:26: error: sending 'rustFnRetVal' risks causing data races\n4157 | return try await withCheckedThrowingContinuation({ (continuat\n[…]\nask-isolated uses\n4160 | }\n4161 |\n```\n\nI avoided adding `Sendable` for `RustString` since that's being discussed in #296 and elsewhere. Instead, I commented it out and left a TODO.\n\nFixes #311",
"is_bot": false,
"headline": "Add Sendable to all async return types in tests (#312)",
"author_name": "Colin Marc",
"author_login": "colinmarc",
"committed_at": "2025-08-27T22:42:37Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "455e98639c714a576bf2c4c6467336a47bc06570",
"body": "This commit adds an `@unchecked Sendable` protocol implementation for\nthe `RustString` class, as well as documentation explaining that this is\nthread safe so long as the rules outlined in the book's `Safety` chapter\nare upheld.\n\nThe following code now compiles:\n```swift\nlet rustString = RustString(\"hello world\")\n\nThread.detachNewThread {\n XCTAssertEqual(rustString.len(), 11)\n}\n```",
"is_bot": false,
"headline": "Implement Sendable for `RustString` (#330)",
"author_name": "Chinedu Francis Nwafili",
"author_login": "chinedufn",
"committed_at": "2025-08-27T22:24:38Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "840235cbcc16d66329f7c49efa8136c2d66b3851",
"body": "`SwiftBirdgeCore` -> `SwiftBridgeCore`",
"is_bot": false,
"headline": "Fix typo in `.expect` message for copying `SwiftBridgeCore.h` (#329)",
"author_name": "Chris Krycho",
"author_login": "chriskrycho",
"committed_at": "2025-05-26T16:51:43Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "73dcc32753975120797090e5edfcef225347abca",
"body": "Allows automatic use of `==` on opaque (`extern \"Rust\"`) copyable types. The correct code was already being generated for the Rust crate and C header, but was not exposed in Swift code.\n\nFor the given bridge module declaration:\n```rust\n// Rust\n#[swift_bridge::bridge]\nmod ffi {\n extern \"Rust\" {\n \n[…]\n does not need to be heap-allocated\nlet x = SomeOpaqueBytes(initWith: ~)\nlet y = SomeOpaqueBytes(initSomeOtherWay: ~)\n\n// With this PR, we can now compare them with `==`\nif x == y { // <--\n ~\n}\n```",
"is_bot": false,
"headline": "Support `Equatable` on Rust `Copy` types (#328)",
"author_name": "pearfalse",
"author_login": "pearfalse",
"committed_at": "2025-05-26T16:51:16Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "0a0b44eddeb215e39fafa3fbdeb81aab61d64515",
"body": "Closes https://github.com/chinedufn/swift-bridge/issues/107",
"is_bot": false,
"headline": "Support Linux in `rust-binary-calls-swift-package` example (#297)",
"author_name": "Terraputix",
"author_login": "terraputix",
"committed_at": "2025-02-11T07:29:32Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "864cb4ee4f3d0efb0f03b62d679f7dc18a3f99e2",
"body": "This commit adds documentation explaining that there is is no zero-copy\r\nway to create a Swift `String`.\r\n\r\nWe also add documentation explaining that the reason the `RustString`\r\ntype exists is to avoid the implicit allocation that would be required\r\nif we automatically converted Rust's `std::string::String` to Swift's\r\n`String`.\r\n\r\nWe also document some potential new attributes that would allow users to\r\nopt into automatically converted from a `Rust std::string::String` to a\r\nSwift String.",
"is_bot": false,
"headline": "Document Swift String copying (#318)",
"author_name": "Chinedu Francis Nwafili",
"author_login": "chinedufn",
"committed_at": "2025-02-06T14:05:20Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "4827500b2caccaac1ca078762dd24a9c16f24429",
"body": "This commit introduces a new `#[swift_bridge(Sendable)]`\r\nattribute that emits Swift `Sendable` implementations for opaque\r\nRust types, and Rust `Send + Sync` implementations for opaque\r\nSwift types.\r\n\r\nThese implementations are checked at compile time.\r\n\r\nExample usage:\r\n```rust\r\nmod ffi {\r\n extern \"Rust\" {\r\n #[swift_bridge(Sendable)]\r\n type MyRustType;\r\n }\r\n\r\n extern \"Swift\" {\r\n #[swift_bridge(Sendable)]\r\n type MySwiftType;\r\n }\r\n}\r\n```",
"is_bot": false,
"headline": "Add `#[swift_bridge(Sendable)]` attribute (#317)",
"author_name": "Chinedu Francis Nwafili",
"author_login": "chinedufn",
"committed_at": "2025-02-04T17:23:45Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "c15279c5a412fbc597e6831673b6bf850ddb4217",
"body": "This commit introduces a\r\n\"Minimum Supported Swift Version\" policy to help users understand\r\nwhether their code is guaranteed to work on a particular version of\r\nSwift.\r\n\r\nAs a starting point, we are supporting Swift 6.0+ .\r\n\r\nStarting at `6.0` allows us to begin leveraging Swift's new ownership\r\nfe\n[…]\n certain safety requirements.\r\n\r\nSee the `Safety` chapter in the internal book for more information about\r\nsafety requirements that, by leveraging Swift 6.0, we will be able to\r\nautomatically enforce.",
"is_bot": false,
"headline": "Add Minimum Supported Swift Version Policy (#316)",
"author_name": "Chinedu Francis Nwafili",
"author_login": "chinedufn",
"committed_at": "2025-02-02T16:43:33Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "a661800559c8aec75e5959b2f4701828639e6c06",
"body": "This commit introduces a new attribute that can be used to enable\r\nexperimental support for Swift ownership.\r\n\r\nThe new `__experimental_swift_ownership` can be used on an opaque Rust\r\ntype.\r\n\r\n```rust\r\n#[swift_bridge::bridge]\r\nmod foo {\r\n extern \"Rust\" {\r\n #[swift_bridge(__experimental_swi\n[…]\n` protocol to ensure that\r\nwhen Swift has ownership over an opaque Rust type it cannot copy that\r\nhandle, which should make attempts to use-after-free a compile-time\r\nerror instead of a runtime error.",
"is_bot": false,
"headline": "Add attribute for Swift ownership support (#314)",
"author_name": "Chinedu Francis Nwafili",
"author_login": "chinedufn",
"committed_at": "2025-02-02T11:42:26Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "225380ed46cac687ebfec359fc8b5d9d5f764801",
"body": "This commit introduces an example of using multiple bridge modules in a\r\nproject.",
"is_bot": false,
"headline": "Add multiple-bridge-modules example (#302)",
"author_name": "Chinedu Francis Nwafili",
"author_login": "chinedufn",
"committed_at": "2024-11-16T20:27:37Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "d64db649d3670741b1c73f4915f06ae278977429",
"body": "This commit introduces documentation explaining why `swift-bridge` uses\r\na bridge module design, as opposed to, say, a design where users\r\nannotate their types with proc macro attributes.",
"is_bot": false,
"headline": "Document motivation for bridge module (#301)",
"author_name": "Chinedu Francis Nwafili",
"author_login": "chinedufn",
"committed_at": "2024-11-16T19:52:22Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "c45a38cf8730013a6a03af2184df0831f523b1a6",
"body": "Support Rust returning `-> Result<_, String>`, e.g.:\r\n\r\n```rust\r\n#[swift_bridge::bridge]\r\nmod ffi {\r\n extern \"Rust\" {\r\n fn do_fallible_work() -> Result<(), String>;\r\n }\r\n}\r\n```\r\n\r\n---\r\n\r\nIncorporate the changes from #282 to implement swift's `Error` protocol for ruststring, & extend them with the tests requested in https://github.com/chinedufn/swift-bridge/issues/295#issuecomment-2411049833",
"is_bot": false,
"headline": "Support Rust returning `-> Result<_, String>` (#296)",
"author_name": "Britt",
"author_login": "brittlewis12",
"committed_at": "2024-10-14T20:20:31Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "0698b41d0434c6036f4d13a921677dcdfdde34dc",
"body": "This commit adds a `[package] name = \"...\"` entry to the example `Cargo.toml` file in the `Swift Packages` chapter of the book.\r\n\r\nThis prevents the example crate from being interpreted as a virtual manifest.\r\nThis is important because a Cargo virtual manifest cannot have a `[lib]` section.",
"is_bot": false,
"headline": "Add package name to example Cargo.toml (#290)",
"author_name": "Seto Elkahfi",
"author_login": "setoelkahfi",
"committed_at": "2024-08-26T15:17:42Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "9cfb0aa8c930fc79fa14d260f3567e6898db689b",
"body": null,
"is_bot": false,
"headline": "0.1.57",
"author_name": "Chinedu Francis Nwafili",
"author_login": "chinedufn",
"committed_at": "2024-08-15T13:31:12Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "1b547a5f0ca976d711e6671b8d70d06113e916c4",
"body": "This PR implements throwing initializers. See: https://docs.swift.org/swift-book/documentation/the-swift-programming-language/errorhandling/.\r\n\r\nHere's an example of using this feature:\r\n\r\n```rust\r\n// Rust\r\n#[swift_bridge::bridge]\r\nmod ffi {\r\n enum ResultTransparentEnum {\r\n NamedField { da\n[…]\n -> i32;\r\n }\r\n}\r\n```\r\n\r\n```swift\r\n// Swift\r\ndo {\r\n let throwingInitializer = try ThrowingInitializer(false)\r\n} catch let error as ResultTransparentEnum {\r\n //...\r\n} catch {\r\n //...\r\n}\r\n```",
"is_bot": false,
"headline": "Support throwing initializers (#287)",
"author_name": "Niwaka",
"author_login": "NiwakaDev",
"committed_at": "2024-08-15T10:19:04Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "495611ba39bc6b08838408751b92f6329b98f321",
"body": "Related to #235.\r\n\r\nThis PR supports failable initializers.\r\n\r\nSomething like:\r\n\r\n```rust\r\n// Rust side\r\n#[swift_bridge::bridge]\r\nmod ffi {\r\n extern \"Rust\" {\r\n #[swift_bridge(Equatable)]\r\n type FailableInitType;\r\n\r\n #[swift_bridge(init)]\r\n fn new() -> Option<FailableIn\n[…]\n ~\r\n} else {\r\n ~\r\n}\r\n```\r\n\r\nSee: [Swift Documentation - Failable Initializers](https://docs.swift.org/swift-book/documentation/the-swift-programming-language/initialization/#Failable-Initializers)",
"is_bot": false,
"headline": "Support failable initializers (#276)",
"author_name": "Niwaka",
"author_login": "NiwakaDev",
"committed_at": "2024-08-08T22:57:57Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "d2c09e2e602a3dd9a2d0ff6c9298f77b2a4b5eeb",
"body": null,
"is_bot": false,
"headline": "0.1.56",
"author_name": "Chinedu Francis Nwafili",
"author_login": "chinedufn",
"committed_at": "2024-08-08T09:21:41Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "d3d2da4e01bcf321fe32d6b07c5dfff94ee48fa8",
"body": "This commit upgrades the macOS CI runners from v11 to v14.\r\n\r\nGitHub has discontinued v11, so our CI was failing before this commit.",
"is_bot": false,
"headline": "Upgrade macOS CI runners (#285)",
"author_name": "Chinedu Francis Nwafili",
"author_login": "chinedufn",
"committed_at": "2024-08-01T20:43:52Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "37ac2c2627362d65edb7cce06705d27ad6acf066",
"body": "This commit makes `#[swift_bridge::bridge]` respect the bridge module's visibility.\r\n\r\nHere's an example of using this.\r\n\r\n```rust\r\n// enums.rs\r\n\r\n// NOTE that we can now use `pub mod`, `pub(crate) mod`, etc\r\n#[swift_bridge::bridge]\r\npub mod ffi {\r\n enum MyEnum {\r\n VariantA,\r\n Varia\n[…]\nms;\r\nuse enums::ffi::MyEnum;\r\n\r\n#[swift_bridge::bridge]\r\nmod ffi {\r\n #[swift_bridge(already_declared)]\r\n enum MyEnum {}\r\n\r\n extern \"Rust\" {\r\n fn getEnum() -> MyEnum;\r\n }\r\n}\r\n```\r\n\r\nCloses #252.",
"is_bot": false,
"headline": "Apply input module visibility to output module (#284)",
"author_name": "Joshua Booth",
"author_login": "jnbooth",
"committed_at": "2024-07-30T22:12:20Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "34ce1ffb6bc5a54730bf60cf177042e1f4e479ff",
"body": "…pe>` (#278)\n\nIn Rust 1.79.0, dead code warnings are emitted from enums where the compiler does not infer that wrapped data is used, even when the enum has been annotated with `#[repr(C]`. This warning triggers in `swift-bridge` when defining transparent structs or enums that will be returned in err\n[…]\n, self)\r\n }\r\n}\r\n\r\nimpl std::fmt::Display for ffi:: TransparentErrorStruct {\r\n fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {\r\n write!(f, \"{}\", self.0)\r\n }\r\n}\r\n```",
"is_bot": false,
"headline": "Suppress dead_code warning when returning `-> Result<*, TransparentTy…",
"author_name": "Eric Saxby",
"author_login": "sax",
"committed_at": "2024-06-21T08:59:10Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "717fcef70d3c293c2fd8b962ad678da18b10a3c3",
"body": "## What's this?\r\n\r\nA new `parse-bridges` subcommand.\r\nAlso, an update to the documentation in the example showing this feature's preview.\r\n\r\nThis is handy for usage in higher-level build systems.\r\nFor example, in my case, I build both Rust and Swift with CMake, and having this CLI command implemente\n[…]\nesome-crate -f src/lib.rs -o generated\r\n```\r\n\r\nMultiple files:\r\n```shell\r\nswift-bridge-cli parse-bridges --crate-name my-superb-crate \\\r\n-f src/lib.rs \\\r\n-f src/some_other_file.rs \\\r\n-o generated\r\n```",
"is_bot": false,
"headline": "Add parse-bridges CLI subcommand (#274)",
"author_name": "Maksym",
"author_login": "integer-overflown",
"committed_at": "2024-06-16T01:33:17Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "ef01d21001914b79e0384627535098e15f87f096",
"body": null,
"is_bot": false,
"headline": "0.1.55",
"author_name": "Chinedu Francis Nwafili",
"author_login": "chinedufn",
"committed_at": "2024-04-29T03:16:57Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "87dbea3c28d4a96d9195bd3a70fdecfd85fd8f5c",
"body": "This commit fixes a memory leak when passing `Option<SwiftType>` to\r\n`extern \"Rust\"` functions.\r\n\r\nFor example, the following bridge module would lead to memory leaks:\r\n\r\n```rust\r\n#[swift_bridge::bridge]\r\nmod ffi {\r\n extern \"Swift\" {\r\n type SomeSwiftType;\r\n }\r\n\r\n extern \"Rust\" {\r\n \n[…]\ne on the Swift side\r\n\r\n- Pass `Option<SwiftType>` to Rust. Retain count is now 2\r\n\r\n- Rust passes ownership back to Swift. Retain count is now 1\r\n\r\n- Retain count never hits 0. Memory has been leaked.",
"is_bot": false,
"headline": "Fix memory leak for `Option<SwiftType>` (#273)",
"author_name": "Chinedu Francis Nwafili",
"author_login": "chinedufn",
"committed_at": "2024-04-29T03:14:50Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "b4ba1a72a682c3917d78d6650ffb249c7109999b",
"body": "This commit replaces calls to `pointer::cast` with explicit casting via\n`as *mut SomeType`.\n\nThis reduces the likelihood of our codegen generating unsound code that\ncasts a pointer to the wrong type.",
"is_bot": false,
"headline": "Use explicit pointer casting",
"author_name": "Chinedu Francis Nwafili",
"author_login": "chinedufn",
"committed_at": "2024-04-29T02:11:46Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "9d02d8f4e8e0b1482e79cdceea9343456a6d4d57",
"body": null,
"is_bot": false,
"headline": "0.1.54",
"author_name": "Chinedu Francis Nwafili",
"author_login": "chinedufn",
"committed_at": "2024-04-28T17:49:54Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "636fa2774870c052a18f06d98ca5f6966c09bdd6",
"body": "This adds support for bridging `Option<OpaqueSwiftType>` in `extern \"Rust\"` functions. This fixes #268, and makes the following now possible:\r\n\r\n```rs\r\n#[swift_bridge::bridge]\r\nmod ffi {\r\n extern \"Swift\" {\r\n type SomeSwiftType;\r\n }\r\n\r\n extern \"Rust\" {\r\n fn option_arg(arg: Option<SomeSwiftType>);\r\n fn returns_option() -> Option<SomeSwiftType>;\r\n }\r\n}\r\n```",
"is_bot": false,
"headline": "Support Option<OpaqueSwiftType> (#272)",
"author_name": "BrightShard",
"author_login": "Bright-Shard",
"committed_at": "2024-04-28T14:54:35Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "c3c950c90867550e09a24c94357f1e502bf6d69d",
"body": "This commit inlines some of the example code in the book.\n\nThis makes it easier to read book chapters using any text viewer, as\nopposed to needing to use `mdbook`.",
"is_bot": false,
"headline": "Inline example code in book",
"author_name": "Chinedu Francis Nwafili",
"author_login": "chinedufn",
"committed_at": "2024-04-23T07:15:28Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "75a1077f1661ad048398a850226472c3310abc47",
"body": null,
"is_bot": false,
"headline": "Improve signature support docs (#267)",
"author_name": "Chinedu Francis Nwafili",
"author_login": "chinedufn",
"committed_at": "2024-04-09T11:47:44Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "7fc3d3ccca618f3f231fc6f8a7678ad119ca99b0",
"body": "This commit adds documentation that explains the `ToRustStr` protocol.",
"is_bot": false,
"headline": "Document the ToRustStr protocol (#266)",
"author_name": "Chinedu Francis Nwafili",
"author_login": "chinedufn",
"committed_at": "2024-04-09T11:27:20Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "04e6abf522119fd11cf2e6f8b44172794eae11d2",
"body": null,
"is_bot": false,
"headline": "0.1.53",
"author_name": "Chinedu Francis Nwafili",
"author_login": "chinedufn",
"committed_at": "2024-03-26T00:38:58Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "58f4a40f96bb050607c746376422ab3c62e0e771",
"body": "This commit adds support for passing `Option<String>` to and from\r\n`extern \"Swift\"` functions, as well as for passing `Option<&str>` to\r\nextern \"Swift\" functions.\r\n\r\nFor example, the following is now possible:\r\n\r\n```rust\r\n#[swift_bridge::bridge]\r\nmod ffi {\r\n extern \"Swift\" {\r\n fn opt_strin\n[…]\npt_str_function(arg: Option<&str>);\r\n }\r\n}\r\n```\r\n\r\nNote that you can not yet return `-> Option<&str>` from Swift.\r\n\r\nThis is an uncommon use case, so we're waiting until someone actually\r\nneeds it.",
"is_bot": false,
"headline": "Swift Option<String> and Option<&str> (#264)",
"author_name": "Chinedu Francis Nwafili",
"author_login": "chinedufn",
"committed_at": "2024-03-26T00:37:55Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "53b118d17f2f1a2922e969de528b99a2ffbc7dde",
"body": "Add test cases for Option<&T> and fix rust codegen\r\n\r\nCurrently swift-bridge only has tests for Option<T> - this adds test\r\ncases for Option<&T> and fixes a bug in rust codegen that does not\r\ncorrectly translate Option<&T>.\r\n\r\nThis is now possible:\r\n\r\n```rust\r\nmod ffi {\r\n extern \"Rust\" {\r\n type SomeType;\r\n\r\n fn my_func(arg: Option<&SomeType>) -> Option<&SomeType>;\r\n }\r\n}\r\n```",
"is_bot": false,
"headline": "Add test cases for Option<&T> and fix rust codegen (#257)",
"author_name": "Peter Farr",
"author_login": "PrismaPhonic",
"committed_at": "2024-03-15T00:55:20Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "dd5bef56af28db4f1a1244d86115def6abede931",
"body": "This commit fixes an `improper_ctypes` warning when bridging transparent\r\nstructs that contain non FFI safe types.\r\n\r\nWhile transparent structs that contained non FFI safe types were being\r\npassed in an FFI safe way before this commit, the Rust compiler could\r\nnot know that what we were doing was FF\n[…]\nield: *mut std::string::RustString\r\n}\r\n```\r\nwas triggering a warning because the Rust compiler can't know that the\r\nnon-FFI safe `std::string::RustString` is not being dereferenced on the\r\nSwift side.",
"is_bot": false,
"headline": "Fix `improper_ctypes` warning (#254)",
"author_name": "Chinedu Francis Nwafili",
"author_login": "chinedufn",
"committed_at": "2024-03-08T02:43:51Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "48195b550d5d92073550aded61f0504088067477",
"body": "This cmmit removes an unnecessary call to `Deref::deref`.\n\nThis fixes a warning that was causing CI to fail.",
"is_bot": false,
"headline": "Remove unnecessary `.deref()`",
"author_name": "Chinedu Francis Nwafili",
"author_login": "chinedufn",
"committed_at": "2024-02-14T15:23:47Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "9746f311ce666ffd51676cabfe2a8adeb7b7cdd4",
"body": null,
"is_bot": false,
"headline": "Fix typos in Vec<-->RustVec docs (#251)",
"author_name": "Gabbi Fisher",
"author_login": "gabbifish",
"committed_at": "2024-02-01T20:12:15Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "a8059a445355200cca0e065cf45fb5a131b5b56e",
"body": "in build-swiftc-links-rust.sh, the command\r\nswiftc -L target/x86_64-apple-darwin/debug/ -lswift_and_rust -import-objc-header bridging-header.h \\\r\n main.swift lib.swift ./generated/swift-and-rust/swift-and-rust.swift \r\nis missing the source ./generated/SwiftBridgeCore.swift",
"is_bot": false,
"headline": "Fix compilation source in documentation (#250)",
"author_name": "ItamarMu",
"author_login": "ItamarMu",
"committed_at": "2024-01-30T19:16:55Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "0614ba7d6d99c5b961b0e80fdbac84ce32551ae1",
"body": "This commit removes the `Array.toUnsafeBufferPointer` usage from the\ndocumentation.\nThis was a method that we used to have but removed in a previous commit.\n\nSwift pointers have lifetimes that can be shorter than the lifetime of\nthe object that they are pointing to, so the returned pointer could\nunpredictably become a dangling pointer.\n\nThe documentation has been updated with an alternative approach to\npassing a Swift buffer pointer to Rust.",
"is_bot": false,
"headline": "Remove `Array.toUnsafeBufferPointer`",
"author_name": "Chinedu Francis Nwafili",
"author_login": "chinedufn",
"committed_at": "2024-01-26T23:15:20Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "d527f3231636ab7188a8ae02245cd1f9db1511de",
"body": "The panic message now contains the name of the unsupported attribute as well\r\nas the name of the struct that the attribute was found on.\r\n\r\nThis commit also updates the documentation to fix faulty struct attributes.",
"is_bot": false,
"headline": "Improve error message for unsupported attribute (#244)",
"author_name": "Erik Živković",
"author_login": "bes",
"committed_at": "2023-09-10T19:08:11Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "af962ca051ba15b81794575a0837f1e2abde9984",
"body": null,
"is_bot": false,
"headline": "0.1.52",
"author_name": "Chinedu Francis Nwafili",
"author_login": "chinedufn",
"committed_at": "2023-07-10T12:12:45Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "27246447b4ac741b8bf086d3dfca15b47558e44f",
"body": "Related to #201. This commit adds support `RustString` in extern Swift functions.\r\n\r\nHere's an example of using this.\r\n\r\n```Swift\r\n//Swift\r\nfunc reflect_swift_string(arg: RustString) -> RustString {\r\n arg\r\n}\r\n\r\n```\r\n\r\n```Rust\r\n//Rust\r\n#[swift_bridge::bridge]\r\nmod ffi {\r\n extern \"Swift\" {\r\n \n[…]\n fn reflect_swift_string(arg: String) -> String;\r\n }\r\n}\r\n\r\nlet foo = \"foo\";\r\nlet string = ffi::reflect_swift_string(foo.to_string());\r\nassert_eq!(string.len(), 3);\r\nassert_eq!(&string, foo);\r\n```",
"is_bot": false,
"headline": "Support `RustString` in extern Swift functions (#225)",
"author_name": "Niwaka",
"author_login": "NiwakaDev",
"committed_at": "2023-06-23T21:59:26Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "36565f2c59b4bc438b54fdf5fb5a696ea63348df",
"body": "This commit documents how we use the `RustString` type to avoid implicit\nSwift String allocations.",
"is_bot": false,
"headline": "Add docs on RustString",
"author_name": "Chinedu Francis Nwafili",
"author_login": "chinedufn",
"committed_at": "2023-06-23T11:18:35Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "df91f282e62b32755f1410c0e6f22b03f836f018",
"body": "This commit fixes the `SwiftRustIntegrationTestRunner` project such that\nit now builds and runs the full test suite.\n\nBefore this commit there was a recently introduced file that was not\nactually added to the project, so the project could not compile.\n\nCI was failing for the last few commits so this slipped through the\ncracks. This commit should fix CI.",
"is_bot": false,
"headline": "Fix integration tests",
"author_name": "Chinedu Francis Nwafili",
"author_login": "chinedufn",
"committed_at": "2023-06-21T08:22:51Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "4fbd30f81085dc366bda3c0303eac66345de3ed9",
"body": "Related to #225.\r\n\r\nBefore this commit, the integration tests sometimes fail, like so:\r\n\r\n```\r\nfield has incomplete type 'struct swift_bridge$tuple$I32ResultTestOpaqueRustTypeString'\r\n```\r\n\r\nThis PR fixes the issue.",
"is_bot": false,
"headline": "Fix non-deterministic generation order (#230)",
"author_name": "Niwaka",
"author_login": "NiwakaDev",
"committed_at": "2023-06-20T23:52:39Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "ffe20d8c8eb4f0404e1e56ef3892f810c7182fea",
"body": "Fixes #228.\r\n\r\nThis enables the following use case:\r\n```rust\r\n// Rust\r\nfn main() {\r\n let bytes = ffi::receive_bytes();\r\n println!(\"bytes: {:?}\", bytes);\r\n\r\n let vec: Vec<u8> = vec![6, 1, 2, 3, 4, 5];\r\n ffi::send_bytes(vec);\r\n}\r\n\r\n#[swift_bridge::bridge]\r\nmod ffi {\r\n extern \"Swift\" {\r\n\n[…]\ns with my PR given that this is my first time dealing with this kind of interop work, so by all means do let me know how to address the current weaknesses/problems and I'll do my best to resolve them.",
"is_bot": false,
"headline": "Swift `Vec<primitive>` ret type and fn arg (#229)",
"author_name": "Tim Wedde",
"author_login": "timwedde",
"committed_at": "2023-06-20T17:17:34Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "ecd3b974754e32fc951b8bc4098ecef84e974821",
"body": "When generating the rust function wrappers for an extern swift function with an already_declared struct/enum the generated code used a locally defined struct/enum with this patch we add `super` to that function signature.\r\n\r\nAn example of code that was previously not working:\r\n\r\n```rs\r\n#[swift_bridg\n[…]\niously the genrated function would be something like:\r\n```rs\r\nmod ffi {\r\n fn baz(a: Foo) {\r\n // ...\r\n }\r\n}\r\n```\r\n\r\nnow it's\r\n\r\n```rs\r\nmod ffi {\r\n fn baz(a: super::Foo) {\r\n // ...\r\n }\r\n}\r\n```",
"is_bot": false,
"headline": "Fix `already_declared` attribute for enums and structs (#226)",
"author_name": "Gabi",
"author_login": "conectado",
"committed_at": "2023-05-27T00:25:38Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "7c14ea07ab71702019e652fcc5a5f7a111d5ea0e",
"body": "Fixes #220 \r\n\r\nThis supports bridges of the form:\r\n```rust\r\n#[swift_bridge::bridge]\r\nmod ffi {\r\n extern \"Rust\" {\r\n type ErrorType;\r\n async fn some_function() -> Result<(), ErrorType>;\r\n }\r\n}\r\n\r\nasync fn some_function() -> Result<(), ErrorType> {\r\n Ok(())\r\n}\r\n```",
"is_bot": false,
"headline": "Fix async Rust fn return Result<(), OpaqueType> (#221)",
"author_name": "Josh Faust",
"author_login": "jfaust",
"committed_at": "2023-05-04T12:33:13Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "de059024732fa2f8135a9fe1232b727d96794af6",
"body": "Fixes #217 \r\n\r\nThis supports bridges of the form:\r\n```rust\r\n#[swift_bridge::bridge]\r\nmod ffi {\r\n extern \"Rust\" {\r\n type OpaqueRust;\r\n fn rust_func_return_result_of_vec_u32() -> Result<Vec<u32>, OpaqueRust>;\r\n fn rust_func_return_result_of_vec_opaque(\r\n ) -> Result<Vec<\n[…]\nfunc_return_result_of_vec_opaque(\r\n) -> Result<Vec<OpaqueRust>, OpaqueRust> {\r\n Ok(vec![\r\n OpaqueRust::new(...),\r\n OpaqueRust::new(...),\r\n OpaqueRust::new(...),\r\n ])\r\n}\r\n```",
"is_bot": false,
"headline": "Fix returning Result<Vec<>, ...> from Rust (#218)",
"author_name": "Josh Faust",
"author_login": "jfaust",
"committed_at": "2023-05-04T12:26:19Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "852ece728d3f362f3ada4368e037fe9ebb2a913f",
"body": "This commit adds support for returning `Result<tuple, Any Type>` from Rust functions. Note that this doesn't support returning `Result<Any Type, tuple>` from Rust functions.\r\n\r\nHere's an example of using this.\r\n\r\n```Rust\r\n#[swift_bridge::bridge]\r\nmod ffi {\r\n extern \"Rust\" {\r\n fn rust_func_\n[…]\n``Swift\r\n//...\r\ndo {\r\n //...\r\n let tuple: (Int32, ResultTestOpaqueRustType, RustString) = try rust_func_return_result_tuple_transparent_enum(true)\r\n //...\r\n} catch {\r\n //...\r\n}\r\n//...\r\n```",
"is_bot": false,
"headline": "Support returning Result<tuple, Any Type> from Rust (#213)",
"author_name": "Niwaka",
"author_login": "NiwakaDev",
"committed_at": "2023-05-04T12:20:50Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "7e140ca5e6ec3f969c19001c844f98fe76bd787c",
"body": "This commit adds a method to the `Vectorizable` protocol:\r\n\r\n```swift\r\nstatic func vecOfSelfAsPtr(vecPtr: UnsafeMutableRawPointer) -> UnsafePointer<SelfRef>\r\n```\r\n\r\nMy reason for adding this method was to be able to easily pass a serialized Protobuf object back and forth between Rust and Swift. Moti\n[…]\nta: Data(\r\n // The `.as_ptr()` method keeps this very straightforward\r\n bytes: output.as_ptr(),\r\n count: output.len()\r\n )\r\n )\r\n} catch { ... }\r\n\r\n// ...\r\n```",
"is_bot": false,
"headline": "Add `RustVec<T>.as_ptr` method (#216)",
"author_name": "aiongg",
"author_login": "aiongg",
"committed_at": "2023-04-26T15:41:01Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "9e09fcefbd2581fc6e44cb4207c99d25eb175b4d",
"body": null,
"is_bot": false,
"headline": "Update incorrect-return-type.stderr (#215)",
"author_name": "Niwaka",
"author_login": "NiwakaDev",
"committed_at": "2023-04-24T15:25:31Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "1f9dd05360b4001fbe4c167304f6815399882699",
"body": null,
"is_bot": false,
"headline": "Support tuples from Swift -> Rust (#211)",
"author_name": "Niwaka",
"author_login": "NiwakaDev",
"committed_at": "2023-04-18T13:57:25Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "53b93f47cc32d605377194a43f3164745cea6dd6",
"body": "Related issue: #190 \r\n\r\nExample:\r\n\r\n```rs\r\n// Rust\r\n\r\n#[swift_bridge::bridge]\r\nmod ffi {\r\n #[derive(Debug)]\r\n enum DeriveDebugEnum {\r\n Variant,\r\n }\r\n}\r\n```\r\n\r\n```swift\r\n// Swift\r\n\r\nlet debugString = String(reflecting: DeriveDebugEnum.Variant)\r\nXCTAssertEqual(debugString, \"Variant\")\r\n```",
"is_bot": false,
"headline": "Support derive(Debug) on enums (#194)",
"author_name": "naturecodevoid",
"author_login": "amsam0",
"committed_at": "2023-04-06T01:38:03Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "25b1ea0d2b440a628a6658caca953f72752b7329",
"body": "This commit adds support for generating a `#include<~>` corresponding to each field in tuples. \r\n\r\nHere's an example.\r\n\r\n```rust\r\n#[swift_bridge::bridge]\r\nmod ffi {\r\n extern \"Rust\" {\r\n fn some_function(arg1: (i32, bool)) -> (i32, bool);\r\n }\r\n}\r\n```\r\n\r\nGenerates the following c header file:\r\n```c\r\n#include <stdint.h>\r\n#include <stdbool.h>\r\n//...\r\n```",
"is_bot": false,
"headline": "Generate includes for tuples (#208)",
"author_name": "Niwaka",
"author_login": "NiwakaDev",
"committed_at": "2023-04-03T17:38:55Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "1b797f6595c9e45f30032db5a24403f746f5d1b0",
"body": "This commit adds support for generating a compile error message when using `#[swift_bridge(associated_to = OpaqueRustType)]` on instance methods.\r\n\r\nRelated to #179.\r\n\r\n```rust\r\n#[swift_bridge::bridge]\r\nmod ffi {\r\n extern \"Rust\" {\r\n type SomeType;\r\n\r\n #[swift_bridge(associated_to = \n[…]\nciated_to attribute is used for only an associated method.\r\n --> tests/ui/invalid-associated-to-attribute.rs:16:25\r\n |\r\n16 | fn owned_method(self);\r\n | ^^^^\r\n\r\n```",
"is_bot": false,
"headline": "Add compile error for associated_to attribute (#206)",
"author_name": "Niwaka",
"author_login": "NiwakaDev",
"committed_at": "2023-03-29T12:16:35Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "d03f77295fb60bee9f1bbb67da9d1f49bc765966",
"body": "This commit adds support tuples from Swift -> Rust, which consist of only primitives.\n\nrelated to #204.\n\nHere's an example of using this:\n\n```rust\n#[swift_bridge::bridge]\nmod ffi {\n extern \"Swift\" {\n fn swift_reflect_tuple_primitives(arg: (i32, u32)) -> (i32, u32);\n }\n}\n```\n\n```rust\n//Rust\n\n//...\nlet tuple = swift_reflect_tuple_primitives((-123, 123));\n//...\n```",
"is_bot": false,
"headline": "Support primitive tuples Swift -> Rust (#205)",
"author_name": "niwaka",
"author_login": "NiwakaDev",
"committed_at": "2023-03-27T17:06:11Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "637c7b353539c1122dacc3a64e7d5dc052a4fec9",
"body": "This commit adds support for tuples. \r\n\r\nrelated to #188.\r\n\r\nHere's an example of using this:\r\n\r\n```rust\r\n#[swift_bridge::bridge]\r\nmod ffi {\r\n extern \"Rust\" {\r\n fn reflect_tuple_primitives(tuple: (i16, u32)) -> (i16, u32);\r\n }\r\n}\r\n\r\nfn reflect_tuple_primitives(tuple: (i16, u32)) -> (i16, u32) {\r\n tuple\r\n}\r\n```\r\n\r\n```swift\r\n//...\r\nlet tuple = reflect_tuple_primitives((-1, 10))\r\n//...\r\n```",
"is_bot": false,
"headline": "Support tuples (#195)",
"author_name": "Niwaka",
"author_login": "NiwakaDev",
"committed_at": "2023-03-20T16:33:03Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "d713d36391a09fedc5c1b03cd3a15c814f2f11ef",
"body": null,
"is_bot": false,
"headline": "Add Performance section to README",
"author_name": "Chinedu Francis Nwafili",
"author_login": "chinedufn",
"committed_at": "2023-03-19T02:27:59Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "fdca9fcc2080a60d30de958fc4ada2516691581e",
"body": "This commit adds support for Option<PrimitiveType> in `extern \"Swift\"`\r\nfunctions.\r\n\r\nFor example, the following is now possible:\r\n\r\n```rust\r\nmod ffi {\r\n extern \"Swift\" {\r\n fn my_func(arg: Option<u8>) -> Option<bool>;\r\n }\r\n}\r\n```",
"is_bot": false,
"headline": "Support Option<Primitive> in Swift fns (#203)",
"author_name": "Chinedu Francis Nwafili",
"author_login": "chinedufn",
"committed_at": "2023-03-19T01:52:02Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "03ca04126a8f73f8208fbee3572ea905e1a93aec",
"body": "Closes https://github.com/chinedufn/swift-bridge/issues/108",
"is_bot": false,
"headline": "Fix dangling pointer warning (#202)",
"author_name": "Chinedu Francis Nwafili",
"author_login": "chinedufn",
"committed_at": "2023-03-18T16:48:44Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "b4c5d9bffe2f457822b753a00c93bb3384e8f8ba",
"body": "This commit adds support for `Vec<f32>`/`Vec<f64>`.\r\n\r\nRust code would look like:\r\n```rust\r\n#[swift_bridge::bridge]\r\nmod ffi {\r\n #[swift_bridge(swift_repr = \"struct\")]\r\n struct SomeStruct {\r\n field: Vec<f32>,\r\n }\r\n\r\n extern \"Rust\" {\r\n fn do_something(val: SomeStruct) -> Vec<f32>;\r\n }\r\n}\r\n\r\nfn do_something(val: SomeStruct) -> Vec<f32> {\r\n /* do something */\r\n}\r\n```\r\nOn Swift side, `Double` and `Float` are now `Vectorizable`.",
"is_bot": false,
"headline": "Add Vec<f32> and Vec<f64> support (#200)",
"author_name": "Rodrigo Kreutz",
"author_login": "rkreutz",
"committed_at": "2023-03-17T23:26:19Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "6b151f1ab72fb3f36f61c42186dc3319b17936a9",
"body": "This commit adds support for `#[derive(Copy, Clone)]` to `SharedStruct`s.\r\n\r\n## Example\r\n\r\n```rust\r\n#[swift_bridge::bridge]\r\nmod ffi {\r\n #[swift_bridge(swift_repr = \"struct\")]\r\n #[derive(Copy, Clone)]\r\n struct Foo {\r\n field: u8,\r\n }\r\n}\r\n```",
"is_bot": false,
"headline": "Adding derive() macro support to SharedStructs (#198)",
"author_name": "Rodrigo Kreutz",
"author_login": "rkreutz",
"committed_at": "2023-03-16T16:30:26Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "2d60d9ee83a153b07c5413af9f9cc3ad6075c9f4",
"body": "This commit adds support for returning Result<(), TransparentEnum> from Rust async functions.\r\n\r\nHere's an example of using this:\r\n\r\n```Rust\r\n//Rust\r\n#[swift_bridge::bridge]\r\nmod ffi {\r\n enum SomeEnum {\r\n //...\r\n }\r\n extern \"Rust\" {\r\n async fn some_function() -> Result<(), SomeEnum>;\r\n }\r\n}\r\n```\r\n\r\n```Swift\r\n//Swift\r\ndo {\r\n let value = try await some_function()\r\n //...\r\n} catch let error as SomeEnum {\r\n //...\r\n} catch {\r\n //...\r\n}\r\n```",
"is_bot": false,
"headline": "Support Rust async fn ret `Result<(),enum>` (#189)",
"author_name": "Niwaka",
"author_login": "NiwakaDev",
"committed_at": "2023-03-07T23:08:17Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "68c3a385fcc21810f6f33794fc63003c3b9bb168",
"body": "This commit adds support for returning `Result<OpaqueRustType, TransparentEnumType>` from `async` Rust functions. \r\nrelated to #159.\r\n\r\nHere's an example of using this.\r\n\r\n```rust\r\n#[swift_bridge::bridge]\r\nmod ffi {\r\n enum NetworkError {\r\n\tNoData,\r\n\tAuthentication,\r\n }\r\n extern \"Rust\" {\r\n \n[…]\n)\r\n //...\r\n} catch let error as NetworkError {\r\n //...\r\n} catch {\r\n //...\r\n}\r\n```\r\n\r\nNote that This commit doesn't support `Result<TransparentEnum, ()>` and `Result<(), TransparentEnum>` yet.",
"is_bot": false,
"headline": "Rust async fn return Result<enum, enum> (#182)",
"author_name": "Niwaka",
"author_login": "NiwakaDev",
"committed_at": "2023-03-06T23:17:08Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "20baa731361c9cb86c2b4a9f5c7d0a5f65f6ff45",
"body": "This commit replaces `ResultVoidAndPtr` with a pointer. Note that this commit doesn't affect the user experience at all.\r\n\r\nrelated to #183.\r\n\r\nFor example, the following bridge module:\r\n```rust\r\n#[swift_bridge::bridge]\r\nmod ffi {\r\n extern \"Rust\" {\r\n type SomeType;\r\n\r\n fn some_func\n[…]\n\n Ok(ok) => std::ptr::null_mut(),\r\n Err(err) => Box::into_raw(Box::new({\r\n let val: super::SomeType = err;\r\n val\r\n })) as *mut super::SomeType\r\n }\r\n}\r\n```",
"is_bot": false,
"headline": "Replace `ResultVoidAndPtr` with pointer (#184)",
"author_name": "Niwaka",
"author_login": "NiwakaDev",
"committed_at": "2023-03-05T02:17:59Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "321e03e8d7f51fbf0629f56960defebfced244dc",
"body": "This commit adds support for returning `Result<transparent enum, transparent enum>` from Rust functions.\r\n\r\nrelated to #159.\r\n\r\nHere's an example of using this.\r\n\r\n```rust\r\n#[swift_bridge::bridge]\r\nmod ffi {\r\n extern \"Rust\" {\r\n type ResultTestOpaqueRustType;\r\n }\r\n enum ResultTranspar\n[…]\n\n fn some_function() -> Result<ResultTestOpaqueRustType, ResultTransparentEnum>;\r\n }\r\n}\r\n\r\n```\r\n\r\n```swift\r\ndo {\r\n let value = try some_function()\r\n //...\r\n} catch {\r\n //...\r\n}\r\n```",
"is_bot": false,
"headline": "Support Rust fn return `Result<enum, enum>` (#182)",
"author_name": "Niwaka",
"author_login": "NiwakaDev",
"committed_at": "2023-03-04T17:51:55Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "5acac1d4ba9269ed0de8d583a9c01509084ab197",
"body": null,
"is_bot": false,
"headline": "0.1.51",
"author_name": "Chinedu Francis Nwafili",
"author_login": "chinedufn",
"committed_at": "2023-02-28T01:11:31Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "832498a8a822690e2ef61e5929a05d713ba2fbe8",
"body": "This commit adds support for opaque types as enum variant fields. However, This PR doesn't support generic opaque types. I'll write the reason later.\r\n\r\nHere's an example:\r\n\r\n```rust\r\n#[swift_bridge::bridge]\r\nmod ffi {\r\n extern \"Rust\" {\r\n #[swift_bridge(Equatable)]\r\n type Foo;\r\n \n[…]\nhNamedData.Variant3(foo: Foo.new())\r\nswitch reflect_enum_with_named_data(enumWithNamedData3) {\r\ncase .Variant3(let foo):\r\n XCTAssertEqual(foo, Foo.new())\r\n break\r\ndefault:\r\n XCTFail()\r\n}\r\n```",
"is_bot": false,
"headline": "Support opaque types as enum variant fields (#181)",
"author_name": "Niwaka",
"author_login": "NiwakaDev",
"committed_at": "2023-02-28T00:18:18Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "27d7be991141586fb120e4691b7bea7d9eeecd17",
"body": "This commit adds support for returning `Result<(), OpaqueRust>` but not passing as an arg.\r\n\r\nThe change to `examples/rust-binary-calls-swift-package/build.rs` was to support xcode not existing in the default location (I use the `xcodes` tool).\r\n\r\nThis commit also supports empty types, such as `stru\n[…]\nit_result() -> Result<UnitType, OpaqueType>;\r\n }\r\n}\r\n\r\nfn null_result() -> Result<(), OpaqueType> {\r\n Ok(())\r\n}\r\n\r\nfn unit_result() -> Result<UnitType, OpaqueType> {\r\n Ok(UnitType {})\r\n}\r\n```",
"is_bot": false,
"headline": "Support returning Result<(), OpaqueRust> from Rust functions (#180)",
"author_name": "Josh Faust",
"author_login": "jfaust",
"committed_at": "2023-02-26T22:47:30Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "b13c56ab399a9725bdb89b1435cafa76c056b21d",
"body": "This commit adds documentation that explains that it is possible to\r\ntrigger undefined behavior by violating Rust's borrowing rules using\r\nSwift.\r\n\r\nRelated:\r\n- https://github.com/chinedufn/swift-bridge/issues/161\r\n- https://github.com/chinedufn/swift-bridge/issues/162",
"is_bot": false,
"headline": "Improve memory safety documentation (#164)",
"author_name": "Chinedu Francis Nwafili",
"author_login": "chinedufn",
"committed_at": "2023-02-25T02:23:19Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "c15ba303a2c33dc457ddc2078cd0f8dbdc8e96de",
"body": "This commit modifies our codegen to elide arguments and return types\r\nthat have exactly one FFI representation, such as `()` `struct Foo;` and\r\n`enum MyEnum { OneVariant }`.\r\n\r\nFor example, the following bridge module:\r\n\r\n```rust\r\n#[swift_bridge::bridge]\r\nmod ffi {\r\n struct UnitStruct1;\r\n stru\n[…]\nant }`.\r\n\r\nAlthough, perhaps not that notably, since I'm still not sure whether\r\nanyone will have an FFI use case that involves bridging single-repr\r\ntypes.\r\n\r\nWho knows. Developers will surprise you.",
"is_bot": false,
"headline": "Elide types with one FFI representation (#178)",
"author_name": "Chinedu Francis Nwafili",
"author_login": "chinedufn",
"committed_at": "2023-02-24T05:19:29Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "e9e312c470f924c93252aba850ec5fd3273714ae",
"body": null,
"is_bot": false,
"headline": "Document the ResultPtrAndPtr FFI support type",
"author_name": "Chinedu Francis Nwafili",
"author_login": "chinedufn",
"committed_at": "2023-02-22T10:48:09Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "2f087fe2a636b95948c7e909afda86cffebe19ab",
"body": null,
"is_bot": false,
"headline": "Update README.md (#176)",
"author_name": "Niwaka",
"author_login": "NiwakaDev",
"committed_at": "2023-02-21T13:44:53Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "5b7004e2602bb867c0cfba20868e7630e5c35a8c",
"body": "This commit addresses #160 and adds support for enums with named data. \r\n\r\nHere's an example of using this.\r\n\r\n```rust\r\n#[swift_bridge::bridge]\r\nmod ffi {\r\n enum EnumWithNamedData {\r\n Variant1 { hello: String, data_u8: u8 },\r\n Variant2 { data_i32: i32 },\r\n Variant3,\r\n }\r\n\r\n[…]\nnumWithNamedData1) {\r\n case .Variant1(let hello, let dataU8):\r\n XCTAssertEqual(hello.toString(), \"hello\")\r\n XCTAssertEqual(dataU8, 123)\r\n default:\r\n XCTFail()\r\n }\r\n}\r\n```",
"is_bot": false,
"headline": "Support enums with named data (#175)",
"author_name": "Niwaka",
"author_login": "NiwakaDev",
"committed_at": "2023-02-21T12:05:50Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "8c7d1a3bb8c74a16e9417fbecb987896b52e7980",
"body": null,
"is_bot": false,
"headline": "0.1.50",
"author_name": "Chinedu Francis Nwafili",
"author_login": "chinedufn",
"committed_at": "2023-02-20T17:54:24Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "81cfce43385efb55394ea066d3084593d4e57626",
"body": null,
"is_bot": false,
"headline": "Cargo fmt",
"author_name": "Chinedu Francis Nwafili",
"author_login": "chinedufn",
"committed_at": "2023-02-19T16:46:43Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "fe8f5216e6dc7c27cf87c3a72d687e3c3703d326",
"body": null,
"is_bot": false,
"headline": "Simplify all variants empty method",
"author_name": "Chinedu Francis Nwafili",
"author_login": "chinedufn",
"committed_at": "2023-02-19T16:05:32Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "2fff2983df90810cf9b4551d8c1de574b50ca979",
"body": "This commit addresses #160 and adds support for enums with unnamed data. This commit doesn't implement enums with named data.\r\n\r\nHere's an example of using this.\r\n\r\n```rust\r\n//Rust\r\n#[swift_bridge::bridge]\r\nmod ffi {\r\n enum EnumWithUnnamedData {\r\n Variant1(String, u32),\r\n Variant2(i\n[…]\nwitch enumWithUnnamedData {\r\ncase .Variant1(let rustString, let valueUInt32):\r\n XCTAssertEqual(rustString.toString(), \"hello\")\r\n XCTAssertEqual(valueUInt32, 0)\r\ndefault:\r\n XCTFail()\r\n}\r\n\r\n```",
"is_bot": false,
"headline": "Support enums with unnamed data (#172)",
"author_name": "Niwaka",
"author_login": "NiwakaDev",
"committed_at": "2023-02-19T15:59:48Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "09c1f4f5280a2300a3957b100088d8760fbd85f8",
"body": null,
"is_bot": false,
"headline": "cargo fmt",
"author_name": "Chinedu Francis Nwafili",
"author_login": "chinedufn",
"committed_at": "2023-02-15T16:36:12Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "1b33e95b9c5b2d87ca2485aa972dcbb6f971ef18",
"body": null,
"is_bot": false,
"headline": "Better invalid return type error message",
"author_name": "Chinedu Francis Nwafili",
"author_login": "chinedufn",
"committed_at": "2023-02-15T16:17:53Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "e7aef343da039d0ff9e2783cf7989443ed39cca3",
"body": "This commit introduces a compile time error for incorrect return types.\r\n\r\nFor example, the following will now fail to compile:\r\n\r\n```rust\r\n#[swift_bridge::bridge]\r\nmod ffi {\r\n extern \"Rust\" {\r\n fn get_reference() -> SomeType;\r\n }\r\n}\r\n\r\nfn get_reference() -> &'static SomeType {\r\n &SomeType\r\n}\r\n```\r\n\r\nBefore this commit the above example would compile and calling `get_reference` would cause undefined behavior.",
"is_bot": false,
"headline": "Fix to make incorrect return type into error (#169)",
"author_name": "Mikuroさいな",
"author_login": "MikuroXina",
"committed_at": "2023-02-15T16:15:58Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "e5a0c893897f9aa2dddfdf1775876ff56b29d97c",
"body": null,
"is_bot": false,
"headline": "Fix Copy attribute UI test",
"author_name": "Chinedu Francis Nwafili",
"author_login": "chinedufn",
"committed_at": "2023-02-13T00:59:15Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "e1b469dc2e6b5251f1313787e58b882c7fd61aaa",
"body": null,
"is_bot": false,
"headline": "Document the Shared{Struct,Enum} traits",
"author_name": "Chinedu Francis Nwafili",
"author_login": "chinedufn",
"committed_at": "2023-02-12T22:50:56Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "3238914429980d105d8d93de143d391a6f74ffa6",
"body": null,
"is_bot": false,
"headline": "Replace fatalError() with XCTFail() (#163)",
"author_name": "Niwaka",
"author_login": "NiwakaDev",
"committed_at": "2023-02-11T00:26:23Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "bdbb028dea65148136851ff24bb8a025c5c66557",
"body": null,
"is_bot": false,
"headline": "Fix docs",
"author_name": "Chinedu Francis Nwafili",
"author_login": "chinedufn",
"committed_at": "2023-02-09T16:55:59Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "d85c9b10bfcc0889cbdb944f788f831e4aa236db",
"body": null,
"is_bot": false,
"headline": "0.1.49",
"author_name": "Chinedu Francis Nwafili",
"author_login": "chinedufn",
"committed_at": "2023-02-09T12:20:05Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "c4a11f4e3fa7e9c0e1652f4e21e9b3d94c6c837b",
"body": "This PR addresses #157 and adds support for returning a `Result<OpaqueRust, OpaqueRust>` from async functions.\n\nHere's an example of using this.\n\n```rust\n// Rust\n#[swift_bridge::bridge]\nmod ffi {\n extern \"Rust\" {\n type OpaqueType1;\n type OpaqueType2;\n async fn some_function() -> Result<OpaqueType1, OpaqueType2>;\n }\n}\n```\n\n```Swift\n// Swift\ndo {\n let opaqueType1 = try await some_function()\n} catch {\n //...\n}\n```",
"is_bot": false,
"headline": "Support `Result<OpaqueRust>` in async fns (#158)",
"author_name": "Niwaka",
"author_login": "NiwakaDev",
"committed_at": "2023-02-09T12:18:44Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "5332f40d3abcfd4d0162d4ea1e1f8123e2ee476f",
"body": null,
"is_bot": false,
"headline": "Alphabetize",
"author_name": "Chinedu Francis Nwafili",
"author_login": "chinedufn",
"committed_at": "2023-02-05T01:35:21Z",
"body_truncated": false,
"is_coding_agent": false
}
],
"releases_count": 42,
"commits_last_year": 15,
"latest_release_at": "2026-01-06T09:04:46Z",
"latest_release_tag": "0.1.59",
"releases_from_tags": false,
"days_since_last_push": 200,
"active_weeks_last_year": 7,
"days_since_latest_release": 200,
"mean_days_between_releases": 116.7
},
"community": {
"has_readme": true,
"has_license": true,
"has_description": true,
"has_contributing": false,
"health_percentage": 42,
"has_issue_template": false,
"has_code_of_conduct": false,
"has_pull_request_template": false
},
"ecosystem": {
"packages": [
{
"name": "swift-bridge",
"exists": true,
"license": "Apache-2.0/MIT",
"keywords": [
"bindings",
"ffi",
"ios",
"mac",
"swift"
],
"ecosystem": "crates",
"matches_repo": true,
"registry_url": "https://crates.io/crates/swift-bridge",
"is_deprecated": false,
"latest_version": "0.1.59",
"repository_url": "https://github.com/chinedufn/swift-bridge",
"versions_count": 60,
"total_downloads": 1909127,
"dependents_count": null,
"deprecation_note": null,
"maintainers_count": null,
"monthly_downloads": 55776,
"first_published_at": "2021-11-23T17:38:25.393174Z",
"latest_published_at": "2026-01-06T09:03:02.401260Z",
"latest_version_yanked": false,
"days_since_latest_publish": 200
}
]
},
"popularity": {
"forks": 77,
"stars": 1119,
"watchers": 13,
"fork_history": {
"days": [
{
"date": "2021-12-29",
"count": 1
},
{
"date": "2021-12-30",
"count": 1
},
{
"date": "2022-01-02",
"count": 1
},
{
"date": "2022-01-26",
"count": 1
},
{
"date": "2022-01-28",
"count": 1
},
{
"date": "2022-02-19",
"count": 1
},
{
"date": "2022-03-19",
"count": 1
},
{
"date": "2022-03-21",
"count": 1
},
{
"date": "2022-04-10",
"count": 1
},
{
"date": "2022-04-21",
"count": 1
},
{
"date": "2022-05-15",
"count": 1
},
{
"date": "2022-06-04",
"count": 1
},
{
"date": "2022-08-03",
"count": 1
},
{
"date": "2022-08-06",
"count": 1
},
{
"date": "2022-09-12",
"count": 1
},
{
"date": "2022-11-05",
"count": 1
},
{
"date": "2022-12-01",
"count": 1
},
{
"date": "2022-12-13",
"count": 1
},
{
"date": "2022-12-27",
"count": 1
},
{
"date": "2023-01-08",
"count": 1
},
{
"date": "2023-01-12",
"count": 1
},
{
"date": "2023-01-24",
"count": 2
},
{
"date": "2023-02-13",
"count": 1
},
{
"date": "2023-02-17",
"count": 1
},
{
"date": "2023-02-24",
"count": 1
},
{
"date": "2023-03-08",
"count": 1
},
{
"date": "2023-03-11",
"count": 1
},
{
"date": "2023-04-24",
"count": 1
},
{
"date": "2023-05-02",
"count": 1
},
{
"date": "2023-05-11",
"count": 1
},
{
"date": "2023-05-29",
"count": 1
},
{
"date": "2023-06-04",
"count": 1
},
{
"date": "2023-06-14",
"count": 1
},
{
"date": "2023-08-19",
"count": 1
},
{
"date": "2023-09-06",
"count": 1
},
{
"date": "2023-11-07",
"count": 1
},
{
"date": "2023-11-15",
"count": 1
},
{
"date": "2023-12-12",
"count": 1
},
{
"date": "2024-01-09",
"count": 1
},
{
"date": "2024-01-28",
"count": 1
},
{
"date": "2024-02-01",
"count": 1
},
{
"date": "2024-03-05",
"count": 1
},
{
"date": "2024-03-14",
"count": 1
},
{
"date": "2024-03-17",
"count": 1
},
{
"date": "2024-04-09",
"count": 1
},
{
"date": "2024-04-28",
"count": 1
},
{
"date": "2024-05-10",
"count": 1
},
{
"date": "2024-06-17",
"count": 1
},
{
"date": "2024-07-19",
"count": 1
},
{
"date": "2024-08-26",
"count": 1
},
{
"date": "2024-09-04",
"count": 1
},
{
"date": "2024-09-13",
"count": 1
},
{
"date": "2024-10-14",
"count": 1
},
{
"date": "2024-10-23",
"count": 1
},
{
"date": "2024-11-10",
"count": 1
},
{
"date": "2024-12-09",
"count": 1
},
{
"date": "2025-01-26",
"count": 1
},
{
"date": "2025-02-07",
"count": 1
},
{
"date": "2025-04-07",
"count": 1
},
{
"date": "2025-04-24",
"count": 1
},
{
"date": "2025-05-08",
"count": 1
},
{
"date": "2025-05-10",
"count": 1
},
{
"date": "2025-05-25",
"count": 1
},
{
"date": "2025-10-01",
"count": 1
},
{
"date": "2025-10-10",
"count": 1
},
{
"date": "2025-10-27",
"count": 1
},
{
"date": "2025-11-10",
"count": 1
},
{
"date": "2025-11-30",
"count": 1
},
{
"date": "2025-12-03",
"count": 2
},
{
"date": "2026-03-14",
"count": 1
},
{
"date": "2026-04-25",
"count": 2
},
{
"date": "2026-05-15",
"count": 1
},
{
"date": "2026-07-01",
"count": 1
}
],
"complete": true,
"collected": 76,
"total_forks": 77
},
"star_history": null,
"open_issues_and_prs": 101
},
"ai_readiness": {
"has_nix": false,
"example_dirs": [
"examples"
],
"has_llms_txt": false,
"has_dockerfile": false,
"has_mcp_signal": false,
"bootstrap_files": [],
"api_schema_files": [],
"has_devcontainer": false,
"typecheck_configs": [],
"toolchain_manifests": [
"Cargo.toml",
"SwiftRustIntegrationTestRunner/integration-test-create-swift-package/Cargo.toml",
"SwiftRustIntegrationTestRunner/swift-package-rust-library-fixture/Cargo.toml",
"crates/swift-bridge-build/Cargo.toml",
"crates/swift-bridge-cli/Cargo.toml",
"crates/swift-bridge-ir/Cargo.toml",
"crates/swift-bridge-macro/Cargo.toml",
"crates/swift-integration-tests/Cargo.toml",
"examples/async-functions/Cargo.toml",
"examples/codegen-visualizer/Cargo.toml",
"examples/multiple-bridge-modules/Cargo.toml",
"examples/rust-binary-calls-swift-package/Cargo.toml",
"examples/without-a-bridge-module/Cargo.toml"
],
"largest_source_bytes": 79752,
"source_files_sampled": 241,
"oversized_source_files": 2,
"agent_instruction_files": [],
"agent_instruction_max_bytes": null
},
"dependencies": {
"manifests": [
"Cargo.toml"
],
"advisories": {
"error": null,
"scope": "published_package",
"source": "osv",
"findings": [],
"collected": true,
"malicious": [],
"truncated": false,
"by_severity": {},
"advisory_count": 0,
"affected_count": 0,
"assessed_count": 24,
"malicious_count": 0,
"assessed_package": "crates:swift-bridge@0.1.59",
"unassessed_count": 0,
"direct_affected_count": 0
},
"ecosystems": [
"crates"
],
"dependencies": [
{
"name": "swift-bridge-macro",
"manifest": "Cargo.toml",
"ecosystem": "crates",
"version_constraint": "0.1.59"
},
{
"name": "tokio",
"manifest": "Cargo.toml",
"ecosystem": "crates",
"version_constraint": "1"
},
{
"name": "once_cell",
"manifest": "Cargo.toml",
"ecosystem": "crates",
"version_constraint": "1.9"
}
],
"all_dependencies": {
"error": null,
"source": "github-sbom",
"packages": [
{
"name": "once_cell",
"direct": true,
"version": null,
"ecosystem": "crates"
},
{
"name": "swift-bridge-macro",
"direct": true,
"version": null,
"ecosystem": "crates"
},
{
"name": "tokio",
"direct": true,
"version": null,
"ecosystem": "crates"
},
{
"name": "clap",
"direct": false,
"version": null,
"ecosystem": "crates"
},
{
"name": "crossbeam-channel",
"direct": false,
"version": null,
"ecosystem": "crates"
},
{
"name": "proc-macro2",
"direct": false,
"version": null,
"ecosystem": "crates"
},
{
"name": "quote",
"direct": false,
"version": null,
"ecosystem": "crates"
},
{
"name": "reqwest",
"direct": false,
"version": null,
"ecosystem": "crates"
},
{
"name": "swift-bridge-build",
"direct": false,
"version": null,
"ecosystem": "crates"
},
{
"name": "swift-bridge-ir",
"direct": false,
"version": null,
"ecosystem": "crates"
},
{
"name": "syn",
"direct": false,
"version": null,
"ecosystem": "crates"
},
{
"name": "tempfile",
"direct": false,
"version": null,
"ecosystem": "crates"
},
{
"name": "trybuild",
"direct": false,
"version": null,
"ecosystem": "crates"
}
],
"collected": true,
"truncated": false,
"total_count": 13,
"direct_count": 3,
"indirect_count": 10
}
},
"maintainership": {
"issues": {
"open_prs": 9,
"merged_prs": 159,
"open_issues": 92,
"closed_ratio": 0.521,
"closed_issues": 100,
"closed_unmerged_prs": 10
},
"bus_factor": 1,
"bot_contributors": 0,
"top_contributors": [
{
"type": "User",
"login": "chinedufn",
"commits": 334,
"avatar_url": "https://avatars.githubusercontent.com/u/2099811?v=4"
},
{
"type": "User",
"login": "NiwakaDev",
"commits": 29,
"avatar_url": "https://avatars.githubusercontent.com/u/61189782?v=4"
},
{
"type": "User",
"login": "Choochmeque",
"commits": 7,
"avatar_url": "https://avatars.githubusercontent.com/u/8397079?v=4"
},
{
"type": "User",
"login": "bes",
"commits": 4,
"avatar_url": "https://avatars.githubusercontent.com/u/85731?v=4"
},
{
"type": "User",
"login": "Jomy10",
"commits": 3,
"avatar_url": "https://avatars.githubusercontent.com/u/62475953?v=4"
},
{
"type": "User",
"login": "jfaust",
"commits": 3,
"avatar_url": "https://avatars.githubusercontent.com/u/1388377?v=4"
},
{
"type": "User",
"login": "rkreutz",
"commits": 2,
"avatar_url": "https://avatars.githubusercontent.com/u/8869678?v=4"
},
{
"type": "User",
"login": "onato",
"commits": 2,
"avatar_url": "https://avatars.githubusercontent.com/u/107999?v=4"
},
{
"type": "User",
"login": "akesson",
"commits": 2,
"avatar_url": "https://avatars.githubusercontent.com/u/1822029?v=4"
},
{
"type": "User",
"login": "simlay",
"commits": 2,
"avatar_url": "https://avatars.githubusercontent.com/u/1163510?v=4"
}
],
"contributors_sampled": 33,
"top_contributor_share": 0.811
},
"quality_signals": {
"has_ci": true,
"has_tests": true,
"ci_workflows": [
"gh-pages.yml",
"test.yml"
],
"has_docs_dir": false,
"linter_configs": [],
"has_editorconfig": false,
"has_linter_config": false,
"has_precommit_config": false
},
"security_signals": {
"lockfiles": [],
"scorecard": {
"checks": [
{
"name": "Binary-Artifacts",
"score": 10,
"reason": "no binaries found in the repo",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#binary-artifacts"
},
{
"name": "Branch-Protection",
"score": 0,
"reason": "branch protection not enabled on development/release branches",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#branch-protection"
},
{
"name": "CI-Tests",
"score": 4,
"reason": "9 out of 22 merged PRs checked by a CI test -- score normalized to 4",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#ci-tests"
},
{
"name": "CII-Best-Practices",
"score": 0,
"reason": "no effort to earn an OpenSSF best practices badge detected",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#cii-best-practices"
},
{
"name": "Code-Review",
"score": 4,
"reason": "Found 13/30 approved changesets -- score normalized to 4",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#code-review"
},
{
"name": "Contributors",
"score": 0,
"reason": "project has 0 contributing companies or organizations -- score normalized to 0",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#contributors"
},
{
"name": "Dangerous-Workflow",
"score": 10,
"reason": "no dangerous workflow patterns detected",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#dangerous-workflow"
},
{
"name": "Dependency-Update-Tool",
"score": 0,
"reason": "no update tool detected",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#dependency-update-tool"
},
{
"name": "Fuzzing",
"score": 0,
"reason": "project is not fuzzed",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#fuzzing"
},
{
"name": "License",
"score": 10,
"reason": "license file detected",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#license"
},
{
"name": "Maintained",
"score": 0,
"reason": "0 commit(s) and 1 issue activity found in the last 90 days -- score normalized to 0",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#maintained"
},
{
"name": "Packaging",
"score": null,
"reason": "packaging workflow not detected",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#packaging"
},
{
"name": "Pinned-Dependencies",
"score": 0,
"reason": "dependency not pinned by hash detected -- score normalized to 0",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#pinned-dependencies"
},
{
"name": "SAST",
"score": 0,
"reason": "SAST tool is not run on all commits -- score normalized to 0",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#sast"
},
{
"name": "Security-Policy",
"score": 0,
"reason": "security policy file not detected",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#security-policy"
},
{
"name": "Signed-Releases",
"score": null,
"reason": "no releases found",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#signed-releases"
},
{
"name": "Token-Permissions",
"score": 0,
"reason": "detected GitHub workflow tokens with excessive permissions",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#token-permissions"
},
{
"name": "Vulnerabilities",
"score": 10,
"reason": "0 existing vulnerabilities detected",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#vulnerabilities"
}
],
"commit": "e527dc7454bebbfab537d842990bf3a1672e676c",
"ran_at": "2026-07-25T12:19:02Z",
"aggregate_score": 3.4,
"scorecard_version": "v5.5.0"
},
"has_codeql_workflow": false,
"has_security_policy": false,
"has_dependabot_config": false
},
"contribution_flow": {
"collected": true,
"ci_last_run_at": "2026-01-06T09:05:18Z",
"oldest_open_prs": [
{
"number": 199,
"created_at": "2023-03-16T22:50:02Z",
"last_comment_at": "2024-01-09T08:35:59Z",
"last_comment_author": "wooden-worm"
},
{
"number": 209,
"created_at": "2023-04-07T23:19:20Z",
"last_comment_at": "2024-08-15T03:38:40Z",
"last_comment_author": "chinedufn"
},
{
"number": 248,
"created_at": "2024-01-09T20:16:12Z",
"last_comment_at": "2024-04-30T16:02:52Z",
"last_comment_author": "extrawurst"
},
{
"number": 262,
"created_at": "2024-03-17T23:44:59Z",
"last_comment_at": "2024-06-01T22:33:02Z",
"last_comment_author": "chinedufn"
},
{
"number": 307,
"created_at": "2025-01-26T23:09:37Z",
"last_comment_at": "2025-08-27T22:47:50Z",
"last_comment_author": "chinedufn"
},
{
"number": 340,
"created_at": "2025-10-10T09:12:47Z",
"last_comment_at": "2025-10-11T23:54:50Z",
"last_comment_author": "chinedufn"
},
{
"number": 341,
"created_at": "2025-10-11T09:28:12Z",
"last_comment_at": "2025-10-26T14:34:38Z",
"last_comment_author": "chinedufn"
},
{
"number": 369,
"created_at": "2026-04-25T21:59:57Z",
"last_comment_at": null,
"last_comment_author": null
},
{
"number": 371,
"created_at": "2026-07-01T21:56:57Z",
"last_comment_at": "2026-07-03T03:40:44Z",
"last_comment_author": "finn-devs"
}
],
"last_merged_pr_at": "2026-01-06T08:49:54Z",
"ci_last_conclusion": "SUCCESS",
"oldest_open_issues": [
{
"number": 5,
"created_at": "2021-12-29T14:05:17Z",
"last_comment_at": "2025-02-06T14:07:07Z",
"last_comment_author": "chinedufn"
},
{
"number": 10,
"created_at": "2022-01-17T09:07:27Z",
"last_comment_at": null,
"last_comment_author": null
},
{
"number": 14,
"created_at": "2022-01-21T15:31:58Z",
"last_comment_at": "2023-02-24T05:24:39Z",
"last_comment_author": "chinedufn"
},
{
"number": 44,
"created_at": "2022-03-16T01:17:51Z",
"last_comment_at": "2022-05-01T10:41:39Z",
"last_comment_author": "chinedufn"
},
{
"number": 47,
"created_at": "2022-03-18T22:04:20Z",
"last_comment_at": "2022-03-18T23:13:27Z",
"last_comment_author": "chinedufn"
},
{
"number": 58,
"created_at": "2022-04-21T10:59:15Z",
"last_comment_at": "2025-02-27T11:03:44Z",
"last_comment_author": "chinedufn"
},
{
"number": 62,
"created_at": "2022-04-24T00:29:31Z",
"last_comment_at": "2023-01-27T19:07:05Z",
"last_comment_author": "chinedufn"
},
{
"number": 65,
"created_at": "2022-04-25T06:47:17Z",
"last_comment_at": null,
"last_comment_author": null
},
{
"number": 67,
"created_at": "2022-04-26T07:59:22Z",
"last_comment_at": "2023-01-23T02:12:22Z",
"last_comment_author": "chinedufn"
},
{
"number": 68,
"created_at": "2022-04-26T08:09:41Z",
"last_comment_at": "2023-07-12T06:19:39Z",
"last_comment_author": "chinedufn"
},
{
"number": 69,
"created_at": "2022-04-26T08:14:45Z",
"last_comment_at": "2023-01-28T00:05:32Z",
"last_comment_author": "chinedufn"
},
{
"number": 76,
"created_at": "2022-04-28T21:01:02Z",
"last_comment_at": null,
"last_comment_author": null
},
{
"number": 91,
"created_at": "2022-05-05T18:52:46Z",
"last_comment_at": "2023-02-26T16:58:12Z",
"last_comment_author": "antoniusnaumann"
},
{
"number": 92,
"created_at": "2022-05-08T12:12:43Z",
"last_comment_at": "2023-01-27T19:23:35Z",
"last_comment_author": "chinedufn"
},
{
"number": 96,
"created_at": "2022-05-10T22:25:15Z",
"last_comment_at": null,
"last_comment_author": null
},
{
"number": 97,
"created_at": "2022-05-11T01:57:29Z",
"last_comment_at": "2023-01-24T13:01:13Z",
"last_comment_author": "chinedufn"
},
{
"number": 99,
"created_at": "2022-05-16T15:57:59Z",
"last_comment_at": "2023-01-21T12:30:43Z",
"last_comment_author": "chinedufn"
},
{
"number": 102,
"created_at": "2022-07-20T01:13:41Z",
"last_comment_at": null,
"last_comment_author": null
},
{
"number": 106,
"created_at": "2022-07-29T16:40:03Z",
"last_comment_at": "2024-05-11T23:10:09Z",
"last_comment_author": "integer-overflown"
},
{
"number": 112,
"created_at": "2022-09-25T17:47:37Z",
"last_comment_at": "2022-12-08T12:15:37Z",
"last_comment_author": "chinedufn"
}
]
}
},
"config": {
"disabled_metrics": [],
"disabled_categories": [],
"disabled_components": {}
},
"source": {
"url": "https://github.com/chinedufn/swift-bridge",
"host": "github.com",
"name": "swift-bridge",
"owner": "chinedufn"
},
"metrics": {
"overall": {
"key": "overall",
"band": "moderate",
"name": "Overall health",
"note": null,
"notes": [],
"value": 55,
"inputs": {
"security": 47,
"vitality": 39,
"community": 66,
"governance": 60,
"engineering": 64
},
"components": []
},
"categories": [
{
"key": "vitality",
"band": "at_risk",
"name": "Vitality",
"value": 39,
"weight": 0.22,
"metrics": [
{
"key": "development_activity",
"band": "critical",
"name": "Development activity",
"note": null,
"notes": [],
"value": 19,
"inputs": {
"commits_last_year": 15,
"human_commit_share": 1,
"days_since_last_push": 200,
"active_weeks_last_year": 7
},
"components": [
{
"key": "push_recency",
"name": "Push recency",
"detail": "last push 200 days ago",
"points": 3.6,
"status": "partial",
"details": [
{
"code": "push_recency",
"params": {
"days": 200
}
}
],
"max_points": 36
},
{
"key": "commit_cadence",
"name": "Commit cadence",
"detail": "7/52 weeks with commits",
"points": 4.8,
"status": "partial",
"details": [
{
"code": "commit_cadence_weeks",
"params": {
"weeks": 7
}
}
],
"max_points": 36
},
{
"key": "commit_volume",
"name": "Commit volume",
"detail": "15 commits in the last year",
"points": 10.8,
"status": "partial",
"details": [
{
"code": "commits_last_year",
"params": {
"count": 15
}
}
],
"max_points": 18
},
{
"key": "openssf_scorecard_maintained",
"name": "OpenSSF Scorecard: Maintained",
"detail": "0 commit(s) and 1 issue activity found in the last 90 days -- score normalized to 0",
"points": 0,
"status": "missed",
"details": [],
"max_points": 10
}
]
},
{
"key": "release_discipline",
"band": "good",
"name": "Release discipline",
"note": "Excluded from scoring (no data or not applicable): OpenSSF Scorecard: Signed-Releases. Remaining weights renormalized.",
"notes": [
{
"code": "excluded_no_data",
"params": {
"components": [
"openssf_scorecard_signed_releases"
]
}
},
{
"code": "weights_renormalized",
"params": {}
}
],
"value": 70,
"inputs": {
"releases_count": 42,
"latest_release_tag": "0.1.59",
"releases_from_tags": false,
"days_since_latest_release": 200,
"mean_days_between_releases": 116.7
},
"components": [
{
"key": "ships_releases",
"name": "Ships releases",
"detail": "42 releases published",
"points": 27,
"status": "met",
"details": [
{
"code": "releases_published",
"params": {
"count": 42
}
}
],
"max_points": 27
},
{
"key": "release_recency",
"name": "Release recency",
"detail": "latest release 200 days ago",
"points": 16.2,
"status": "partial",
"details": [
{
"code": "release_recency",
"params": {
"days": 200
}
}
],
"max_points": 36
},
{
"key": "release_cadence",
"name": "Release cadence",
"detail": "a release every ~116.7 days",
"points": 19.8,
"status": "partial",
"details": [
{
"code": "release_cadence",
"params": {
"gap": 116.7
}
}
],
"max_points": 27
},
{
"key": "openssf_scorecard_signed_releases",
"name": "OpenSSF Scorecard: Signed-Releases",
"detail": "no releases found",
"points": 0,
"status": "excluded",
"details": [
{
"code": "no_data",
"params": {}
}
],
"max_points": 10
}
]
},
{
"key": "abandonment",
"band": "excellent",
"name": "Abandonment",
"note": null,
"notes": [],
"value": 100,
"inputs": {
"cap": null,
"state": "dormant",
"guards": [
"recent_release",
"dependencies_clean"
],
"signals": [
"issue_rot",
"scorecard_unmaintained"
],
"red_flag": false,
"multiplier_pct": 100,
"declared_reason": null,
"unverified_reason": null,
"unanswered_open_prs": 7,
"unanswered_open_issues": 7,
"days_since_last_merged_pr": 200,
"days_since_last_human_commit": 200,
"days_since_last_human_commit_is_floor": false
},
"components": [
{
"key": "project_is_still_maintained",
"name": "Project is still maintained",
"detail": "no human commit for 200 days, with nothing left unanswered; held at dormant by a release within the year, no affected dependency",
"points": 100,
"status": "met",
"details": [
{
"code": "abandonment_quiet",
"params": {
"days": 200
}
},
{
"code": "abandonment_guarded",
"params": {
"guards": "a release within the year, no affected dependency"
}
}
],
"max_points": 100
}
]
}
],
"description": "Is the project alive — is code being written and are releases shipping?"
},
{
"key": "community",
"band": "moderate",
"name": "Community & Adoption",
"value": 66,
"weight": 0.18,
"metrics": [
{
"key": "popularity",
"band": "good",
"name": "Popularity & adoption",
"note": null,
"notes": [],
"value": 71,
"inputs": {
"forks": 77,
"stars": 1119,
"watchers": 13,
"growth_state": "unverified",
"growth_factor_pct": 100,
"growth_unverified_reason": "no_history"
},
"components": [
{
"key": "stars",
"name": "Stars",
"detail": "1,119 stars",
"points": 49.4,
"status": "partial",
"details": [
{
"code": "stars",
"params": {
"count": 1119
}
}
],
"max_points": 60
},
{
"key": "forks",
"name": "Forks",
"detail": "77 forks",
"points": 15.7,
"status": "partial",
"details": [
{
"code": "forks",
"params": {
"count": 77
}
}
],
"max_points": 25
},
{
"key": "watchers",
"name": "Watchers",
"detail": "13 watchers",
"points": 6,
"status": "partial",
"details": [
{
"code": "watchers",
"params": {
"count": 13
}
}
],
"max_points": 15
}
]
},
{
"key": "community_health",
"band": "moderate",
"name": "Community health",
"note": null,
"notes": [],
"value": 50,
"inputs": {
"has_readme": true,
"has_license": true,
"has_contributing": false,
"has_issue_template": false,
"has_code_of_conduct": false,
"has_pull_request_template": false
},
"components": [
{
"key": "readme",
"name": "README",
"detail": null,
"points": 22.5,
"status": "met",
"details": [],
"max_points": 22.5
},
{
"key": "license",
"name": "License",
"detail": "recognized license (Apache-2.0)",
"points": 22.5,
"status": "met",
"details": [
{
"code": "license_standard",
"params": {}
},
{
"code": "license_spdx",
"params": {
"spdx": "Apache-2.0"
}
}
],
"max_points": 22.5
},
{
"key": "contributing_guide",
"name": "CONTRIBUTING guide",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 18
},
{
"key": "code_of_conduct",
"name": "Code of conduct",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 13.5
},
{
"key": "issue_template",
"name": "Issue template",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 7.2
},
{
"key": "pr_template",
"name": "PR template",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 6.3
}
]
},
{
"key": "ecosystem_adoption",
"band": "good",
"name": "Ecosystem adoption (downloads)",
"note": "Excluded from scoring (no data or not applicable): Registry dependents. Remaining weights renormalized.",
"notes": [
{
"code": "excluded_no_data",
"params": {
"components": [
"registry_dependents"
]
}
},
{
"code": "weights_renormalized",
"params": {}
}
],
"value": 79,
"inputs": {
"packages": [
"swift-bridge"
],
"dependents": null,
"ecosystems": "crates",
"total_downloads": 1909127,
"monthly_downloads": 55776
},
"components": [
{
"key": "monthly_downloads",
"name": "Monthly downloads",
"detail": "55,776 downloads/month across crates",
"points": 63.3,
"status": "partial",
"details": [
{
"code": "downloads_monthly",
"params": {
"count": 55776,
"ecosystems": "crates"
}
}
],
"max_points": 80
},
{
"key": "registry_dependents",
"name": "Registry dependents",
"detail": "not reported by this ecosystem",
"points": 0,
"status": "excluded",
"details": [
{
"code": "not_reported_by_this_ecosystem",
"params": {}
}
],
"max_points": 20
}
]
}
],
"description": "Does the project have users, downloads, attention, and a welcoming setup for contributors?"
},
{
"key": "governance",
"band": "moderate",
"name": "Sustainability & Governance",
"value": 60,
"weight": 0.24,
"metrics": [
{
"key": "maintainer_resilience",
"band": "critical",
"name": "Maintainer resilience (bus factor)",
"note": null,
"notes": [],
"value": 27,
"inputs": {
"bus_factor": 1,
"contributors_sampled": 33,
"top_contributor_share": 0.811
},
"components": [
{
"key": "bus_factor",
"name": "Bus factor",
"detail": "1 contributor(s) cover half of all commits",
"points": 9,
"status": "partial",
"details": [
{
"code": "bus_factor",
"params": {
"count": 1
}
}
],
"max_points": 54
},
{
"key": "commit_distribution",
"name": "Commit distribution",
"detail": "top contributor authored 81% of commits",
"points": 4.3,
"status": "partial",
"details": [
{
"code": "top_contributor_share",
"params": {
"share": 81
}
}
],
"max_points": 22.5
},
{
"key": "contributor_breadth",
"name": "Contributor breadth",
"detail": "33 contributors",
"points": 13.5,
"status": "met",
"details": [
{
"code": "contributors_sampled",
"params": {
"count": 33
}
}
],
"max_points": 13.5
},
{
"key": "openssf_scorecard_contributors",
"name": "OpenSSF Scorecard: Contributors",
"detail": "project has 0 contributing companies or organizations -- score normalized to 0",
"points": 0,
"status": "missed",
"details": [],
"max_points": 10
}
]
},
{
"key": "responsiveness",
"band": "moderate",
"name": "Issue & PR responsiveness",
"note": null,
"notes": [],
"value": 66,
"inputs": {
"merged_prs": 159,
"open_issues": 92,
"closed_issues": 100,
"issue_closed_ratio": 0.521,
"closed_unmerged_prs": 10
},
"components": [
{
"key": "issue_resolution",
"name": "Issue resolution",
"detail": "52% of issues closed",
"points": 24.4,
"status": "partial",
"details": [
{
"code": "issues_closed_share",
"params": {
"share": 52
}
}
],
"max_points": 46.75
},
{
"key": "pr_acceptance",
"name": "PR acceptance",
"detail": "159/169 decided PRs merged",
"points": 36,
"status": "partial",
"details": [
{
"code": "decided_prs_merged",
"params": {
"merged": 159,
"decided": 169
}
}
],
"max_points": 38.25
},
{
"key": "openssf_scorecard_code_review",
"name": "OpenSSF Scorecard: Code-Review",
"detail": "Found 13/30 approved changesets -- score normalized to 4",
"points": 6,
"status": "partial",
"details": [],
"max_points": 15
}
]
},
{
"key": "stewardship",
"band": "moderate",
"name": "Ownership & stewardship",
"note": "Excluded from scoring (no data or not applicable): Verified domain. Remaining weights renormalized.",
"notes": [
{
"code": "excluded_no_data",
"params": {
"components": [
"verified_domain"
]
}
},
{
"code": "weights_renormalized",
"params": {}
}
],
"value": 68,
"inputs": {
"followers": 539,
"owner_type": "User",
"is_verified": null,
"owner_login": "chinedufn",
"public_repos": 106,
"account_age_days": 5101
},
"components": [
{
"key": "ownership_backing",
"name": "Ownership backing",
"detail": "personal (user) account",
"points": 10,
"status": "partial",
"details": [
{
"code": "owner_personal",
"params": {}
}
],
"max_points": 30
},
{
"key": "verified_domain",
"name": "Verified domain",
"detail": "not applicable to user accounts",
"points": 0,
"status": "excluded",
"details": [
{
"code": "not_applicable_to_user_accounts",
"params": {}
}
],
"max_points": 20
},
{
"key": "owner_reach",
"name": "Owner reach",
"detail": "539 followers of chinedufn",
"points": 19.6,
"status": "partial",
"details": [
{
"code": "owner_followers",
"params": {
"count": 539,
"login": "chinedufn"
}
}
],
"max_points": 25
},
{
"key": "track_record",
"name": "Track record",
"detail": "106 public repos, account ~13 yr old",
"points": 25,
"status": "met",
"details": [
{
"code": "public_repos",
"params": {
"count": 106
}
},
{
"code": "account_age_years",
"params": {
"years": 13
}
}
],
"max_points": 25
}
]
},
{
"key": "package_maintenance",
"band": "excellent",
"name": "Package maintenance",
"note": null,
"notes": [],
"value": 91,
"inputs": {
"packages": [
"swift-bridge"
],
"ecosystems": "crates",
"any_deprecated": false,
"min_days_since_publish": 200
},
"components": [
{
"key": "published_resolvable",
"name": "Published & resolvable",
"detail": "1 package(s) on crates",
"points": 25,
"status": "met",
"details": [
{
"code": "packages_published",
"params": {
"count": 1,
"ecosystems": "crates"
}
}
],
"max_points": 25
},
{
"key": "publish_recency",
"name": "Publish recency",
"detail": "latest publish 200 days ago",
"points": 26,
"status": "partial",
"details": [
{
"code": "publish_recency",
"params": {
"days": 200
}
}
],
"max_points": 35
},
{
"key": "version_history",
"name": "Version history",
"detail": "60 published versions",
"points": 20,
"status": "met",
"details": [
{
"code": "published_versions",
"params": {
"count": 60
}
}
],
"max_points": 20
},
{
"key": "not_deprecated",
"name": "Not deprecated",
"detail": "active, not deprecated or yanked",
"points": 20,
"status": "met",
"details": [
{
"code": "package_not_deprecated",
"params": {}
}
],
"max_points": 20
}
]
}
],
"description": "Will the project survive its people — bus factor, responsiveness, who backs it, and package upkeep?"
},
{
"key": "engineering",
"band": "moderate",
"name": "Engineering Quality",
"value": 64,
"weight": 0.2,
"metrics": [
{
"key": "engineering_practices",
"band": "moderate",
"name": "Engineering practices",
"note": null,
"notes": [],
"value": 56,
"inputs": {
"has_ci": true,
"has_tests": true,
"has_editorconfig": false,
"has_linter_config": false,
"has_precommit_config": false
},
"components": [
{
"key": "ci_workflows",
"name": "CI workflows",
"detail": "2 workflow(s)",
"points": 24,
"status": "met",
"details": [
{
"code": "ci_workflows",
"params": {
"count": 2
}
}
],
"max_points": 24
},
{
"key": "tests_present",
"name": "Tests present",
"detail": null,
"points": 24,
"status": "met",
"details": [],
"max_points": 24
},
{
"key": "linter_config",
"name": "Linter config",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 16
},
{
"key": "pre_commit_hooks",
"name": "Pre-commit hooks",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 9.6
},
{
"key": "editorconfig",
"name": ".editorconfig",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 6.4
},
{
"key": "openssf_scorecard_ci_tests",
"name": "OpenSSF Scorecard: CI-Tests",
"detail": "9 out of 22 merged PRs checked by a CI test -- score normalized to 4",
"points": 8,
"status": "partial",
"details": [],
"max_points": 20
}
]
},
{
"key": "documentation",
"band": "good",
"name": "Documentation",
"note": null,
"notes": [],
"value": 75,
"inputs": {
"topics": [
"rust",
"swift",
"ffi",
"interop",
"ios"
],
"has_wiki": true,
"homepage": "https://chinedufn.github.io/swift-bridge",
"has_readme": true,
"has_docs_dir": false,
"has_description": true
},
"components": [
{
"key": "readme",
"name": "README",
"detail": null,
"points": 30,
"status": "met",
"details": [],
"max_points": 30
},
{
"key": "documentation_directory",
"name": "Documentation directory",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 25
},
{
"key": "documentation_homepage_site",
"name": "Documentation / homepage site",
"detail": "https://chinedufn.github.io/swift-bridge",
"points": 15,
"status": "met",
"details": [],
"max_points": 15
},
{
"key": "repository_description",
"name": "Repository description",
"detail": null,
"points": 10,
"status": "met",
"details": [],
"max_points": 10
},
{
"key": "topics",
"name": "Topics",
"detail": "5 topics",
"points": 10,
"status": "met",
"details": [
{
"code": "topics_count",
"params": {
"count": 5
}
}
],
"max_points": 10
},
{
"key": "wiki",
"name": "Wiki",
"detail": null,
"points": 10,
"status": "met",
"details": [],
"max_points": 10
}
]
}
],
"description": "Are baseline engineering and documentation practices in place?"
},
{
"key": "security",
"band": "at_risk",
"name": "Security",
"value": 47,
"weight": 0.16,
"metrics": [
{
"key": "security_posture",
"band": "at_risk",
"name": "Security posture",
"note": "Excluded from scoring (no data or not applicable): Packaging, Signed-Releases. Remaining weights renormalized.",
"notes": [
{
"code": "excluded_no_data",
"params": {
"components": [
"packaging",
"signed_releases"
]
}
},
{
"code": "weights_renormalized",
"params": {}
}
],
"value": 34,
"inputs": {
"source": "openssf_scorecard",
"checks_evaluated": 16,
"scorecard_version": "v5.5.0",
"checks_inconclusive": 2,
"scorecard_aggregate": 3.4
},
"components": [
{
"key": "binary_artifacts",
"name": "Binary-Artifacts",
"detail": "no binaries found in the repo",
"points": 7.5,
"status": "met",
"details": [],
"max_points": 7.5
},
{
"key": "branch_protection",
"name": "Branch-Protection",
"detail": "branch protection not enabled on development/release branches",
"points": 0,
"status": "missed",
"details": [],
"max_points": 7.5
},
{
"key": "ci_tests",
"name": "CI-Tests",
"detail": "9 out of 22 merged PRs checked by a CI test -- score normalized to 4",
"points": 1,
"status": "partial",
"details": [],
"max_points": 2.5
},
{
"key": "cii_best_practices",
"name": "CII-Best-Practices",
"detail": "no effort to earn an OpenSSF best practices badge detected",
"points": 0,
"status": "missed",
"details": [],
"max_points": 2.5
},
{
"key": "code_review",
"name": "Code-Review",
"detail": "Found 13/30 approved changesets -- score normalized to 4",
"points": 3,
"status": "partial",
"details": [],
"max_points": 7.5
},
{
"key": "contributors",
"name": "Contributors",
"detail": "project has 0 contributing companies or organizations -- score normalized to 0",
"points": 0,
"status": "missed",
"details": [],
"max_points": 2.5
},
{
"key": "dangerous_workflow",
"name": "Dangerous-Workflow",
"detail": "no dangerous workflow patterns detected",
"points": 10,
"status": "met",
"details": [],
"max_points": 10
},
{
"key": "dependency_update_tool",
"name": "Dependency-Update-Tool",
"detail": "no update tool detected",
"points": 0,
"status": "missed",
"details": [],
"max_points": 7.5
},
{
"key": "fuzzing",
"name": "Fuzzing",
"detail": "project is not fuzzed",
"points": 0,
"status": "missed",
"details": [],
"max_points": 5
},
{
"key": "license",
"name": "License",
"detail": "license file detected",
"points": 2.5,
"status": "met",
"details": [],
"max_points": 2.5
},
{
"key": "maintained",
"name": "Maintained",
"detail": "0 commit(s) and 1 issue activity found in the last 90 days -- score normalized to 0",
"points": 0,
"status": "missed",
"details": [],
"max_points": 7.5
},
{
"key": "packaging",
"name": "Packaging",
"detail": "packaging workflow not detected",
"points": 0,
"status": "excluded",
"details": [
{
"code": "no_data",
"params": {}
}
],
"max_points": 5
},
{
"key": "pinned_dependencies",
"name": "Pinned-Dependencies",
"detail": "dependency not pinned by hash detected -- score normalized to 0",
"points": 0,
"status": "missed",
"details": [],
"max_points": 5
},
{
"key": "sast",
"name": "SAST",
"detail": "SAST tool is not run on all commits -- score normalized to 0",
"points": 0,
"status": "missed",
"details": [],
"max_points": 5
},
{
"key": "security_policy",
"name": "Security-Policy",
"detail": "security policy file not detected",
"points": 0,
"status": "missed",
"details": [],
"max_points": 5
},
{
"key": "signed_releases",
"name": "Signed-Releases",
"detail": "no releases found",
"points": 0,
"status": "excluded",
"details": [
{
"code": "no_data",
"params": {}
}
],
"max_points": 7.5
},
{
"key": "token_permissions",
"name": "Token-Permissions",
"detail": "detected GitHub workflow tokens with excessive permissions",
"points": 0,
"status": "missed",
"details": [],
"max_points": 7.5
},
{
"key": "vulnerabilities",
"name": "Vulnerabilities",
"detail": "0 existing vulnerabilities detected",
"points": 7.5,
"status": "met",
"details": [],
"max_points": 7.5
}
]
},
{
"key": "dependency_advisories",
"band": "excellent",
"name": "Dependency advisories",
"note": "Excluded from scoring (no data or not applicable): No advisories left outstanding. Remaining weights renormalized. Matched the crates:swift-bridge@0.1.59 runtime dependency closure — what installing the published package pulls in — 24 packages. Reachability is not analyzed.",
"notes": [
{
"code": "excluded_no_data",
"params": {
"components": [
"no_advisories_left_outstanding"
]
}
},
{
"code": "weights_renormalized",
"params": {}
},
{
"code": "advisories_scope_published",
"params": {
"package": "crates:swift-bridge@0.1.59",
"assessed": 24
}
},
{
"code": "advisories_reachability",
"params": {}
}
],
"value": 100,
"inputs": {
"source": "osv",
"advisories": 0,
"affected_packages": 0,
"assessed_packages": 24,
"unassessed_packages": 0,
"affected_by_severity": "none",
"direct_affected_packages": 0
},
"components": [
{
"key": "direct_dependencies_free_of_known_advisories",
"name": "Direct dependencies free of known advisories",
"detail": "no direct dependency carries a known advisory",
"points": 35,
"status": "met",
"details": [
{
"code": "no_direct_advisories",
"params": {}
}
],
"max_points": 35
},
{
"key": "indirect_dependencies_free_of_known_advisories",
"name": "Indirect dependencies free of known advisories",
"detail": "no indirect dependency carries a known advisory",
"points": 25,
"status": "met",
"details": [
{
"code": "no_indirect_advisories",
"params": {}
}
],
"max_points": 25
},
{
"key": "no_advisories_left_outstanding",
"name": "No advisories left outstanding",
"detail": "no advisory carries a publication date",
"points": 0,
"status": "excluded",
"details": [
{
"code": "advisories_no_publication_date",
"params": {}
}
],
"max_points": 40
}
]
},
{
"key": "malicious_dependencies",
"band": "excellent",
"name": "Malicious dependencies",
"note": null,
"notes": [],
"value": 100,
"inputs": {
"source": "osv",
"meaning": "reported as a malicious package by the OpenSSF corpus; the remedy is removal or moving off the compromised name, never an upgrade of the same artifact. Versions the registry has since pulled are listed but not scored",
"packages": [],
"red_flag": false,
"assessed_packages": 24,
"malicious_packages": 0,
"direct_malicious_packages": 0,
"withdrawn_malicious_packages": 0,
"installable_malicious_packages": 0
},
"components": [
{
"key": "no_dependency_reported_as_a_malicious_package",
"name": "No dependency reported as a malicious package",
"detail": "no dependency is reported as a malicious package",
"points": 100,
"status": "met",
"details": [
{
"code": "no_malicious_dependencies",
"params": {}
}
],
"max_points": 100
}
]
},
{
"key": "high_risk_jurisdiction_exposure",
"band": "excellent",
"name": "High-Risk Jurisdiction Exposure",
"note": "Only high-confidence self-published location evidence affects this multiplier. Ambiguous matches are review-only; country evidence is not proof of nationality, citizenship, legal registration, malicious intent, or sanctions status.",
"notes": [
{
"code": "jurisdiction_evidence_limits",
"params": {}
}
],
"value": 100,
"inputs": {
"meaning": "self-published location evidence; not nationality or citizenship",
"red_flag": false,
"exposures": [],
"policy_countries": [
"Russia",
"Iran",
"North Korea"
],
"review_only_matches": 0,
"assessed_self_published_locations": 12
},
"components": [
{
"key": "policy_exposure_multiplier",
"name": "Policy exposure multiplier",
"detail": "no confirmed policy-scope location match",
"points": 100,
"status": "met",
"details": [
{
"code": "jurisdiction_no_match",
"params": {}
}
],
"max_points": 100
}
]
}
],
"description": "Are visible security and supply-chain practices strong, with no malicious dependency and no unresolved high-risk jurisdiction exposure?"
},
{
"key": "ai_readiness",
"band": "moderate",
"name": "AI Readiness",
"value": 51,
"weight": 0,
"metrics": [
{
"key": "ai_agent_context",
"band": "at_risk",
"name": "Agent context & guidance",
"note": null,
"notes": [],
"value": 40,
"inputs": {
"has_llms_txt": false,
"legible_history_share": 0.79,
"agent_instruction_files": [],
"agent_instruction_max_bytes": null
},
"components": [
{
"key": "agent_instructions",
"name": "Agent instructions",
"detail": "no CLAUDE.md / AGENTS.md / editor rules",
"points": 0,
"status": "missed",
"details": [
{
"code": "no_agent_instructions",
"params": {}
}
],
"max_points": 45
},
{
"key": "machine_readable_docs_llms_txt",
"name": "Machine-readable docs (llms.txt)",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 15
},
{
"key": "legible_commit_history",
"name": "Legible commit history",
"detail": "79 of 100 human commits state their intent (structured subject or explanatory body)",
"points": 40,
"status": "met",
"details": [
{
"code": "legible_history",
"params": {
"legible": 79,
"sampled": 100
}
}
],
"max_points": 40
}
]
},
{
"key": "ai_verify_loop",
"band": "at_risk",
"name": "Verify loop (build / test / typecheck)",
"note": null,
"notes": [],
"value": 46,
"inputs": {
"has_nix": false,
"has_tests": true,
"lockfiles": [],
"has_dockerfile": false,
"typed_language": true,
"bootstrap_files": [],
"has_devcontainer": false,
"has_linter_config": false,
"typecheck_configs": [],
"agent_commit_share": 0,
"toolchain_manifests": [
"Cargo.toml",
"SwiftRustIntegrationTestRunner/integration-test-create-swift-package/Cargo.toml",
"SwiftRustIntegrationTestRunner/swift-package-rust-library-fixture/Cargo.toml",
"crates/swift-bridge-build/Cargo.toml",
"crates/swift-bridge-cli/Cargo.toml",
"crates/swift-bridge-ir/Cargo.toml",
"crates/swift-bridge-macro/Cargo.toml",
"crates/swift-integration-tests/Cargo.toml",
"examples/async-functions/Cargo.toml",
"examples/codegen-visualizer/Cargo.toml",
"examples/multiple-bridge-modules/Cargo.toml",
"examples/rust-binary-calls-swift-package/Cargo.toml",
"examples/without-a-bridge-module/Cargo.toml"
],
"dependency_bot_commit_share": 0
},
"components": [
{
"key": "one_command_bootstrap",
"name": "One-command bootstrap",
"detail": "Cargo.toml, SwiftRustIntegrationTestRunner/integration-test-create-swift-package/Cargo.toml, SwiftRustIntegrationTestRunner/swift-package-rust-library-fixture/Cargo.toml (toolchain convention, no task runner)",
"points": 12.6,
"status": "partial",
"details": [
{
"code": "toolchain_convention",
"params": {
"files": "Cargo.toml, SwiftRustIntegrationTestRunner/integration-test-create-swift-package/Cargo.toml, SwiftRustIntegrationTestRunner/swift-package-rust-library-fixture/Cargo.toml"
}
}
],
"max_points": 18
},
{
"key": "automated_tests",
"name": "Automated tests",
"detail": null,
"points": 22,
"status": "met",
"details": [],
"max_points": 22
},
{
"key": "lint_format_config",
"name": "Lint / format config",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 11
},
{
"key": "static_type_checking",
"name": "Static type checking",
"detail": "Rust (statically typed)",
"points": 11,
"status": "met",
"details": [
{
"code": "statically_typed_language",
"params": {
"language": "Rust"
}
}
],
"max_points": 11
},
{
"key": "reproducible_environment",
"name": "Reproducible environment",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 10
},
{
"key": "demonstrated_agent_practice",
"name": "Demonstrated agent practice",
"detail": "no agent-authored commits among the last 100",
"points": 0,
"status": "missed",
"details": [
{
"code": "no_agent_authored_commits",
"params": {
"sampled": 100
}
}
],
"max_points": 10
},
{
"key": "automated_maintenance",
"name": "Automated maintenance",
"detail": "no automated dependency updates observed",
"points": 0,
"status": "missed",
"details": [
{
"code": "no_dependency_automation",
"params": {}
}
],
"max_points": 8
},
{
"key": "openssf_scorecard_pinned_dependencies",
"name": "OpenSSF Scorecard: Pinned-Dependencies",
"detail": "dependency not pinned by hash detected -- score normalized to 0",
"points": 0,
"status": "missed",
"details": [],
"max_points": 10
}
]
},
{
"key": "ai_code_legibility",
"band": "excellent",
"name": "Code legibility for models",
"note": null,
"notes": [],
"value": 100,
"inputs": {
"primary_language": "Rust",
"largest_source_bytes": 79752,
"source_files_sampled": 241,
"oversized_source_files": 2
},
"components": [
{
"key": "type_checkable_code",
"name": "Type-checkable code",
"detail": "Rust (statically typed)",
"points": 45,
"status": "met",
"details": [
{
"code": "statically_typed_language",
"params": {
"language": "Rust"
}
}
],
"max_points": 45
},
{
"key": "manageable_file_sizes",
"name": "Manageable file sizes",
"detail": "2/241 source files over 60KB",
"points": 54.5,
"status": "partial",
"details": [
{
"code": "oversized_source_files",
"params": {
"kb": 60,
"sampled": 241,
"oversized": 2
}
}
],
"max_points": 55
}
]
},
{
"key": "ai_interfaces",
"band": "at_risk",
"name": "Machine-readable interfaces",
"note": null,
"notes": [],
"value": 40,
"inputs": {
"example_dirs": [
"examples"
],
"has_mcp_signal": false,
"api_schema_files": []
},
"components": [
{
"key": "api_schema_openapi_graphql_proto",
"name": "API schema (OpenAPI/GraphQL/proto)",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 40
},
{
"key": "mcp_server",
"name": "MCP server",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 20
},
{
"key": "runnable_examples",
"name": "Runnable examples",
"detail": "examples",
"points": 40,
"status": "met",
"details": [
{
"code": "file_list",
"params": {
"files": "examples"
}
}
],
"max_points": 40
}
]
}
],
"description": "How well is the repo equipped to be developed and maintained with AI coding agents? An independent, experimental badge — weight 0.0, so it is surfaced on its own and does not affect the overall health score."
}
],
"metrics_version": "1.13.0"
},
"warnings": [
"Star history unavailable: GitHub GraphQL error: Resource not accessible by personal access token"
],
"report_type": "repository",
"generated_at": "2026-07-25T12:19:25.911514Z",
"schema_version": "0.27.0",
"badge_url": "https://raw.githubusercontent.com/inspect-software/badges/main/v1/c/chinedufn/swift-bridge.svg",
"full_name": "chinedufn/swift-bridge",
"license_state": "standard",
"license_spdx": "Apache-2.0"
}