klukai_types/
base.rs

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}