risq 0.4.1

Re-implementation of Bisq (https://github.com/bisq-network/bisq) in rust
use super::payload::{network_envelope::Message, *};

#[derive(Hash, Eq, PartialEq, Clone)]
pub enum CorrelationId {
    S(String),
    I(i32),
}

impl From<&Message> for Option<CorrelationId> {
    fn from(msg: &Message) -> Option<CorrelationId> {
        match msg {
            Message::PreliminaryGetDataRequest(request) => Some(CorrelationId::I(request.nonce)),
            Message::GetDataResponse(response) => Some(CorrelationId::I(response.request_nonce)),
            Message::GetUpdatedDataRequest(request) => Some(CorrelationId::I(request.nonce)),
            Message::GetPeersRequest(request) => Some(CorrelationId::I(request.nonce)),
            Message::GetPeersResponse(response) => Some(CorrelationId::I(response.request_nonce)),
            Message::Ping(request) => Some(CorrelationId::I(request.nonce)),
            Message::Pong(response) => Some(CorrelationId::I(response.request_nonce)),
            Message::OfferAvailabilityRequest(request) => {
                Some(CorrelationId::S(request.offer_id.to_owned()))
            }
            Message::OfferAvailabilityResponse(response) => {
                Some(CorrelationId::S(response.offer_id.to_owned()))
            }
            Message::RefreshOfferMessage(_) => None,
            Message::AddDataMessage(_) => None,
            Message::RemoveDataMessage(_) => None,
            Message::RemoveMailboxDataMessage(_) => None,
            Message::CloseConnectionMessage(_) => None,
            Message::PrefixedSealedAndSignedMessage(_) => None,
            Message::InputsForDepositTxRequest(request) => {
                Some(CorrelationId::S(request.uid.to_owned()))
            }
            Message::InputsForDepositTxResponse(response) => {
                Some(CorrelationId::S(response.uid.to_owned()))
            }
            Message::DepositTxMessage(_) => None,
            Message::CounterCurrencyTransferStartedMessage(_) => None,
            Message::PayoutTxPublishedMessage(_) => None,
            Message::OpenNewDisputeMessage(_) => None,
            Message::PeerOpenedDisputeMessage(_) => None,
            Message::ChatMessage(_) => None,
            Message::DisputeResultMessage(_) => None,
            Message::PeerPublishedDisputePayoutTxMessage(_) => None,
            Message::PrivateNotificationMessage(_) => None,
            Message::GetBlocksRequest(request) => Some(CorrelationId::I(request.nonce)),
            Message::GetBlocksResponse(response) => Some(CorrelationId::I(response.request_nonce)),
            Message::NewBlockBroadcastMessage(_) => None,
            Message::AddPersistableNetworkPayloadMessage(_) => None,
            Message::AckMessage(_) => None,
            Message::RepublishGovernanceDataRequest(_) => None,
            Message::NewDaoStateHashMessage(_) => None,
            Message::GetDaoStateHashesRequest(request) => Some(CorrelationId::I(request.nonce)),
            Message::GetDaoStateHashesResponse(response) => {
                Some(CorrelationId::I(response.request_nonce))
            }
            Message::NewProposalStateHashMessage(_) => None,
            Message::GetProposalStateHashesRequest(request) => {
                Some(CorrelationId::I(request.nonce))
            }
            Message::GetProposalStateHashesResponse(response) => {
                Some(CorrelationId::I(response.request_nonce))
            }
            Message::NewBlindVoteStateHashMessage(_) => None,
            Message::GetBlindVoteStateHashesRequest(request) => {
                Some(CorrelationId::I(request.nonce))
            }
            Message::GetBlindVoteStateHashesResponse(response) => {
                Some(CorrelationId::I(response.request_nonce))
            }
            Message::BundleOfEnvelopes(_) => None,
            Message::MediatedPayoutTxSignatureMessage(_) => None,
            Message::MediatedPayoutTxPublishedMessage(_) => None,
            Message::DelayedPayoutTxSignatureRequest(request) => {
                Some(CorrelationId::S(request.uid.to_owned()))
            }
            Message::DelayedPayoutTxSignatureResponse(response) => {
                Some(CorrelationId::S(response.uid.to_owned()))
            }
            Message::DepositTxAndDelayedPayoutTxMessage(_) => None,
            Message::PeerPublishedDelayedPayoutTxMessage(_) => None,
        }
    }
}

pub trait ResponseExtractor {
    type Response: Send;
    fn extract(msg: Message) -> Self::Response;
}
impl ResponseExtractor for PreliminaryGetDataRequest {
    type Response = GetDataResponse;

    fn extract(msg: Message) -> Self::Response {
        match msg {
            Message::GetDataResponse(response) => Some(response),
            _ => None,
        }
        .expect("Msg was not the extpected response type")
    }
}
impl ResponseExtractor for GetUpdatedDataRequest {
    type Response = GetDataResponse;

    fn extract(msg: Message) -> Self::Response {
        match msg {
            Message::GetDataResponse(response) => Some(response),
            _ => None,
        }
        .expect("Msg was not the extpected response type")
    }
}
impl ResponseExtractor for GetPeersRequest {
    type Response = GetPeersResponse;

    fn extract(msg: Message) -> Self::Response {
        match msg {
            Message::GetPeersResponse(response) => Some(response),
            _ => None,
        }
        .expect("Msg was not the extpected response type")
    }
}
impl ResponseExtractor for Ping {
    type Response = Pong;

    fn extract(msg: Message) -> Self::Response {
        match msg {
            Message::Pong(response) => Some(response),
            _ => None,
        }
        .expect("Msg was not the extpected response type")
    }
}