ghost-crab 0.2.0

ethereum indexer SDK 👻🦀
Documentation
use dotenvy::dotenv;
use once_cell::sync::Lazy;
use serde::Deserialize;
use std::collections::HashMap;
use std::{env, fs};

use crate::process_logs::ExecutionMode;

#[derive(Debug, Deserialize, Clone)]
#[serde(rename_all = "camelCase")]
pub struct Template {
    pub abi: String,
    pub network: String,
    pub execution_mode: Option<ExecutionMode>,
}

#[derive(Debug, Deserialize, Clone)]
#[serde(rename_all = "camelCase")]
pub struct DataSource {
    pub abi: String,
    pub address: String,
    pub start_block: u64,
    pub network: String,
    pub execution_mode: Option<ExecutionMode>,
}

#[derive(Debug, Deserialize, Clone)]
#[serde(rename_all = "camelCase")]
pub struct BlockHandler {
    pub start_block: u64,
    pub network: String,
    pub execution_mode: Option<ExecutionMode>,
    pub step: u64,
}

#[derive(Debug, Deserialize, Clone)]
#[serde(rename_all = "camelCase")]
pub struct Config {
    pub data_sources: HashMap<String, DataSource>,
    pub templates: HashMap<String, Template>,
    pub networks: HashMap<String, String>,
    pub block_handlers: HashMap<String, BlockHandler>,
}

static CONFIG_CACHE: Lazy<Config> = Lazy::new(|| {
    dotenv().ok();
    let current_dir = env::current_dir().unwrap();
    let config_string = fs::read_to_string(current_dir.join("config.json")).unwrap();
    let mut config: Config = serde_json::from_str(&config_string).unwrap();

    config.networks.iter_mut().for_each(|(_key, value)| {
        if value.starts_with("$") {
            *value = env::var(&value[1..]).unwrap();
        }
    });

    config
});

pub fn load() -> Config {
    return CONFIG_CACHE.clone();
}