[][src]Crate fruity

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
  5. Modules
  6. Macros

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.

Most of these types are classes that inherit from each other. Because Rust does not have inheritance and instead prefers composition, this crate uses Deref to fake inheritance.

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 are still not 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.

Modules

core_foundation

Core Foundation framework.

foundation

Foundation framework.

objc

Objective-C library.

Macros

nsstring

Creates an NSString from a static string.

selector

Creates a SEL from a selector literal.

selector_str

Creates a &'static str from a selector literal, that may be used as the basis of a SEL.