ya_etcd_rs/kv/
range.rs

1use super::{KeyRange, KeyValue};
2use crate::ResponseHeader;
3use crate::proto::etcdserverpb;
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 From<SortOrder> for etcdserverpb::range_request::SortOrder {
79    fn from(value: SortOrder) -> Self {
80        match value {
81            SortOrder::Ascending => etcdserverpb::range_request::SortOrder::Ascend,
82            SortOrder::Descending => etcdserverpb::range_request::SortOrder::Descend,
83        }
84    }
85}
86
87impl From<SortOrder> for i32 {
88    fn from(value: SortOrder) -> Self {
89        let order: etcdserverpb::range_request::SortOrder = value.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}