eth-etl-core 0.1.0

Core types and utilities for Ethereum ETL
Documentation
use serde::{Deserialize, Serialize};

/// ERC20/ERC721 token metadata
#[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub struct EthToken {
    #[serde(rename = "type", default = "default_token_type")]
    pub item_type: String,
    pub address: String,
    pub symbol: Option<String>,
    pub name: Option<String>,
    pub decimals: Option<u8>,
    pub total_supply: Option<String>,
    pub block_number: u64,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub block_hash: Option<String>,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub block_timestamp: Option<u64>,
}

fn default_token_type() -> String {
    "token".to_string()
}

impl EthToken {
    /// Get CSV headers for token export
    pub fn csv_headers() -> &'static [&'static str] {
        &[
            "address",
            "symbol",
            "name",
            "decimals",
            "total_supply",
            "block_number",
        ]
    }

    /// Convert to CSV row
    pub fn to_csv_row(&self) -> Vec<String> {
        vec![
            self.address.clone(),
            self.symbol.clone().unwrap_or_default(),
            self.name.clone().unwrap_or_default(),
            self.decimals.map(|v| v.to_string()).unwrap_or_default(),
            self.total_supply.clone().unwrap_or_default(),
            self.block_number.to_string(),
        ]
    }
}