1#![forbid(unsafe_code)]
2#![doc = include_str!("../README.md")]
3
4use core::fmt;
5
6#[derive(Clone, Copy, Debug, Default, Eq, Hash, Ord, PartialEq, PartialOrd)]
8pub enum ConsistencyLevel {
9 One,
10 Two,
11 Three,
12 Quorum,
13 All,
14 LocalQuorum,
15 EventuallyConsistent,
16 StronglyConsistent,
17 #[default]
18 Unknown,
19}
20
21impl ConsistencyLevel {
22 pub const fn as_str(self) -> &'static str {
24 match self {
25 Self::One => "one",
26 Self::Two => "two",
27 Self::Three => "three",
28 Self::Quorum => "quorum",
29 Self::All => "all",
30 Self::LocalQuorum => "local-quorum",
31 Self::EventuallyConsistent => "eventually-consistent",
32 Self::StronglyConsistent => "strongly-consistent",
33 Self::Unknown => "unknown",
34 }
35 }
36}
37
38impl fmt::Display for ConsistencyLevel {
39 fn fmt(&self, formatter: &mut fmt::Formatter<'_>) -> fmt::Result {
40 formatter.write_str(self.as_str())
41 }
42}
43
44#[derive(Clone, Copy, Debug, Default, Eq, Hash, Ord, PartialEq, PartialOrd)]
46pub struct ReadConcern(ConsistencyLevel);
47
48impl ReadConcern {
49 pub const fn new(level: ConsistencyLevel) -> Self {
51 Self(level)
52 }
53
54 pub const fn level(self) -> ConsistencyLevel {
56 self.0
57 }
58}
59
60impl fmt::Display for ReadConcern {
61 fn fmt(&self, formatter: &mut fmt::Formatter<'_>) -> fmt::Result {
62 self.0.fmt(formatter)
63 }
64}
65
66#[derive(Clone, Copy, Debug, Default, Eq, Hash, Ord, PartialEq, PartialOrd)]
68pub struct WriteConcern(ConsistencyLevel);
69
70impl WriteConcern {
71 pub const fn new(level: ConsistencyLevel) -> Self {
73 Self(level)
74 }
75
76 pub const fn level(self) -> ConsistencyLevel {
78 self.0
79 }
80}
81
82impl fmt::Display for WriteConcern {
83 fn fmt(&self, formatter: &mut fmt::Formatter<'_>) -> fmt::Result {
84 self.0.fmt(formatter)
85 }
86}
87
88#[derive(Clone, Copy, Debug, Default, Eq, Hash, Ord, PartialEq, PartialOrd)]
90pub enum DurabilityLevel {
91 Memory,
92 Disk,
93 Replicated,
94 Majority,
95 #[default]
96 Unknown,
97}
98
99impl DurabilityLevel {
100 pub const fn as_str(self) -> &'static str {
102 match self {
103 Self::Memory => "memory",
104 Self::Disk => "disk",
105 Self::Replicated => "replicated",
106 Self::Majority => "majority",
107 Self::Unknown => "unknown",
108 }
109 }
110}
111
112impl fmt::Display for DurabilityLevel {
113 fn fmt(&self, formatter: &mut fmt::Formatter<'_>) -> fmt::Result {
114 formatter.write_str(self.as_str())
115 }
116}
117
118#[derive(Clone, Copy, Debug, Default, Eq, Hash, Ord, PartialEq, PartialOrd)]
120pub struct ReplicationFactor(u16);
121
122impl ReplicationFactor {
123 pub const fn new(value: u16) -> Self {
125 Self(value)
126 }
127
128 pub const fn value(self) -> u16 {
130 self.0
131 }
132}
133
134impl fmt::Display for ReplicationFactor {
135 fn fmt(&self, formatter: &mut fmt::Formatter<'_>) -> fmt::Result {
136 write!(formatter, "{}", self.0)
137 }
138}
139
140#[derive(Clone, Copy, Debug, Default, Eq, Hash, Ord, PartialEq, PartialOrd)]
142pub struct Quorum(u16);
143
144impl Quorum {
145 pub const fn new(value: u16) -> Self {
147 Self(value)
148 }
149
150 pub const fn value(self) -> u16 {
152 self.0
153 }
154}
155
156impl fmt::Display for Quorum {
157 fn fmt(&self, formatter: &mut fmt::Formatter<'_>) -> fmt::Result {
158 write!(formatter, "{}", self.0)
159 }
160}
161
162#[cfg(test)]
163mod tests {
164 use super::{
165 ConsistencyLevel, DurabilityLevel, Quorum, ReadConcern, ReplicationFactor, WriteConcern,
166 };
167
168 #[test]
169 fn formats_consistency_levels() {
170 assert_eq!(ConsistencyLevel::One.to_string(), "one");
171 assert_eq!(ConsistencyLevel::Quorum.to_string(), "quorum");
172 assert_eq!(ConsistencyLevel::LocalQuorum.to_string(), "local-quorum");
173 assert_eq!(
174 ConsistencyLevel::EventuallyConsistent.to_string(),
175 "eventually-consistent"
176 );
177 assert_eq!(
178 ConsistencyLevel::StronglyConsistent.to_string(),
179 "strongly-consistent"
180 );
181 assert_eq!(ConsistencyLevel::Unknown.to_string(), "unknown");
182 }
183
184 #[test]
185 fn builds_concern_and_replication_labels() {
186 let read = ReadConcern::new(ConsistencyLevel::Quorum);
187 let write = WriteConcern::new(ConsistencyLevel::All);
188 let replication = ReplicationFactor::new(3);
189 let quorum = Quorum::new(2);
190
191 assert_eq!(read.to_string(), "quorum");
192 assert_eq!(write.level(), ConsistencyLevel::All);
193 assert_eq!(replication.value(), 3);
194 assert_eq!(quorum.to_string(), "2");
195 assert_eq!(DurabilityLevel::Replicated.to_string(), "replicated");
196 }
197}