Callback interfaces

Callback interfaces are a special implementation of Rust traits implemented by foreign languages.

These are described in both UDL and proc-macros as an explicit "callback interface". They are (soft) deprecated, remain now for backwards compatibility, but probably should be avoided.

This document describes the differences from regular traits.

Defining a callback

If you must define a callback in UDL it would look like:

callback interface Keychain {
  // as described in the foreign traits docs...
};

procmacros support it too, but just don't use it :)

Box and Send + Sync?

Traits defined purely for callbacks probably don't technically need to be Sync in Rust, but they conceptually are, just outside of Rust's view.

That is, the methods of the foreign class must be safe to call from multiple threads at once, but Rust can not enforce this in the foreign code.

Rust signature differences

Consider the examples in Rust traits implemented by foreign languages.

If the traits in question are defined as a "callback" interface, the Arc<dyn Keychain> types would actually be Box<dyn Keychain> - eg, the Rust implementation of the Authenticator constructor would be fn new(keychain: Box<dyn Keychain>) -> Self instead of the Arc<>.