1use std::{
2 fmt,
3 iter::Step,
4 ops::{Add, Sub},
5};
6
7use rangemap::StepLite;
8use rusqlite::{ToSql, types::FromSql};
9use serde::{Deserialize, Serialize};
10use speedy::{Context, Readable, Writable};
11
12#[derive(
13 Copy, Clone, Debug, Default, Ord, PartialOrd, Eq, PartialEq, Hash, Serialize, Deserialize,
14)]
15#[serde(transparent)]
16pub struct CrsqlDbVersion(pub u64);
17
18impl Step for CrsqlDbVersion {
19 fn steps_between(start: &Self, end: &Self) -> (usize, Option<usize>) {
20 u64::steps_between(&start.0, &end.0)
21 }
22
23 fn forward_checked(start: Self, count: usize) -> Option<Self> {
24 u64::forward_checked(start.0, count).map(Self)
25 }
26
27 fn backward_checked(start: Self, count: usize) -> Option<Self> {
28 u64::backward_checked(start.0, count).map(Self)
29 }
30}
31
32impl StepLite for CrsqlDbVersion {
33 fn add_one(&self) -> Self {
34 Self(self.0 + 1)
35 }
36
37 fn sub_one(&self) -> Self {
38 Self(self.0 - 1)
39 }
40}
41
42impl From<CrsqlDbVersion> for u64 {
43 fn from(v: CrsqlDbVersion) -> Self {
44 v.0
45 }
46}
47
48impl ToSql for CrsqlDbVersion {
49 fn to_sql(&self) -> rusqlite::Result<rusqlite::types::ToSqlOutput<'_>> {
50 self.0.to_sql()
51 }
52}
53
54impl FromSql for CrsqlDbVersion {
55 fn column_result(value: rusqlite::types::ValueRef<'_>) -> rusqlite::types::FromSqlResult<Self> {
56 u64::column_result(value).map(Self)
57 }
58}
59
60impl Add<u64> for CrsqlDbVersion {
61 type Output = Self;
62
63 fn add(self, rhs: u64) -> Self::Output {
64 Self(self.0.add(rhs))
65 }
66}
67
68impl Sub<u64> for CrsqlDbVersion {
69 type Output = Self;
70
71 fn sub(self, rhs: u64) -> Self::Output {
72 Self(self.0.sub(rhs))
73 }
74}
75
76impl<'a, C> Readable<'a, C> for CrsqlDbVersion
77where
78 C: Context,
79{
80 fn read_from<R: speedy::Reader<'a, C>>(reader: &mut R) -> Result<Self, <C as Context>::Error> {
81 u64::read_from(reader).map(Self)
82 }
83}
84
85impl<C> Writable<C> for CrsqlDbVersion
86where
87 C: Context,
88{
89 fn write_to<T: ?Sized + speedy::Writer<C>>(
90 &self,
91 writer: &mut T,
92 ) -> Result<(), <C as Context>::Error> {
93 self.0.write_to(writer)
94 }
95}
96
97impl fmt::Display for CrsqlDbVersion {
98 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
99 self.0.fmt(f)
100 }
101}
102
103#[derive(
104 Copy, Clone, Debug, Default, Ord, PartialOrd, Eq, PartialEq, Hash, Serialize, Deserialize,
105)]
106#[serde(transparent)]
107pub struct CrsqlSeq(pub u64);
108
109impl Step for CrsqlSeq {
110 fn steps_between(start: &Self, end: &Self) -> (usize, Option<usize>) {
111 u64::steps_between(&start.0, &end.0)
112 }
113
114 fn forward_checked(start: Self, count: usize) -> Option<Self> {
115 u64::forward_checked(start.0, count).map(Self)
116 }
117
118 fn backward_checked(start: Self, count: usize) -> Option<Self> {
119 u64::backward_checked(start.0, count).map(Self)
120 }
121}
122
123impl StepLite for CrsqlSeq {
124 fn add_one(&self) -> Self {
125 Self(self.0 + 1)
126 }
127
128 fn sub_one(&self) -> Self {
129 Self(self.0 - 1)
130 }
131}
132
133impl ToSql for CrsqlSeq {
134 fn to_sql(&self) -> rusqlite::Result<rusqlite::types::ToSqlOutput<'_>> {
135 self.0.to_sql()
136 }
137}
138
139impl FromSql for CrsqlSeq {
140 fn column_result(value: rusqlite::types::ValueRef<'_>) -> rusqlite::types::FromSqlResult<Self> {
141 u64::column_result(value).map(Self)
142 }
143}
144
145impl Add<u64> for CrsqlSeq {
146 type Output = Self;
147
148 fn add(self, rhs: u64) -> Self::Output {
149 Self(self.0.add(rhs))
150 }
151}
152
153impl Sub<u64> for CrsqlSeq {
154 type Output = Self;
155
156 fn sub(self, rhs: u64) -> Self::Output {
157 Self(self.0.sub(rhs))
158 }
159}
160
161impl<'a, C> Readable<'a, C> for CrsqlSeq
162where
163 C: Context,
164{
165 fn read_from<R: speedy::Reader<'a, C>>(reader: &mut R) -> Result<Self, <C as Context>::Error> {
166 u64::read_from(reader).map(Self)
167 }
168}
169
170impl<C> Writable<C> for CrsqlSeq
171where
172 C: Context,
173{
174 fn write_to<T: ?Sized + speedy::Writer<C>>(
175 &self,
176 writer: &mut T,
177 ) -> Result<(), <C as Context>::Error> {
178 self.0.write_to(writer)
179 }
180}
181
182impl fmt::Display for CrsqlSeq {
183 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
184 self.0.fmt(f)
185 }
186}