rtnetlink/link/vrf.rs
1// SPDX-License-Identifier: MIT
2
3use crate::{
4 packet_route::link::{InfoData, InfoKind, InfoVrf},
5 LinkMessageBuilder,
6};
7
8/// Represent VRF interface.
9/// Example code on creating a VRF interface
10/// ```no_run
11/// use rtnetlink::{new_connection, LinkVrf};
12/// #[tokio::main]
13/// async fn main() -> Result<(), String> {
14/// let (connection, handle, _) = new_connection().unwrap();
15/// tokio::spawn(connection);
16///
17/// handle
18/// .link()
19/// .add(
20/// LinkVrf::new("my-vrf", 100)
21/// .up()
22/// .build()
23/// )
24/// .execute()
25/// .await
26/// .map_err(|e| format!("{e}"))
27/// }
28/// ```
29///
30/// Please check LinkMessageBuilder::<LinkVrf> for more detail.
31#[derive(Debug)]
32pub struct LinkVrf;
33
34impl LinkVrf {
35 /// Wrapper of `LinkMessageBuilder::<LinkVrf>::new().table_id()`
36 pub fn new(name: &str, table_id: u32) -> LinkMessageBuilder<Self> {
37 LinkMessageBuilder::<LinkVrf>::new(name).table_id(table_id)
38 }
39}
40
41impl LinkMessageBuilder<LinkVrf> {
42 /// Create [LinkMessageBuilder] for VRF
43 pub fn new(name: &str) -> Self {
44 LinkMessageBuilder::<LinkVrf>::new_with_info_kind(InfoKind::Vrf)
45 .name(name.to_string())
46 }
47
48 pub fn append_info_data(mut self, info: InfoVrf) -> Self {
49 if let InfoData::Vrf(infos) = self
50 .info_data
51 .get_or_insert_with(|| InfoData::Vrf(Vec::new()))
52 {
53 infos.push(info);
54 }
55 self
56 }
57
58 /// VRF table ID
59 pub fn table_id(self, table_id: u32) -> Self {
60 self.append_info_data(InfoVrf::TableId(table_id))
61 }
62}