use crate::cores::endpoint::Endpoint;
use derive_builder::Builder;
use ethers_core::types::Address;
use http::Method;
use serde::{Deserialize, Serialize};
#[derive(Default, Debug, Builder, Clone, Serialize, Deserialize)]
#[builder(default, setter(into), build_fn(validate = "Self::validate"))]
pub struct UpdateWebhookAddresses {
#[builder(setter)]
webhook_id: String,
addresses_to_add: Vec<Address>,
addresses_to_remove: Vec<Address>,
}
impl UpdateWebhookAddresses {
pub fn builder() -> UpdateWebhookAddressesBuilder {
UpdateWebhookAddressesBuilder::default()
}
}
impl UpdateWebhookAddressesBuilder {
fn validate(&self) -> Result<(), String> {
match (&self.addresses_to_add, &self.addresses_to_remove) {
(Some(adds), Some(removes)) if !adds.is_empty() || !removes.is_empty() => Ok(()),
(Some(adds), _) if !adds.is_empty() => Ok(()),
(_, Some(removes)) if !removes.is_empty() => Ok(()),
_ => Err("you must provide at least one address".to_string()),
}
}
}
impl Endpoint for UpdateWebhookAddresses {
fn method(&self) -> http::Method {
Method::PATCH
}
fn endpoint(&self) -> std::borrow::Cow<'static, str> {
"api/update-webhook-addresses".into()
}
fn body(&self) -> anyhow::Result<Option<(&'static str, Vec<u8>)>> {
let body = serde_json::to_vec(self)?;
Ok(Some(("application/json", body)))
}
}