use schemars::JsonSchema;
use serde::{Deserialize, Serialize};
use crate::{Addr, IbcAcknowledgement, IbcPacket, Uint64};
#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, Eq, JsonSchema)]
pub struct IbcCallbackRequest {
#[serde(skip_serializing_if = "Option::is_none")]
src_callback: Option<IbcSrcCallback>,
#[serde(skip_serializing_if = "Option::is_none")]
dest_callback: Option<IbcDstCallback>,
}
impl IbcCallbackRequest {
pub fn both(src_callback: IbcSrcCallback, dest_callback: IbcDstCallback) -> Self {
IbcCallbackRequest {
src_callback: Some(src_callback),
dest_callback: Some(dest_callback),
}
}
pub fn source(src_callback: IbcSrcCallback) -> Self {
IbcCallbackRequest {
src_callback: Some(src_callback),
dest_callback: None,
}
}
pub fn destination(dest_callback: IbcDstCallback) -> Self {
IbcCallbackRequest {
src_callback: None,
dest_callback: Some(dest_callback),
}
}
}
#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, Eq, JsonSchema)]
pub struct IbcSrcCallback {
pub address: Addr,
#[serde(skip_serializing_if = "Option::is_none")]
pub gas_limit: Option<Uint64>,
}
#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, Eq, JsonSchema)]
pub struct IbcDstCallback {
pub address: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub gas_limit: Option<Uint64>,
}
#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, Eq, JsonSchema)]
#[serde(rename_all = "snake_case")]
pub enum IbcSourceCallbackMsg {
Acknowledgement(IbcAckCallbackMsg),
Timeout(IbcTimeoutCallbackMsg),
}
#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, Eq, JsonSchema)]
#[non_exhaustive]
pub struct IbcAckCallbackMsg {
pub acknowledgement: IbcAcknowledgement,
pub original_packet: IbcPacket,
pub relayer: Addr,
}
impl IbcAckCallbackMsg {
pub fn new(
acknowledgement: IbcAcknowledgement,
original_packet: IbcPacket,
relayer: Addr,
) -> Self {
Self {
acknowledgement,
original_packet,
relayer,
}
}
}
#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, Eq, JsonSchema)]
#[non_exhaustive]
pub struct IbcTimeoutCallbackMsg {
pub packet: IbcPacket,
pub relayer: Addr,
}
impl IbcTimeoutCallbackMsg {
pub fn new(packet: IbcPacket, relayer: Addr) -> Self {
Self { packet, relayer }
}
}
#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, Eq, JsonSchema)]
pub struct IbcDestinationCallbackMsg {
pub packet: IbcPacket,
pub ack: IbcAcknowledgement,
}
#[cfg(test)]
mod tests {
use crate::to_json_string;
use super::*;
#[test]
fn ibc_callback_data_serialization() {
let mut data = IbcCallbackRequest::both(
IbcSrcCallback {
address: Addr::unchecked("src_address"),
gas_limit: Some(123u64.into()),
},
IbcDstCallback {
address: "dst_address".to_string(),
gas_limit: Some(1234u64.into()),
},
);
let json = to_json_string(&data).unwrap();
assert_eq!(
json,
r#"{"src_callback":{"address":"src_address","gas_limit":"123"},"dest_callback":{"address":"dst_address","gas_limit":"1234"}}"#
);
let mut src = data.src_callback.take().unwrap();
data.dest_callback.as_mut().unwrap().gas_limit = None;
let json = to_json_string(&data).unwrap();
assert_eq!(json, r#"{"dest_callback":{"address":"dst_address"}}"#);
src.gas_limit = None;
data.src_callback = Some(src);
data.dest_callback = None;
let json = to_json_string(&data).unwrap();
assert_eq!(json, r#"{"src_callback":{"address":"src_address"}}"#);
}
}