use crate::{CollectError, ColumnType, Datatype, Dim, Table};
use polars::prelude::*;
use std::collections::HashMap;
#[macro_export]
macro_rules! store {
($schema:expr, $columns:expr, $col_name:ident, $value:expr) => {
if $schema.has_column(stringify!($col_name)) {
$columns.$col_name.push($value);
}
};
}
pub trait ColumnData: Default + crate::Dataset {
fn column_types() -> indexmap::IndexMap<&'static str, ColumnType>;
fn base_default_columns() -> Vec<&'static str> {
match Self::default_columns() {
Some(columns) => columns,
None => Self::column_types().keys().cloned().collect(),
}
}
fn base_default_blocks() -> Option<String> {
Self::default_blocks()
}
fn base_default_sort() -> Vec<String> {
match Self::default_sort() {
Some(sort) => sort.iter().map(|x| x.to_string()).collect(),
None => {
let mut sort = Vec::new();
let columns = Self::column_types();
for name in ["block_number", "transaction_index", "log_index"] {
if (name == "transaction_index") & columns.contains_key("log_index") {
continue
}
if columns.contains_key(name) {
sort.push(name.to_string())
}
}
sort
}
}
}
fn base_arg_aliases() -> HashMap<Dim, Dim> {
match Self::arg_aliases() {
Some(x) => x,
None => HashMap::new(),
}
}
}
pub trait ToDataFrames: Sized {
fn create_dfs(
self,
schemas: &HashMap<Datatype, Table>,
chain_id: u64,
) -> Result<HashMap<Datatype, DataFrame>, CollectError>;
}
pub trait Dataset: Sync + Send {
fn aliases() -> Vec<&'static str> {
vec![]
}
fn default_sort() -> Option<Vec<&'static str>> {
None
}
fn default_columns() -> Option<Vec<&'static str>> {
None
}
fn optional_parameters() -> Vec<Dim> {
vec![]
}
fn required_parameters() -> Vec<Dim> {
vec![]
}
fn default_blocks() -> Option<String> {
None
}
fn use_block_ranges() -> bool {
false
}
fn arg_aliases() -> Option<HashMap<Dim, Dim>> {
None
}
}