dexpaprika-cli 0.1.8

DexPaprika CLI — free DEX data from the terminal. Pools, tokens, on-chain trades across 33+ chains.
use tabled::{Table, Tabled};
use tabled::settings::Style;

use crate::commands::networks::{Network, Dex};
use crate::output::{format_usd, print_dexpaprika_footer};

#[derive(Tabled)]
struct NetworkRow {
    #[tabled(rename = "ID")]
    id: String,
    #[tabled(rename = "Name")]
    name: String,
    #[tabled(rename = "Volume (24h)")]
    volume: String,
    #[tabled(rename = "Txns (24h)")]
    txns: String,
    #[tabled(rename = "Pools")]
    pools: String,
}

pub fn print_networks_table(networks: &[Network]) {
    let rows: Vec<NetworkRow> = networks.iter().map(|n| NetworkRow {
        id: n.id.clone(),
        name: n.display_name.clone().unwrap_or_else(|| n.id.clone()),
        volume: n.volume_usd_24h.map(format_usd).unwrap_or_else(|| "".into()),
        txns: n.txns_24h.map(|t| t.to_string()).unwrap_or_else(|| "".into()),
        pools: n.pools_count.map(|p| p.to_string()).unwrap_or_else(|| "".into()),
    }).collect();

    let table = Table::new(rows).with(Style::rounded()).to_string();
    println!("{table}");
    print_dexpaprika_footer();
}

#[derive(Tabled)]
struct DexRow {
    #[tabled(rename = "ID")]
    id: String,
    #[tabled(rename = "Name")]
    name: String,
    #[tabled(rename = "Protocol")]
    protocol: String,
    #[tabled(rename = "Pools")]
    pools: String,
    #[tabled(rename = "Volume (24h)")]
    volume: String,
    #[tabled(rename = "Txns (24h)")]
    txns: String,
}

pub fn print_dexes_table(dexes: &[Dex]) {
    let rows: Vec<DexRow> = dexes.iter().map(|d| DexRow {
        id: d.dex_id.clone().unwrap_or_else(|| "".into()),
        name: d.dex_name.clone().unwrap_or_else(|| "".into()),
        protocol: d.protocol.clone().unwrap_or_else(|| "".into()),
        pools: d.pools_count.map(|p| p.to_string()).unwrap_or_else(|| "".into()),
        volume: d.volume_usd_24h.map(format_usd).unwrap_or_else(|| "".into()),
        txns: d.txns_24h.map(|t| t.to_string()).unwrap_or_else(|| "".into()),
    }).collect();

    let table = Table::new(rows).with(Style::rounded()).to_string();
    println!("{table}");
    print_dexpaprika_footer();
}