use super::{GenerationError, MAX_SAFE_INTEGER};
use crate::Limits;
use serde_json::{Value, json};
pub fn method_limits(request: Limits, response: Limits) -> Result<Value, GenerationError> {
let value = json!({
"requestBytes":request.bytes, "requestNodes":request.nodes, "requestDepth":request.depth,
"responseBytes":response.bytes, "responseNodes":response.nodes, "responseDepth":response.depth
});
validate(&value)?;
Ok(value)
}
pub(super) fn validate(method: &Value) -> Result<(), GenerationError> {
for key in [
"requestBytes",
"responseBytes",
"requestNodes",
"responseNodes",
"requestDepth",
"responseDepth",
] {
let n = method[key].as_u64().ok_or(GenerationError::Complexity)?;
if n > MAX_SAFE_INTEGER {
return Err(GenerationError::Complexity);
}
let minimum = if key.ends_with("Bytes") {
crate::contract::HEADER as u64
} else {
1
};
if n < minimum {
return Err(GenerationError::Limits);
}
}
Ok(())
}