Trait MessageWriteExt

Source
pub trait MessageWriteExt: MessageWrite {
    // Provided methods
    fn get_type(&self) -> MessageType { ... }
    fn class(&self) -> MessageClass { ... }
    fn has_class(&self, cls: MessageClass) -> bool { ... }
    fn is_response(&self) -> bool { ... }
    fn method(&self) -> Method { ... }
    fn has_method(&self, method: Method) -> bool { ... }
    fn transaction_id(&self) -> TransactionId { ... }
    fn add_message_integrity(
        &mut self,
        credentials: &MessageIntegrityCredentials,
        algorithm: IntegrityAlgorithm,
    ) -> Result<(), StunWriteError> { ... }
    fn add_fingerprint(&mut self) -> Result<(), StunWriteError> { ... }
    fn add_attribute(
        &mut self,
        attr: &dyn AttributeWrite,
    ) -> Result<(), StunWriteError> { ... }
}
Expand description

Extension trait for MessageWrite providing helper functions.

Provided Methods§

Source

fn get_type(&self) -> MessageType

Retrieve the MessageClass of a Message

§Examples
let message = Message::builder_request(BINDING, MessageWriteVec::new()).finish();
let message = Message::from_bytes(&message).unwrap();
assert_eq!(message.class(), MessageClass::Request);
Source

fn class(&self) -> MessageClass

Retrieve the MessageClass of a Message

§Examples
let message = Message::builder_request(BINDING, MessageWriteVec::new()).finish();
let message = Message::from_bytes(&message).unwrap();
assert_eq!(message.class(), MessageClass::Request);
Source

fn has_class(&self, cls: MessageClass) -> bool

Returns whether the Message is of the specified MessageClass

§Examples
let message = Message::builder_request(BINDING, MessageWriteVec::new()).finish();
let message = Message::from_bytes(&message).unwrap();
assert!(message.has_class(MessageClass::Request));
Source

fn is_response(&self) -> bool

Returns whether the Message is a response

This means that the Message has a class of either success or error

§Examples
let message = Message::builder_request(BINDING, MessageWriteVec::new()).finish();
let message = Message::from_bytes(&message).unwrap();
assert_eq!(message.is_response(), false);

let error = Message::builder_error(&message, MessageWriteVec::new()).finish();
let error = Message::from_bytes(&error).unwrap();
assert_eq!(error.is_response(), true);

let success = Message::builder_success(&message, MessageWriteVec::new()).finish();
let success = Message::from_bytes(&success).unwrap();
assert_eq!(success.is_response(), true);
Source

fn method(&self) -> Method

Retrieves the method of the Message

§Examples
let message = Message::builder_request(BINDING, MessageWriteVec::new()).finish();
let message = Message::from_bytes(&message).unwrap();
assert_eq!(message.method(), BINDING);
Source

fn has_method(&self, method: Method) -> bool

Returns whether the Message is of the specified method

§Examples
let message = Message::builder_request(BINDING, MessageWriteVec::new()).finish();
let message = Message::from_bytes(&message).unwrap();
assert_eq!(message.has_method(BINDING), true);
assert_eq!(message.has_method(Method::new(0)), false);
Source

fn transaction_id(&self) -> TransactionId

Retrieves the 96-bit transaction ID of the Message

§Examples
let mtype = MessageType::from_class_method(MessageClass::Request, BINDING);
let transaction_id = TransactionId::generate();
let message = Message::builder(mtype, transaction_id, MessageWriteVec::new()).finish();
let message = Message::from_bytes(&message).unwrap();
assert_eq!(message.transaction_id(), transaction_id);
Source

fn add_message_integrity( &mut self, credentials: &MessageIntegrityCredentials, algorithm: IntegrityAlgorithm, ) -> Result<(), StunWriteError>

Adds MESSAGE_INTEGRITY attribute to a Message using the provided credentials

§Errors
§Examples
let mut message = Message::builder_request(BINDING, MessageWriteVec::new());
let credentials = ShortTermCredentials::new("pass".to_owned()).into();
assert!(message.add_message_integrity(&credentials, IntegrityAlgorithm::Sha1).is_ok());

// duplicate MessageIntegrity is an error
assert!(matches!(
    message.add_message_integrity(&credentials, IntegrityAlgorithm::Sha1),
    Err(StunWriteError::AttributeExists(MessageIntegrity::TYPE)),
));

// both MessageIntegrity, and MessageIntegritySha256 are allowed, however Sha256 must be
// after Sha1
assert!(message.add_message_integrity(&credentials, IntegrityAlgorithm::Sha256).is_ok());

let data = message.finish();
let message = Message::from_bytes(&data).unwrap();
assert!(message.validate_integrity(&credentials).is_ok());
Source

fn add_fingerprint(&mut self) -> Result<(), StunWriteError>

Adds Fingerprint attribute to a Message

§Errors
§Examples
let mut message = Message::builder_request(BINDING, MessageWriteVec::new());
assert!(message.add_fingerprint().is_ok());

// duplicate FINGERPRINT is an error
assert!(message.add_fingerprint().is_err());
Source

fn add_attribute( &mut self, attr: &dyn AttributeWrite, ) -> Result<(), StunWriteError>

Add a Attribute to this Message. Only one AttributeType can be added for each Attribute. Attempting to add multiple Atributes of the same AttributeType` will fail.

§Errors
§Panics
§Examples

Add an Attribute

let mut message = Message::builder_request(BINDING, MessageWriteVec::new());
let attr = RawAttribute::new(1.into(), &[3]);
assert!(message.add_attribute(&attr).is_ok());
assert!(message.add_attribute(&attr).is_err());

Implementors§