Как использовать функциональность ящика Rust с CLAP без использования командной строки?

новичок здесь, так что извиняюсь, если это глупый вопрос.

Я хотел бы использовать в своем коде функциональные возможности ящика wagyu. Этот ящик имеет функции командной строки, поэтому я могу запустить код из командной строки, но я не могу ссылаться на него из своего собственного кода.

Я пробовал 2 варианта:

  1. Репликация ожидаемого ввода "хлопка" при вызове ящика (структура с аргументами)
  2. Вызов определенной функции из ящика

Для пункта 2 я пробовал:

use wagyu::cli::ethereum;

fn main() {

    let m: String = String::from("sunny story shrimp absent valid today film floor month measure fatigue pet");
    
    // Returns the address of the corresponding mnemonic.
    let passphrase = "";
    let pathway = "m/44'/60'/0'/0";
    let address = ethereum::from_mnemonic(m, passphrase, pathway);
        
    println!("phrase: {:?}", address);

Когда я пытаюсь собрать этот код, я получаю следующую ошибку компиляции:

error[E0425]: cannot find function `from_mnemonic` in module `ethereum`
  --> src\main.rs:37:29
   |
37 |     let address = ethereum::from_mnemonic::<>(s, passphrase, pathway);
   |                             ^^^^^^^^^^^^^ not found in `ethereum`

Но я знаю, проверив код в ethereum.rs файл, что есть общедоступная функция с именем from_mnemonic (определенная в строке 88).

Кто-нибудь знает, почему я не могу вызвать эту функцию? Или, в качестве альтернативы, есть простой способ использовать ящик с зависимостью от хлопка без использования интерфейса командной строки?

Большое спасибо.


person Isambard_FA    schedule 22.02.2021    source источник
comment
Эта функция находится внутри impl EthereumWallet, поэтому вам сначала нужно создать экземпляр этой структуры, что вы не можете, поскольку структура является частной.   -  person Sven Marnach    schedule 22.02.2021
comment
Мне интересно, имеет ли значение объявление связанных функций частного типа как общедоступных. В настоящее время я не могу ни о чем думать.   -  person Sven Marnach    schedule 22.02.2021
comment
Спасибо, Свен, я этого и боялся. Есть ли способ имитировать ввод интерфейса командной строки? Например, запуск ящика из командной строки с: cargo run ethereum import-hd "sunny story shrimp absent valid today film floor month measure fatigue pet" вернет правильный результат. Можно ли имитировать структуру ввода хлопка с моими собственными параметрами из кода?   -  person Isambard_FA    schedule 22.02.2021
comment
Самое простое решение, которое я могу придумать, - это просто создать двоичный файл и вызвать его как подпроцесс.   -  person Sven Marnach    schedule 22.02.2021
comment
Примеры см. В std::process:Command.   -  person Sven Marnach    schedule 22.02.2021
comment
Спасибо. Я сейчас посмотрю, как это сделать!   -  person Isambard_FA    schedule 22.02.2021


Ответы (1)


Функцию from_mnemonic нужно вызывать так:

use wagyu::cli::ethereum::EthereumWallet;
use wagyu_ethereum::network::Mainnet; 
use wagyu_ethereum::wordlist::English;

fn main() {
    let mnemonic: String = String::from(
        "sunny story shrimp absent valid today. film floor month measure fatigue pet"
    );
    let passphrase = "";
    let path = "m/44'/60'/0'/0";

    let wallet = EthereumWallet::from_mnemonic::<Mainnet, English>(
        mnemonic,
        Some(passphrase),
        path
    ).unwrap()
}

Но wagyu::cli::ethereum::EthereumWallet не паб, так что вы не можете просто сделать это. Вам необходимо скачать исходный код wagyu с github и отредактировать его, чтобы wagyu::cli::ethereum::EthereumWallet стал общедоступным.

Я думаю, что единственное изменение, которое вам нужно сделать, это заменить это (в ethereum.rs):

struct EthereumWallet {

С этим:

pub struct EthereumWallet {
person Hadus    schedule 24.02.2021
comment
Большое спасибо, Хадус, что нашли время дать свой развернутый ответ. На самом деле я начал отходить от использования функции Wagyu crate, поскольку не уверен, что она дает мне правильный адрес. Когда я использую ту же мнемонику на фантастическом веб-сайте Иэна Коулмана, я получаю другой адрес (и правильный, который можно проверить через MetaMask). Я собираюсь опубликовать отдельный вопрос, связанный с использованием функции keccak-256, которую я изо всех сил пытаюсь заставить работать. Спасибо еще раз. - person Isambard_FA; 26.02.2021
comment
Новый запрос на использование алгоритма keccak-256 здесь - person Isambard_FA; 26.02.2021