условная компиляция внутри перечисления - PullRequest
0 голосов
/ 07 сентября 2018

У меня есть что-то вроде этого:

#[macro_use]
extern crate quick_error;

#[cfg(target_os = "linux")]
#[macro_use]
extern crate nix;

quick_error! {
    #[derive(Debug)]
    pub enum Error {
        DeviceNotFound{
            description("Could not find a ledger device")
        }
        Ioctl ( err: nix::Error ) {
            from()
            description("ioctl error")
            display("ioctl error: {}", err)
            cause(err)
        }
    }
 }

У меня проблема в том, что nix доступна только в Linux.

Как я могу сделать Ioctl условным для Linux? Или это плохая идея?

Интересно, каков рекомендуемый подход в Rust.

Альтернатива: могу ли я использовать типы ящиков nix даже в Windows, если я не использую какую-либо функцию / метод? В этом случае мне не нужно делать это условным.


Обновление: Кажется, что линия from() связана с проблемой.

@ Stargateur определенно работает для большинства случаев, но не для моего конкретного вопроса. Я добавляю сюда Пример кода .

#[macro_use]
extern crate quick_error;

quick_error! {
    #[derive(Debug)]
    pub enum Error {
        DeviceNotFound{
            description("Could not find a ledger device")
        }
        #[cfg(target_os = "windows")]
        Ioctl ( err: nix::Error ) {
            from()
            description("ioctl error")
            display("ioctl error: {}", err)
            cause(err)
        }
    }
 }

 fn main() {
    let _ = Error::DeviceNotFound;
}

Ответы [ 2 ]

0 голосов
/ 08 сентября 2018

Так что использование условной компиляции внутри quickerror было невозможно.После некоторых экспериментов мне пришла в голову идея просто издеваться над типом на платформах, где его не существует:

#[macro_use]
extern crate quick_error;
#[macro_use]
extern crate cfg_if;

cfg_if! {
    if #[cfg(target_os = "linux")] {
        extern crate nix;
    } else {
        // Mock the type in other target_os
        mod nix {
            quick_error! {
                #[derive(Debug)]
                pub enum Error {}
            }
        }
    }
}

quick_error! {
    #[derive(Debug)]
    pub enum Error {
        DeviceNotFound{
            description("Could not find a ledger device")
        }
        Ioctl ( err: nix::Error ) {
            from()
            description("ioctl error")
            display("ioctl error: {}", err)
            cause(err)
        }
    }
 }
0 голосов
/ 08 сентября 2018

Как я могу сделать Ioctl условным для Linux?

Обычно вы можете просто поставить #[cfg(target_os = "linux")] впереди:

#[cfg(target_os = "linux")]
Ioctl(err: nix::Error) {
    from()
    description("ioctl error")
    display("ioctl error: {}", err)
    cause(err)
}

Но похоже, что quick_error не поддерживает его, поэтому вы можете открыть функцию запроса на github , но ящик не очень активен (без обид) или вы можете просто не использовать этот ящик и сделайте ваш тип ошибки "вручную".

Интересно, каков рекомендуемый подход в Rust.

Это основано на мнении, делай как хочешь.

Альтернатива: могу ли я использовать типы ящиков nix даже в Windows, если я не использую какую-либо функцию / метод? В этом случае мне не нужно делать это условным.

Нет, вы не можете использовать ящик, который не компилируется.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...