Skip to content
On this page

Objects

Rust structs with methods and associated functions will be exposed in bindings as objects. Note that uniffi cannot expose Rust structs that have both data and methods/functions; one must choose one or the other. Structs that only contain data fields use the dictionnary keyword and become data classes in Kotlin, and structs that only contain methods/functions use the interface keyword and become objects in Kotlin.

Example

See the 4-objects directory for a full example. Suppose a Rust struct is defined as such:

rust
struct Calendar {
    id: i32
}

impl Calendar {
    fn new(id: i32) -> Self {
        Calendar { id }
    }

    fn get_info(&self) -> String {
        format!("Your calendar has id {}", self.id)
    }

    fn add(&self, a: i32, b: i32) -> i32 {
        a + b
    }

    fn divide(&self, a: i32, b: i32) -> Result<i32, CalendarError> {
        if b == 0 {
            Err(CalendarError::DivisionBy0)
        } else {
            let answer: i32 = a / b;
            Ok(answer)
        }
    }
}

It's UDL representation would be:

uniffi-udl
namespace calendar {};

interface Calendar {
  constructor(i32 id);

  string get_info();

  i32 add(i32 a, i32 b);

  [Throws=CalendarError]
  i32 divide(i32 a, i32 b);
};

[Error]
enum CalendarError {
  "DivisionBy0",
};

And the generated Kotlin class would be:

kotlin
public class Calendar(id: Int) {
    fun getInfo(): String
    
    fun add(a: Int, b: Int): Int
    
    @Throws(CalendarException::class)
    fun divide(a: Int, b: Int): Int
}