Moved shared data types to 'types' subcrate

This commit is contained in:
mdecimus
2025-09-22 10:01:31 +02:00
parent b49202a2b3
commit 71cc30c7be
325 changed files with 4132 additions and 3540 deletions

View File

@@ -4,6 +4,12 @@
* SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-SEL
*/
use crate::config::Config;
use mail_auth::{MX, ResolverCache, Txt};
use quick_cache::{
Equivalent, Weighter,
sync::{DefaultLifecycle, PlaceholderGuard},
};
use std::{
borrow::Borrow,
hash::Hash,
@@ -12,14 +18,6 @@ use std::{
time::{Duration, Instant},
};
use mail_auth::{MX, ResolverCache, Txt};
use quick_cache::{
Equivalent, Weighter,
sync::{DefaultLifecycle, PlaceholderGuard},
};
use crate::config::Config;
pub struct Cache<K: Eq + Hash + CacheItemWeight, V: Clone + CacheItemWeight>(
quick_cache::sync::Cache<K, V, CacheItemWeighter>,
);

View File

@@ -92,7 +92,7 @@ impl Base32Writer {
}
pub fn finalize(mut self) -> String {
if self.pos % 5 != 0 {
if !self.pos.is_multiple_of(5) {
self.push_byte(0, true);
}

View File

@@ -4,8 +4,6 @@
* SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-SEL
*/
use std::{fmt::Display, sync::Arc};
pub mod bimap;
pub mod cache;
pub mod codec;
@@ -26,85 +24,11 @@ use rustls::{
client::danger::{HandshakeSignatureValid, ServerCertVerified, ServerCertVerifier},
};
use rustls_pki_types::TrustAnchor;
use std::sync::Arc;
pub use downcast_rs;
pub use erased_serde;
pub const BLOB_HASH_LEN: usize = 32;
#[derive(
rkyv::Archive,
rkyv::Deserialize,
rkyv::Serialize,
Clone,
Debug,
Default,
PartialEq,
Eq,
Hash,
serde::Serialize,
serde::Deserialize,
)]
#[rkyv(derive(Debug))]
#[repr(transparent)]
pub struct BlobHash(pub [u8; BLOB_HASH_LEN]);
impl BlobHash {
pub fn new_max() -> Self {
BlobHash([u8::MAX; BLOB_HASH_LEN])
}
pub fn generate(value: impl AsRef<[u8]>) -> Self {
BlobHash(blake3::hash(value.as_ref()).into())
}
pub fn try_from_hash_slice(value: &[u8]) -> Result<BlobHash, std::array::TryFromSliceError> {
value.try_into().map(BlobHash)
}
pub fn as_slice(&self) -> &[u8] {
self.0.as_ref()
}
pub fn to_hex(&self) -> String {
let mut hex = String::with_capacity(BLOB_HASH_LEN * 2);
for byte in self.0.iter() {
hex.push_str(&format!("{:02x}", byte));
}
hex
}
}
impl From<&ArchivedBlobHash> for BlobHash {
fn from(value: &ArchivedBlobHash) -> Self {
BlobHash(value.0)
}
}
impl AsRef<BlobHash> for BlobHash {
fn as_ref(&self) -> &BlobHash {
self
}
}
impl From<BlobHash> for Vec<u8> {
fn from(value: BlobHash) -> Self {
value.0.to_vec()
}
}
impl AsRef<[u8]> for BlobHash {
fn as_ref(&self) -> &[u8] {
self.0.as_ref()
}
}
impl AsMut<[u8]> for BlobHash {
fn as_mut(&mut self) -> &mut [u8] {
self.0.as_mut()
}
}
pub trait HttpLimitResponse: Sync + Send {
fn bytes_with_limit(
self,
@@ -136,79 +60,6 @@ impl HttpLimitResponse for Response {
}
}
#[derive(Clone, Debug, Default, PartialEq, Eq, Hash, PartialOrd, Ord)]
#[repr(transparent)]
pub struct Semver(u64);
impl Semver {
pub fn current() -> Self {
env!("CARGO_PKG_VERSION").try_into().unwrap()
}
pub fn new(major: u16, minor: u16, patch: u16) -> Self {
let mut version: u64 = 0;
version |= (major as u64) << 32;
version |= (minor as u64) << 16;
version |= patch as u64;
Semver(version)
}
pub fn unpack(&self) -> (u16, u16, u16) {
let version = self.0;
let major = ((version >> 32) & 0xFFFF) as u16;
let minor = ((version >> 16) & 0xFFFF) as u16;
let patch = (version & 0xFFFF) as u16;
(major, minor, patch)
}
pub fn major(&self) -> u16 {
(self.0 >> 32) as u16
}
pub fn minor(&self) -> u16 {
(self.0 >> 16) as u16
}
pub fn patch(&self) -> u16 {
self.0 as u16
}
pub fn is_valid(&self) -> bool {
self.0 > 0
}
}
impl AsRef<u64> for Semver {
fn as_ref(&self) -> &u64 {
&self.0
}
}
impl From<u64> for Semver {
fn from(value: u64) -> Self {
Semver(value)
}
}
impl TryFrom<&str> for Semver {
type Error = ();
fn try_from(value: &str) -> Result<Self, Self::Error> {
let mut parts = value.splitn(3, '.');
let major = parts.next().ok_or(())?.parse().map_err(|_| ())?;
let minor = parts.next().ok_or(())?.parse().map_err(|_| ())?;
let patch = parts.next().ok_or(())?.parse().map_err(|_| ())?;
Ok(Semver::new(major, minor, patch))
}
}
impl Display for Semver {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
let (major, minor, patch) = self.unpack();
write!(f, "{major}.{minor}.{patch}")
}
}
pub trait UnwrapFailure<T> {
fn failed(self, action: &str) -> T;
}

View File

@@ -260,29 +260,3 @@ impl<T: BitmapItem> Default for Bitmap<T> {
}
}
}
#[repr(transparent)]
#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)]
pub struct ShortId(pub u8);
impl BitmapItem for ShortId {
fn max() -> u64 {
u8::MAX as u64
}
fn is_valid(&self) -> bool {
true
}
}
impl From<u64> for ShortId {
fn from(value: u64) -> Self {
ShortId(value as u8)
}
}
impl From<ShortId> for u64 {
fn from(value: ShortId) -> Self {
value.0 as u64
}
}

View File

@@ -4,10 +4,9 @@
* SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-SEL
*/
use std::{borrow::Borrow, cmp::Ordering, fmt, hash::Hash};
use rkyv::Archive;
use serde::{Deserialize, Serialize, de::DeserializeOwned, ser::SerializeMap};
use std::{borrow::Borrow, cmp::Ordering, fmt, hash::Hash};
// A map implemented using vectors
// used for small datasets of less than 20 items