All Projects → nvzqz → Fruity

nvzqz / Fruity

Licence: other
Rusty bindings for Apple libraries

Programming Languages

rust
11053 projects
objc
23 projects

Projects that are alternatives of or similar to Fruity

Macdriver
Native Mac APIs for Go
Stars: ✭ 3,582 (+4875%)
Mutual labels:  apple, bindings, cocoa
Statusalert
Display Apple system-like self-hiding status alerts. It is well suited for notifying user without interrupting user flow in iOS-like way.
Stars: ✭ 809 (+1023.61%)
Mutual labels:  apple, system, uikit
About Swiftui
Gathering all info published, both by Apple and by others, about new framework SwiftUI.
Stars: ✭ 5,954 (+8169.44%)
Mutual labels:  apple, uikit
Sonoff Homekit
Make your Sonoff Switch compatible with Apple Homekit! 🎉
Stars: ✭ 722 (+902.78%)
Mutual labels:  api, apple
Bfkit
BFKit is a collection of useful classes and categories to develop Apps faster.
Stars: ✭ 811 (+1026.39%)
Mutual labels:  uikit, foundation
Mtlpp
C++ Metal wrapper
Stars: ✭ 425 (+490.28%)
Mutual labels:  apple, graphics
Fluentui Apple
UIKit and AppKit controls for building native Microsoft experiences
Stars: ✭ 459 (+537.5%)
Mutual labels:  uikit, cocoa
Swiftui
A collaborative list of awesome SwiftUI resources. Feel free to contribute!
Stars: ✭ 774 (+975%)
Mutual labels:  apple, uikit
Objc Uti
Objective-C wrapper for Uniform Type Identifiers (UTIs)
Stars: ✭ 7 (-90.28%)
Mutual labels:  uikit, cocoa
Tablebinding
Swift NSTableView bound to an NSArrayController
Stars: ✭ 8 (-88.89%)
Mutual labels:  bindings, cocoa
Purge Wrangler
AMD & NVIDIA eGPUs for all Thunderbolt Macs.
Stars: ✭ 960 (+1233.33%)
Mutual labels:  apple, graphics
Compositional Layouts Kit
📏 A set of advanced compositional layouts for UICollectionView with examples [Swift 5.3, iOS 13].
Stars: ✭ 317 (+340.28%)
Mutual labels:  apple, uikit
Nuklear Rust
The bindings to the Nuklear 2D immediate GUI library.
Stars: ✭ 308 (+327.78%)
Mutual labels:  graphics, bindings
Swiftai
SwiftAI, write Swift code smart. SwiftAI can generate Model class from JSON now. Codable and HandyJSON is supported. More features will be add.
Stars: ✭ 470 (+552.78%)
Mutual labels:  uikit, cocoa
Wtrequestcenter
WTKit is my Code accumulation
Stars: ✭ 293 (+306.94%)
Mutual labels:  uikit, foundation
Spalert
Native alert from Apple Music & Feedback. Contains Done, Heart & Message and other presets.
Stars: ✭ 1,014 (+1308.33%)
Mutual labels:  apple, uikit
Disgord
Go module for interacting with the documented Discord's bot interface; Gateway, REST requests and voice
Stars: ✭ 277 (+284.72%)
Mutual labels:  api, bindings
Framework Codeidea
System file classification
Stars: ✭ 289 (+301.39%)
Mutual labels:  uikit, foundation
Gopherjs Electron
Gopherjs bindings for Electron with an API translator.
Stars: ✭ 26 (-63.89%)
Mutual labels:  bindings, uikit
Bfkit Swift
BFKit-Swift is a collection of useful classes, structs and extensions to develop Apps faster.
Stars: ✭ 963 (+1237.5%)
Mutual labels:  uikit, foundation

Fruity

github crates.io docs.rs

Rusty bindings for Apple libraries, brought to you by @NikolaiVazquez.

Index

  1. Donate
  2. Usage
    1. Feature Flags
  3. Goals
    1. Idiomatic Rust
    2. Zero Cost
  4. License

Donate

If this project is useful to you, consider sponsoring me or donating directly!

Doing so enables me to create high-quality open source software like this. ❤️

Usage

This library is available on crates.io and can be used in your project by adding the following to your project's Cargo.toml:

[dependencies.fruity]
version = "0.2.0"

Feature Flags

Each module for a library or framework has its own feature flag with the same name.

For example, this is how you enable the foundation module:

[dependencies.fruity]
version = "0.2.0"
features = ["foundation"]

This feature transitively enables the objc feature/module.

Goals

Idiomatic Rust

Fruity makes interfacing with these C and Objective-C APIs feel natural in Rust.

  • Automatic Reference Counting.

    Fruity takes advantage of Rust's ownership model to handle object reference counting for you.

    NSObject is a smart pointer that calls retain on Clone and release on Drop. This is exactly how Rust's Arc<T> works.

  • Option<NSObject>.

    In Objective-C, all objects are nullable unless marked with _Nonnull. This often leads to either very defensive checks or careless ignoring of null objects.

    Fruity reverses that and instead makes all objects (such as NSObject) non-null by default. An object can be made nullable by wrapping it with Option<T>.

    To make FFI safe and easy, the following Objective-C and Rust types are ABI-compatible:

    • NSObject * _Nonnull and NSObject

    • NSObject * _Nullable and Option<NSObject>

    This is because NSObject is a #[repr(transparent)] wrapper around a NonNull<T> pointer.

  • Result<T, NSError>.

    In Objective-C, methods take a pointer to where an NSError is placed upon failure. This makes it easy to avoid error handling and assume the happy path, which can lead to bugs when errors occur.

    Fruity instead returns a Result, which is the canonical way to handle errors in Rust. This ensures that errors must be acknowledged in some way.

  • Natural inheritance.

    Most of these types are classes that inherit from each other. Because true inheritance is not possible in Rust, Fruity uses Deref to model Objective-C subclassing.

  • Builder Pattern.

    Types like DispatchQueue have many configurable inputs to create an instance. Many of these inputs have standard default values, so it is cumbersome to specify them all each time. Swift solves this by having default parameters in init. However, Rust does not have default function parameters.

    Fruity instead solves this using the builder pattern. See DispatchQueueBuilder as an example. This reduces and simplifies code for creating dispatch queues.

Zero Cost

Using Fruity to interface with Objective-C libraries should have as little runtime cost as writing the same code directly in Objective-C.

This is true for the following:

  • Calling object methods.

    Method dispatch is always direct and does not need the error checking overhead of other wrappers that use the objc::msg_send! macro. This also reduces the size of your program by not emitting panics that would otherwise never get called.

    This library is carefully written to ensure that calls to objc_msgSend are always done with the correct object type, method selector, and arguments.

  • Getting a static class.

    Getters like NSString::class retrieve the class directly through its symbol. This is instantaneous, especially when compared to calling into the Objective-C runtime via objc_getClass.

  • Creating an NSString from a Rust string literal.

    The nsstring! macro creates an NSString literal (i.e. @"string") at compile time. There is no runtime dispatch/allocation/initialization cost.

Some parts of this library still aren't zero cost. Your help would be much appreciated here!

These are:

  • The selector! macro. See issue #2 for details.

License

This project is released under either the MIT License or Apache License (Version 2.0), at your choosing.

Note that the project description data, including the texts, logos, images, and/or trademarks, for each open source project belongs to its rightful owner. If you wish to add or remove any projects, please contact us at [email protected].