Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

rcore-os/crate_interface

Folders and files

NameName
Last commit message
Last commit date

Latest commit

History

13 Commits

Repository files navigation

crate_interface

Crates.io Docs.rs CI

Provides a way to define an interface (trait) in a crate, but can implement or use it in any crate. It 's usually used to solve the problem of circular dependencies between crates.

Example

// Define the interface
#[crate_interface::def_interface]
pub trait HelloIf {
 fn hello(&self, name: &str, id: usize) -> String;
}
// Implement the interface in any crate
struct HelloIfImpl;
#[crate_interface::impl_interface]
impl HelloIf for HelloIfImpl {
 fn hello(&self, name: &str, id: usize) -> String {
 format!("Hello, {} {}!", name, id)
 }
}
// Call `HelloIfImpl::hello` in any crate
use crate_interface::call_interface;
assert_eq!(
 call_interface!(HelloIf::hello("world", 123)),
 "Hello, world 123!"
);
assert_eq!(
 call_interface!(HelloIf::hello, "rust", 456), // another calling style
 "Hello, rust 456!"
);

Implementation

The procedural macros in the above example will generate the following code:

// #[def_interface]
pub trait HelloIf {
 fn hello(&self, name: &str, id: usize) -> String;
}
#[allow(non_snake_case)]
pub mod __HelloIf_mod {
 use super::*;
 extern "Rust" {
 pub fn __HelloIf_hello(name: &str, id: usize) -> String;
 }
}
struct HelloIfImpl;
// #[impl_interface]
impl HelloIf for HelloIfImpl {
 #[inline]
 fn hello(&self, name: &str, id: usize) -> String {
 {
 #[inline]
 #[export_name = "__HelloIf_hello"]
 extern "Rust" fn __HelloIf_hello(name: &str, id: usize) -> String {
 let _impl: HelloIfImpl = HelloIfImpl;
 _impl.hello(name, id)
 }
 }
 {
 format!("Hello, {} {}!", name, id)
 }
 }
}
// call_interface!
assert_eq!(
 unsafe { __HelloIf_mod::__HelloIf_hello("world", 123) },
 "Hello, world 123!"
);

Packages

No packages published

Languages

  • Rust 100.0%

AltStyle によって変換されたページ (->オリジナル) /