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