【问题标题】:How to use zbus to list block devices?如何使用 zbus 列出块设备?
【发布时间】:2020-09-04 05:58:04
【问题描述】:

我想使用名为zbus 的 dbus 实现列出系统中所有可用的块设备。

UDisks2 documentation 提到了对org.freedesktop.UDisks2.Manager 接口的方法调用,称为GetBlockDevices,它接受IN a{sv} options, OUT ao block_objects 作为方法参数。

使用zbus,我写:

use std::error::Error;
use std::result::Result;
use zbus::{Connection, Proxy};

fn main() -> Result<(), Box<dyn Error>> {
    let connection = Connection::new_system()?;
    let p = Proxy::new(
        &connection,
        "org.freedesktop.UDisks2",
        "/org/freedesktop/UDisks2/Manager",
        "org.freedesktop.UDisks2.Manager",
    )?;
    let resp: Vec<zvariant::ObjectPath> = p.call("GetBlockDevices", &std::collections::HashMap::<String, zvariant::Value>::new())?;
    dbg!(resp);
    Ok(())
}

据我了解,zvariant Values 代表 DBus 变体。但是我收到以下错误:

error: implementation of `serde::de::Deserialize` is not general enough
   --> src/main.rs:13:45
    |
13  |       let resp: Vec<zvariant::ObjectPath> = p.call("GetBlockDevices", &std::collections::HashMap::<String, zvariant::Value>::new())?;
    |                                               ^^^^ implementation of `serde::de::Deserialize` is not general enough
    | 
   ::: /home/adnan338/.cargo/registry/src/github.com-1ecc6299db9ec823/serde-1.0.115/src/de/mod.rs:531:1
    |
531 | / pub trait Deserialize<'de>: Sized {
532 | |     /// Deserialize this value from the given Serde deserializer.
533 | |     ///
534 | |     /// See the [Implementing `Deserialize`][impl-deserialize] section of the
...   |
569 | |     }
570 | | }
    | |_- trait `serde::de::Deserialize` defined here
    |
    = note: `std::vec::Vec<zvariant::object_path::ObjectPath<'_>>` must implement `serde::de::Deserialize<'0>`, for any lifetime `'0`...
    = note: ...but `std::vec::Vec<zvariant::object_path::ObjectPath<'_>>` actually implements `serde::de::Deserialize<'1>`, for some specific lifetime `'1`

是什么原因造成的,我该如何避免这个错误?

【问题讨论】:

    标签: rust dbus freedesktop.org udisks


    【解决方案1】:

    首先,感谢您试用我们的箱子。问题是zbus::Proxy::call 期望返回值是拥有的,而您正在反序列化为无主类型。以下两项工作:

    // OwnedObjectPath require zvariant >= 2.2.0
    let resp: Vec<zvariant::OwnedObjectPath> = p.call(
        "GetBlockDevices",
        &std::collections::HashMap::<String, zvariant::Value>::new(),
    )?;
    
    let resp = p.call_method(
        "GetBlockDevices",
        &std::collections::HashMap::<String, zvariant::Value>::new(),
    )?; 
    let resp: Vec<zvariant::ObjectPath> = resp.body()?;
    

    【讨论】:

      猜你喜欢
      • 2010-12-08
      • 1970-01-01
      • 2015-07-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-05-10
      • 1970-01-01
      相关资源
      最近更新 更多