netconf/message/rpc/operation/
discard_changes.rs

1use std::io::Write;
2
3use quick_xml::Writer;
4
5use crate::{
6    capabilities::{Capability, Requirements},
7    message::WriteError,
8    session::Context,
9    Error,
10};
11
12use super::{EmptyReply, Operation, WriteXml};
13
14#[derive(Debug, Clone, Copy)]
15pub struct DiscardChanges {
16    // zero-sized private field to prevent direct construction
17    _inner: (),
18}
19
20impl Operation for DiscardChanges {
21    const NAME: &'static str = "discard-changes";
22    const REQUIRED_CAPABILITIES: Requirements = Requirements::One(Capability::Candidate);
23
24    type Builder<'a> = Builder<'a>;
25    type Reply = EmptyReply;
26}
27
28impl WriteXml for DiscardChanges {
29    fn write_xml<W: Write>(&self, writer: &mut Writer<W>) -> Result<(), WriteError> {
30        _ = writer.create_element("discard-changes").write_empty()?;
31        Ok(())
32    }
33}
34
35#[derive(Debug, Clone)]
36#[must_use]
37pub struct Builder<'a> {
38    _ctx: &'a Context,
39}
40
41impl<'a> super::Builder<'a, DiscardChanges> for Builder<'a> {
42    fn new(ctx: &'a Context) -> Self {
43        Self { _ctx: ctx }
44    }
45
46    fn finish(self) -> Result<DiscardChanges, Error> {
47        Ok(DiscardChanges { _inner: () })
48    }
49}
50
51#[cfg(test)]
52mod tests {
53    use super::*;
54    use crate::message::{
55        rpc::{MessageId, Request},
56        ClientMsg,
57    };
58
59    #[test]
60    fn request_to_xml() {
61        let req = Request {
62            message_id: MessageId(101),
63            operation: DiscardChanges { _inner: () },
64        };
65        let expect = r#"<rpc message-id="101"><discard-changes/></rpc>]]>]]>"#;
66        assert_eq!(req.to_xml().unwrap(), expect);
67    }
68}