stun_rs/attributes/ice/
use_candidate.rs

1const USE_CANDIDATE: u16 = 0x0025;
2
3crate::common::empty_attribute!(
4    /// The controlling agent MUST include the [`UseCandidate`] attribute in
5    /// order to nominate a candidate pair
6    /// [Section 8.1.1](https://datatracker.ietf.org/doc/html/rfc8445#section-8.1.1).
7    /// The controlled agent MUST NOT include the [`UseCandidate`] attribute in a Binding request.
8    ///
9    /// # Examples
10    ///```rust
11    /// # use stun_rs::attributes::{AttributeType, StunAttributeType};
12    /// # use stun_rs::attributes::ice::UseCandidate;
13    /// let attr = UseCandidate::default();
14    /// assert_eq!(attr.attribute_type(), AttributeType::from(0x0025));
15    ///```
16    UseCandidate,
17    USE_CANDIDATE,
18);
19
20#[cfg(test)]
21mod tests {
22    use super::*;
23    use crate::StunAttribute;
24
25    #[test]
26    fn use_candidate_stunt_attribute() {
27        let attr = StunAttribute::UseCandidate(UseCandidate::default());
28        assert!(attr.is_use_candidate());
29        assert!(attr.as_use_candidate().is_ok());
30        assert!(attr.as_error_code().is_err());
31
32        assert!(attr.attribute_type().is_comprehension_required());
33        assert!(!attr.attribute_type().is_comprehension_optional());
34
35        let dbg_fmt = format!("{:?}", attr);
36        assert_eq!("UseCandidate(UseCandidate)", dbg_fmt);
37    }
38}