[−][src]Crate zbus
This crate provides the main API you will use to interact with D-Bus from Rust. It takes care of the establishment of a connection, the creation, sending and receiving of different kind of D-Bus messages (method calls, signals etc) for you.
zbus crate is currently Linux-specific1.
Getting Started
The best way to get started with zbus is the book, where we start with basic D-Bus concepts and explain with code samples, how zbus makes D-Bus easy.
Example code
Client
This code display a notification on your Freedesktop.org-compatible OS:
use std::collections::HashMap; use std::error::Error; use zbus::dbus_proxy; use zvariant::Value; #[dbus_proxy] trait Notifications { fn notify( &self, app_name: &str, replaces_id: u32, app_icon: &str, summary: &str, body: &str, actions: &[&str], hints: HashMap<&str, &Value>, expire_timeout: i32, ) -> zbus::Result<u32>; } fn main() -> Result<(), Box<dyn Error>> { let connection = zbus::Connection::new_session()?; let proxy = NotificationsProxy::new(&connection)?; let reply = proxy.notify( "my-app", 0, "dialog-information", "A summary", "Some body", &[], HashMap::new(), 5000, )?; dbg!(reply); Ok(()) }
Server
A simple service that politely greets whoever calls its SayHello
method:
use std::error::Error; use std::convert::TryInto; use zbus::{dbus_interface, fdo}; struct Greeter { count: u64 }; #[dbus_interface(name = "org.zbus.MyGreeter1")] impl Greeter { fn say_hello(&mut self, name: &str) -> String { self.count += 1; format!("Hello {}! I have been called: {}", name, self.count) } } fn main() -> Result<(), Box<dyn Error>> { let connection = zbus::Connection::new_session()?; fdo::DBusProxy::new(&connection)?.request_name( "org.zbus.MyGreeter", fdo::RequestNameFlags::ReplaceExisting.into(), )?; let mut object_server = zbus::ObjectServer::new(&connection); let mut greeter = Greeter { count: 0 }; object_server.at(&"/org/zbus/MyGreeter".try_into()?, greeter)?; loop { if let Err(err) = object_server.try_handle_next() { eprintln!("{}", err); } } }
You can use the following command to test it:
$ busctl --user call \
org.zbus.MyGreeter \
/org/zbus/MyGreeter \
org.zbus.MyGreeter1 \
SayHello s "Maria"
Hello Maria!
$
Support for other OS exist, but it is not supported to the same extent. D-Bus clients in javascript (running from any browser) do exist though. And zbus may also be working from the browser sometime in the future too, thanks to Rust 🦀 and WebAssembly 🕸. ↩
Modules
fdo | D-Bus standard interfaces. |
xml | Introspection XML support ( |
Structs
Connection | A D-Bus connection. |
Guid | A D-Bus server GUID. |
Message | A D-Bus Message. |
MessageFields | A collection of |
MessageHeader | The message header, containing all the metadata about the message. |
MessagePrimaryHeader | The primary message header, which is present in all D-Bus messages. |
ObjectServer | An object server, holding server-side D-Bus objects & interfaces. |
Proxy | A client-side interface proxy. |
Enums
EndianSig | D-Bus code for endianness. |
Error | The error type for |
MessageError | Error type returned by |
MessageField | The dynamic message header. |
MessageFieldCode | The message field code. |
MessageFlags | Pre-defined flags that can be passed in Message header. |
MessageType | Message header representing the D-Bus type of the message. |
Constants
NATIVE_ENDIAN_SIG | Signature of the target's native endian. |
Traits
Interface | The trait used to dispatch messages to an interface instance. |
Type Definitions
Result | Alias for a |
Attribute Macros
dbus_interface | Attribute macro for implementing a D-Bus interface. |
dbus_proxy | Attribute macro for defining a D-Bus proxy (using zbus |
Derive Macros
DBusError | Derive macro for defining a D-Bus error. |