reifydb_value/value/row_number/
mod.rs1use std::{fmt, ops::Deref};
5
6use serde::{Deserialize, Deserializer, Serialize, Serializer, de, de::Visitor};
7
8pub static ROW_NUMBER_COLUMN_NAME: &str = "rownum";
9
10#[repr(transparent)]
11#[derive(Debug, Copy, Clone, PartialOrd, PartialEq, Ord, Eq, Hash)]
12pub struct RowNumber(pub u64);
13
14impl RowNumber {
15 pub const MAX: Self = Self(u64::MAX);
16
17 pub fn new(id: u64) -> Self {
18 assert!(id > 0, "Row numbers must be greater than 0, got {}", id);
19 RowNumber(id)
20 }
21
22 pub fn value(&self) -> u64 {
23 self.0
24 }
25}
26
27impl Default for RowNumber {
28 fn default() -> Self {
29 RowNumber(1)
30 }
31}
32
33impl Deref for RowNumber {
34 type Target = u64;
35
36 fn deref(&self) -> &Self::Target {
37 &self.0
38 }
39}
40
41impl PartialEq<u64> for RowNumber {
42 fn eq(&self, other: &u64) -> bool {
43 self.0.eq(other)
44 }
45}
46
47impl From<u64> for RowNumber {
48 fn from(id: u64) -> Self {
49 assert!(id > 0, "Row numbers must be greater than 0, got {}", id);
50 RowNumber(id)
51 }
52}
53
54impl From<RowNumber> for u64 {
55 fn from(row_number: RowNumber) -> Self {
56 row_number.0
57 }
58}
59
60impl fmt::Display for RowNumber {
61 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
62 write!(f, "{}", self.0)
63 }
64}
65
66impl Serialize for RowNumber {
67 fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
68 where
69 S: Serializer,
70 {
71 serializer.serialize_u64(self.0)
72 }
73}
74
75impl<'de> Deserialize<'de> for RowNumber {
76 fn deserialize<D>(deserializer: D) -> Result<RowNumber, D::Error>
77 where
78 D: Deserializer<'de>,
79 {
80 struct U64Visitor;
81
82 impl Visitor<'_> for U64Visitor {
83 type Value = RowNumber;
84
85 fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
86 formatter.write_str("an unsigned 64-bit number")
87 }
88
89 fn visit_u64<E>(self, value: u64) -> Result<Self::Value, E>
90 where
91 E: de::Error,
92 {
93 if value == 0 {
94 Err(E::custom("Row numbers must be greater than 0"))
95 } else {
96 Ok(RowNumber(value))
97 }
98 }
99 }
100 deserializer.deserialize_u64(U64Visitor)
101 }
102}