1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
use std::io::Write;

use rmpv::Value;

use crate::{
    codec::{
        consts::{keys, RequestType},
        utils::{write_kv_array, write_kv_u32},
    },
    errors::EncodingError,
};

use super::RequestBody;

#[derive(Clone, Debug)]
pub(crate) struct Delete {
    pub space_id: u32,
    pub index_id: u32,
    pub keys: Vec<Value>,
}

impl Delete {
    pub(crate) fn new(space_id: u32, index_id: u32, keys: Vec<Value>) -> Self {
        Self {
            space_id,
            index_id,
            keys,
        }
    }
}

impl RequestBody for Delete {
    fn request_type() -> RequestType
    where
        Self: Sized,
    {
        RequestType::Replace
    }

    // NOTE: `&mut buf: mut` is required since I don't get why compiler complain
    fn encode(&self, mut buf: &mut dyn Write) -> Result<(), EncodingError> {
        rmp::encode::write_map_len(&mut buf, 3)?;
        write_kv_u32(buf, keys::SPACE_ID, self.space_id)?;
        write_kv_u32(buf, keys::INDEX_ID, self.index_id)?;
        write_kv_array(buf, keys::KEY, &self.keys)?;
        Ok(())
    }
}