etcd_rs/kv/
range.rs

1use super::{KeyRange, KeyValue};
2use crate::proto::etcdserverpb;
3use crate::ResponseHeader;
4
5#[derive(Debug)]
6pub struct RangeRequest {
7    proto: etcdserverpb::RangeRequest,
8}
9
10impl RangeRequest {
11    /// Creates a new RangeRequest for the specified key range.
12    pub fn new(key_range: KeyRange) -> Self {
13        Self {
14            proto: etcdserverpb::RangeRequest {
15                key: key_range.key,
16                range_end: key_range.range_end,
17                limit: 0,
18                revision: 0,
19                sort_order: 0,
20                sort_target: 0,
21                serializable: false,
22                keys_only: false,
23                count_only: false,
24                min_mod_revision: 0,
25                max_mod_revision: 0,
26                min_create_revision: 0,
27                max_create_revision: 0,
28            },
29        }
30    }
31
32    /// Sets the maximum number of keys returned for the request.
33    /// When limit is set to 0, it is treated as no limit.
34    pub fn limit(mut self, limit: u64) -> Self {
35        self.proto.limit = limit as i64;
36        self
37    }
38
39    pub fn revision(mut self, revision: i64) -> Self {
40        self.proto.revision = revision;
41        self
42    }
43
44    pub fn sort_by_key(mut self, order: SortOrder) -> Self {
45        self.proto.sort_target = etcdserverpb::range_request::SortTarget::Key as i32;
46        self.proto.sort_order = order.into();
47        self
48    }
49
50    pub fn sort_by_version(mut self, order: SortOrder) -> Self {
51        self.proto.sort_target = etcdserverpb::range_request::SortTarget::Version as i32;
52        self.proto.sort_order = order.into();
53        self
54    }
55}
56
57impl<T> From<T> for RangeRequest
58where
59    T: Into<KeyRange>,
60{
61    fn from(key_range: T) -> Self {
62        Self::new(key_range.into())
63    }
64}
65
66impl From<RangeRequest> for etcdserverpb::RangeRequest {
67    fn from(x: RangeRequest) -> Self {
68        x.proto
69    }
70}
71
72#[derive(Debug, Clone)]
73pub enum SortOrder {
74    Ascending,
75    Descending,
76}
77
78impl Into<etcdserverpb::range_request::SortOrder> for SortOrder {
79    fn into(self) -> etcdserverpb::range_request::SortOrder {
80        match self {
81            SortOrder::Ascending => etcdserverpb::range_request::SortOrder::Ascend,
82            SortOrder::Descending => etcdserverpb::range_request::SortOrder::Descend,
83        }
84    }
85}
86
87impl Into<i32> for SortOrder {
88    fn into(self) -> i32 {
89        let order: etcdserverpb::range_request::SortOrder = self.into();
90        order as i32
91    }
92}
93
94#[derive(Debug, Clone)]
95pub struct RangeResponse {
96    pub header: ResponseHeader,
97    pub kvs: Vec<KeyValue>,
98    pub has_more: bool,
99    pub count: u64,
100}
101
102impl From<etcdserverpb::RangeResponse> for RangeResponse {
103    fn from(proto: etcdserverpb::RangeResponse) -> Self {
104        Self {
105            header: From::from(proto.header.expect("must fetch header")),
106            kvs: proto.kvs.into_iter().map(From::from).collect(),
107            has_more: proto.more,
108            count: proto.count as u64,
109        }
110    }
111}