use anyhow::{Context, Result};
use serde::Deserialize;
use std::path::{Path, PathBuf};
#[derive(Debug, Default, Clone, Deserialize)]
#[serde(deny_unknown_fields)]
pub struct Config {
pub rpc: Option<String>,
pub backup_rpc: Option<String>,
pub proof_window: Option<u64>,
pub data: Option<PathBuf>,
#[serde(default)]
pub watch: Vec<alloy_primitives::Address>,
pub layout: Option<PathBuf>,
#[serde(default)]
pub layouts: std::collections::HashMap<alloy_primitives::Address, PathBuf>,
}
impl Config {
pub fn load(path: Option<&Path>) -> Result<Self> {
let path = match path {
Some(p) => p.to_path_buf(),
None => {
let p = PathBuf::from("balq.toml");
if !p.exists() {
return Ok(Self::default());
}
p
}
};
let text = std::fs::read_to_string(&path)
.with_context(|| format!("reading {}", path.display()))?;
toml::from_str(&text).with_context(|| format!("parsing {}", path.display()))
}
pub fn rpc(&self, flag: Option<String>) -> Result<String> {
flag.or_else(|| self.rpc.clone())
.context("no RPC endpoint: pass --rpc <url> or set `rpc` in balq.toml")
}
}