Как добавить новые строки между несколькими вызовами API, возвращающего JSON? - PullRequest
0 голосов
/ 21 сентября 2018

Я работаю над оболочкой API для Etherscan.io.У меня get_balance() работает с несколькими проблемами:

use super::Config;
use hyper::rt::{Future, Stream};
use hyper::{Body, Client};
use hyper_tls::HttpsConnector;
use serde_json::from_slice;
use std::io::{self, Write};

#[derive(Deserialize)]
struct Account<'a> {
    result: &'a [u8],
}

pub fn get_balance(config: Config) -> impl Future<Item = (), Error = ()> {
    let uri = format!(
        "https://api.etherscan.io/api?module={}&action={}&address={}&tag={}&apiKey={}",
        config.module, config.action, config.address, config.tag, config.api_key
    ).parse()
    .unwrap();

    let https = HttpsConnector::new(4).unwrap();
    let client = Client::builder().build::<_, Body>(https);

    client
        .get(uri)
        .and_then(|res| {
            res.into_body().for_each(|chunk| {
                let data: Account = from_slice(&chunk).unwrap();
                io::stdout()
                    .write_all(data.result)
                    .map_err(|e| panic!("Something went wrong!, {}", e))
            })
        }).map_err(|e| {
            eprintln!("Error {}", e);
        })
}

Сейчас я использую serde_json для десериализации поля result в выводе JSON из API Etherscan в переменную типа Account,

В двоичном файле для этого ящика я прочитал файл, содержащий список адресов Ethereum, разделенных строками, и вызываю функцию get_balance для каждого адреса.В настоящее время выходные данные выглядят так:

Grabbing balances..
 2978949000000000000050000000000118989773837777777707832422000000000077725000000000005585715000000000632954201591000000000000039261000000000922242282421612059956805551700000009340396200000000001302155554000000000001024761480000000000000646546600000000025849226140000000173919401191242898017721300000000000282583067321734110921765800000000010664815135755183661247667868029222166231631200777777777719780855300000000020000000000009862760431183982253209705167363654310198841461200000000000422146084184411875600927519797468763322494071578107259000000000000460845548541297500001497258879653777777777097542367974112844500097065356751518011568537848158458245828091288718199214820000000000012229358000000000019172756010000000000818949139302890483000000000000671348000000000000396900000000000000004692796996935622836101639000000000004313773803864317079183499000000000001851446000000292904912031700000000002833822400000000118576145806291502820102991980000000000031095375771474016024005236052920127528866968915028175902833735562412900300

Как видите, каждый баланс печатается один за другим, без символа новой строки, чтобы отделить какой-либо из них.Кроме того, вывод довольно задерживается, как будто он ожидает заполнения буфера перед записью на экран.Будет ли это из-за того, что тип, используемый для вызова write_all, равен &[u8]?

Как мне отформатировать вывод так, как я ищу, то есть с каждым балансом на новой строке?

1 Ответ

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

Звонок на .map() - это то, что я искал:

client.get(uri).and_then(|res| {
    res.into_body()
        .for_each(|chunk| {
            let data: Account = from_slice(&chunk).unwrap();
            io::stdout()
                .write_all(data.result)
                .map_err(|e| panic!("Something went wrong!, {}", e))
        }).map(|_| {
            print!("\n");
        })
})
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...