netconf/message/rpc/operation/
get.rs

1use std::io::Write;
2
3use quick_xml::Writer;
4
5use crate::{capabilities::Requirements, message::WriteError, session::Context, Error};
6
7use super::{DataReply, Filter, Opaque, Operation, WriteXml};
8
9#[derive(Debug, Default, Clone)]
10pub struct Get {
11    filter: Option<Filter>,
12}
13
14impl Operation for Get {
15    const NAME: &'static str = "get";
16    const REQUIRED_CAPABILITIES: Requirements = Requirements::None;
17
18    type Builder<'a> = Builder;
19    type Reply = DataReply<Opaque>;
20}
21
22impl WriteXml for Get {
23    fn write_xml<W: Write>(&self, writer: &mut Writer<W>) -> Result<(), WriteError> {
24        writer
25            .create_element(Self::NAME)
26            .write_inner_content(|writer| {
27                if let Some(ref filter) = self.filter {
28                    filter.write_xml(writer)?;
29                };
30                Ok(())
31            })
32            .map(|_| ())
33    }
34}
35
36#[derive(Debug, Clone)]
37#[must_use]
38pub struct Builder {
39    filter: Option<Filter>,
40}
41
42impl Builder {
43    pub fn filter(mut self, filter: Option<Filter>) -> Self {
44        self.filter = filter;
45        self
46    }
47}
48
49impl super::Builder<'_, Get> for Builder {
50    fn new(_: &Context) -> Self {
51        Self { filter: None }
52    }
53
54    fn finish(self) -> Result<Get, Error> {
55        Ok(Get {
56            filter: self.filter,
57        })
58    }
59}
60
61#[cfg(test)]
62mod tests {
63    use super::*;
64    use crate::message::{
65        rpc::{MessageId, Request},
66        ClientMsg,
67    };
68
69    #[test]
70    fn default_request_to_xml() {
71        let req = Request {
72            message_id: MessageId(101),
73            operation: Get::default(),
74        };
75        let expect = r#"<rpc message-id="101"><get></get></rpc>]]>]]>"#;
76        assert_eq!(req.to_xml().unwrap(), expect);
77    }
78}