use crate::ToolError;
use crate::models::pubkey_base58::PubkeyBase58;
use serde::{Deserialize, Serialize};
#[derive(Debug, Deserialize, Serialize, Clone, PartialEq)]
pub struct LookupTableEntry {
#[serde(default)]
pub writable: Vec<PubkeyBase58>,
#[serde(default)]
pub readonly: Vec<PubkeyBase58>,
}
pub fn parse_lookup_tables(
json: &str,
) -> Result<LookupTableEntry, ToolError> {
#[derive(Deserialize)]
struct RawEntry {
#[serde(default)]
pub writable: Vec<String>,
#[serde(default)]
pub readonly: Vec<String>,
}
let raw: RawEntry = serde_json::from_str(json)
.map_err(|e| ToolError::InvalidInput(format!("invalid lookup tables JSON: {e}")))?;
let mut writable = Vec::new();
let mut readonly = Vec::new();
for addr in raw.writable {
let pk = PubkeyBase58::try_from(addr.as_str()).map_err(|e| {
ToolError::InvalidInput(format!("invalid writable address {addr}: {e}"))
})?;
writable.push(pk);
}
for addr in raw.readonly {
let pk = PubkeyBase58::try_from(addr.as_str()).map_err(|e| {
ToolError::InvalidInput(format!("invalid readonly address {addr}: {e}"))
})?;
readonly.push(pk);
}
let entry = LookupTableEntry { writable, readonly };
Ok(entry)
}