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}