use rustbus::signature;
use rustbus::wire::marshal::MarshalContext;
use rustbus::Marshal;
use rustbus::Signature;
struct MyType {
x: u64,
sub: Sub,
}
enum Sub {
Main(MySubType),
Other(MyOtherSubType),
}
rustbus::dbus_variant_sig!(MyVar, Int32 => i32; Int64 => i64);
rustbus::dbus_variant_var!(CharVar, U16 => u16; String => String);
use rustbus::message_builder::marshal_as_variant;
impl Signature for &MyType {
fn signature() -> signature::Type {
signature::Type::Container(signature::Container::Struct(
signature::StructTypes::new(vec![
u64::signature(),
signature::Type::Container(signature::Container::Struct(
signature::StructTypes::new(vec![
signature::Type::Base(signature::Base::String),
signature::Type::Container(signature::Container::Variant),
])
.unwrap(),
)),
])
.unwrap(),
))
}
fn has_sig(sig: &str) -> bool {
sig == "(t(sv))"
}
fn alignment() -> usize {
8
}
}
impl Marshal for &MyType {
fn marshal(&self, ctx: &mut MarshalContext) -> Result<(), rustbus::wire::errors::MarshalError> {
ctx.align_to(8);
self.x.marshal(ctx)?;
match &self.sub {
Sub::Main(t) => {
"Main".marshal(ctx)?;
marshal_as_variant(t, ctx.byteorder, ctx.buf, ctx.fds)?;
}
Sub::Other(t) => {
"Other".marshal(ctx)?;
marshal_as_variant(t, ctx.byteorder, ctx.buf, ctx.fds)?
}
};
Ok(())
}
}
struct MySubType {
x: i32,
y: i32,
}
struct MyOtherSubType {
x: u32,
y: u32,
}
impl Signature for &MySubType {
fn signature() -> signature::Type {
signature::Type::Container(signature::Container::Struct(
signature::StructTypes::new(vec![i32::signature(), i32::signature()]).unwrap(),
))
}
fn alignment() -> usize {
8
}
fn has_sig(sig: &str) -> bool {
sig == "(ii)"
}
}
impl Marshal for &MySubType {
fn marshal(&self, ctx: &mut MarshalContext) -> Result<(), rustbus::wire::errors::MarshalError> {
ctx.align_to(8);
self.x.marshal(ctx)?;
self.y.marshal(ctx)?;
Ok(())
}
}
impl Signature for &MyOtherSubType {
fn signature() -> signature::Type {
signature::Type::Container(signature::Container::Struct(
signature::StructTypes::new(vec![u32::signature(), u32::signature()]).unwrap(),
))
}
fn alignment() -> usize {
8
}
fn has_sig(sig: &str) -> bool {
sig == "(uu)"
}
}
impl Marshal for &MyOtherSubType {
fn marshal(&self, ctx: &mut MarshalContext) -> Result<(), rustbus::wire::errors::MarshalError> {
ctx.align_to(8);
self.x.marshal(ctx)?;
self.y.marshal(ctx)?;
Ok(())
}
}
use rustbus::{connection::Timeout, get_session_bus_path, DuplexConn, MessageBuilder};
fn main() -> Result<(), rustbus::connection::Error> {
let session_path = get_session_bus_path()?;
let mut con = DuplexConn::connect_to_bus(session_path, true)?;
con.send_hello(Timeout::Infinite)?;
let mut sig = MessageBuilder::new()
.signal("io.killing.spark", "TestSignal", "/io/killing/spark")
.build();
let t = MyType {
x: 123456,
sub: Sub::Main(MySubType {
x: 42387i32,
y: 34875i32,
}),
};
let t2 = MyType {
x: 123456,
sub: Sub::Other(MyOtherSubType {
x: 42387u32,
y: 34875u32,
}),
};
sig.body.push_param(&t)?;
sig.body.push_param(&t2)?;
sig.body.push_param(MyVar::Int32(100))?;
sig.body.push_param(MyVar::Int64(-100))?;
con.send.send_message(&mut sig)?.write_all().unwrap();
Ok(())
}