rdb_pagination_core/
order_method.rs

1use std::{fmt::Debug, hash::Hash, num::ParseIntError, str::FromStr};
2
3/// Value for `OrderMethod`. This should be `i8` or `i16`.
4pub trait OrderMethodValue:
5    Debug
6    + Default
7    + Copy
8    + Clone
9    + Eq
10    + PartialEq
11    + Ord
12    + PartialOrd
13    + Hash
14    + FromStr<Err = ParseIntError> {
15    fn zero() -> Self;
16
17    fn one() -> Self;
18
19    fn abs(&self) -> Self;
20}
21
22impl OrderMethodValue for i8 {
23    #[inline]
24    fn zero() -> Self {
25        0
26    }
27
28    #[inline]
29    fn one() -> Self {
30        1
31    }
32
33    #[inline]
34    fn abs(&self) -> Self {
35        i8::abs(*self)
36    }
37}
38
39impl OrderMethodValue for i16 {
40    #[inline]
41    fn zero() -> Self {
42        0
43    }
44
45    #[inline]
46    fn one() -> Self {
47        1
48    }
49
50    #[inline]
51    fn abs(&self) -> Self {
52        i16::abs(*self)
53    }
54}
55
56/// An integer value for ordering.
57///
58/// * **0**: Disabled
59/// * **> 0**: Ascending
60/// * **< 0**: Descending
61/// * Absolute value indicates priority; the smaller the value, the more important it is.
62#[derive(Debug, Default, Copy, Clone, Eq, PartialEq, Ord, PartialOrd, Hash)]
63pub struct OrderMethod<T: OrderMethodValue = i8>(pub T);
64
65impl<T: OrderMethodValue> From<T> for OrderMethod<T> {
66    #[inline]
67    fn from(value: T) -> Self {
68        Self(value)
69    }
70}