use headers::{Error as HeaderError, Header, HeaderName, HeaderValue};
use thegraph_core::alloy::primitives::{BlockHash, BlockNumber};
pub const HEADER_NAME: &str = "graph-indexed";
pub struct GraphIndexed(pub BlockInfo);
impl Header for GraphIndexed {
fn name() -> &'static HeaderName {
static HTTP_HEADER_NAME: HeaderName = HeaderName::from_static(HEADER_NAME);
&HTTP_HEADER_NAME
}
fn decode<'i, I>(values: &mut I) -> Result<Self, HeaderError>
where
Self: Sized,
I: Iterator<Item = &'i HeaderValue>,
{
let value = values.next().ok_or_else(HeaderError::invalid)?;
let info = serde_json::from_slice::<'_, BlockInfo>(value.as_bytes())
.map_err(|_| HeaderError::invalid())?;
Ok(Self(info))
}
fn encode<E: Extend<HeaderValue>>(&self, values: &mut E) {
let bytes = serde_json::to_vec(&self.0).expect("header to be valid json");
let value = HeaderValue::from_bytes(&bytes).expect("header to be valid utf-8");
values.extend(std::iter::once(value));
}
}
#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)]
pub struct BlockInfo {
pub hash: BlockHash,
pub number: BlockNumber,
#[serde(skip_serializing_if = "Option::is_none")]
pub timestamp: Option<u64>,
}