1 use super::candidate_base::*; 2 use super::*; 3 use crate::rand::generate_cand_id; 4 5 use std::sync::atomic::{AtomicU16, AtomicU8}; 6 7 /// The config required to create a new `CandidateHost`. 8 #[derive(Default)] 9 pub struct CandidateHostConfig { 10 pub base_config: CandidateBaseConfig, 11 12 pub tcp_type: TcpType, 13 } 14 15 impl CandidateHostConfig { 16 /// Creates a new host candidate. new_candidate_host(self) -> Result<CandidateBase>17 pub fn new_candidate_host(self) -> Result<CandidateBase> { 18 let mut candidate_id = self.base_config.candidate_id; 19 if candidate_id.is_empty() { 20 candidate_id = generate_cand_id(); 21 } 22 23 let c = CandidateBase { 24 id: candidate_id, 25 address: self.base_config.address.clone(), 26 candidate_type: CandidateType::Host, 27 component: AtomicU16::new(self.base_config.component), 28 port: self.base_config.port, 29 tcp_type: self.tcp_type, 30 foundation_override: self.base_config.foundation, 31 priority_override: self.base_config.priority, 32 network: self.base_config.network, 33 network_type: AtomicU8::new(NetworkType::Udp4 as u8), 34 conn: self.base_config.conn, 35 ..CandidateBase::default() 36 }; 37 38 if !self.base_config.address.ends_with(".local") { 39 let ip = self.base_config.address.parse()?; 40 c.set_ip(&ip)?; 41 }; 42 43 Ok(c) 44 } 45 } 46