prns-core 0.3.4

Pure Reticulum engine and wire contract for Personal Reticulum
use super::{accepted_reply, private, unexpected, SamExchange};
use crate::interfaces::i2p::sam::{
    I2pPrivateDestination, I2pPublicDestination, SamCommand, SamProtocolError, SamReply,
    SamReplyKind,
};

#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub struct GenerateDestination;

#[derive(Debug, Clone, PartialEq, Eq)]
pub struct I2pGeneratedDestination {
    pub public: Option<I2pPublicDestination>,
    pub private: I2pPrivateDestination,
}

impl private::Sealed for GenerateDestination {}

impl SamExchange for GenerateDestination {
    type Output = I2pGeneratedDestination;

    fn command(&self) -> SamCommand {
        SamCommand::DestinationGenerate
    }

    fn conclude(self, reply: SamReply) -> Result<Self::Output, SamProtocolError> {
        match accepted_reply(SamReplyKind::Destination, reply)? {
            SamReply::DestinationGenerated { public, private } => {
                Ok(I2pGeneratedDestination { public, private })
            }
            reply => Err(unexpected(SamReplyKind::Destination, reply)),
        }
    }
}