Skip to main content

reifydb_value/value/row_number/
mod.rs

1// SPDX-License-Identifier: Apache-2.0
2// Copyright (c) 2026 ReifyDB
3
4use 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}