Skip to main content

reifydb_value/value/row_number/
mod.rs

1// SPDX-License-Identifier: MIT
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 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}