use serde::Deserialize;
use std::collections::HashMap;
#[derive(Debug, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct StarkStruct {
pub n_bits: u64,
pub n_bits_ext: u64,
}
#[derive(Debug, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct CmPol {
pub stage: u64,
pub stage_pos: u64,
pub dim: u64,
}
#[derive(Debug, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct ValueMapEntry {
#[serde(default)]
pub stage: Option<u64>,
}
#[derive(Debug, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct StarkInfo {
pub opening_points: Vec<i64>,
pub stark_struct: StarkStruct,
pub n_constants: u64,
pub n_stages: u64,
pub map_sections_n: HashMap<String, u64>,
pub cm_pols_map: Vec<CmPol>,
pub air_values_map: Vec<ValueMapEntry>,
#[serde(default)]
pub airgroup_values_map: Vec<ValueMapEntry>,
pub c_exp_id: i64,
pub airgroup_id: i64,
pub air_id: i64,
}
#[derive(Debug, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Src {
#[serde(rename = "type")]
pub op_type: String,
#[serde(default)]
pub id: Option<u64>,
#[serde(default)]
pub value: Option<serde_json::Value>,
#[serde(default)]
pub dim: Option<u64>,
#[serde(default)]
pub prime: Option<i64>,
}
#[derive(Debug, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Dest {
#[serde(rename = "type")]
pub dest_type: String,
#[serde(default)]
pub id: Option<u64>,
pub dim: u64,
}
#[derive(Debug, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Step {
pub op: String,
pub src: Vec<Src>,
pub dest: Dest,
}
#[derive(Debug, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct ExprCode {
pub exp_id: i64,
pub code: Vec<Step>,
}
#[derive(Debug, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct ExpressionsInfo {
pub expressions_code: Vec<ExprCode>,
}
impl StarkInfo {
pub fn blowup(&self) -> i64 {
1i64 << (self.stark_struct.n_bits_ext - self.stark_struct.n_bits)
}
}
impl Src {
pub fn number_value(&self) -> anyhow::Result<u64> {
match &self.value {
Some(serde_json::Value::String(s)) => Ok(s.parse::<u64>()?),
Some(serde_json::Value::Number(n)) => {
n.as_u64().ok_or_else(|| anyhow::anyhow!("number operand value not a u64: {n}"))
}
other => Err(anyhow::anyhow!("number operand missing/invalid value: {other:?}")),
}
}
}