atagen

matrix-rust-sdk

public
Star0
Watch0
ssh://brewery@pls.lobotomise.me:33/atagen/matrix-rust-sdk.git

Blame: bindings/matrix-sdk-ffi/src/utils.rs

7ff8adafe9e4atagen2026-10-22 12:30 UTC1
// Copyright 2023 The Matrix.org Foundation C.I.C.
7ff8adafe9e4atagen2026-10-22 12:30 UTC2
//
7ff8adafe9e4atagen2026-10-22 12:30 UTC3
// Licensed under the Apache License, Version 2.0 (the "License");
7ff8adafe9e4atagen2026-10-22 12:30 UTC4
// you may not use this file except in compliance with the License.
7ff8adafe9e4atagen2026-10-22 12:30 UTC5
// You may obtain a copy of the License at
7ff8adafe9e4atagen2026-10-22 12:30 UTC6
//
7ff8adafe9e4atagen2026-10-22 12:30 UTC7
//     http://www.apache.org/licenses/LICENSE-2.0
7ff8adafe9e4atagen2026-10-22 12:30 UTC8
//
7ff8adafe9e4atagen2026-10-22 12:30 UTC9
// Unless required by applicable law or agreed to in writing, software
7ff8adafe9e4atagen2026-10-22 12:30 UTC10
// distributed under the License is distributed on an "AS IS" BASIS,
7ff8adafe9e4atagen2026-10-22 12:30 UTC11
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
7ff8adafe9e4atagen2026-10-22 12:30 UTC12
// See the License for the specific language governing permissions and
7ff8adafe9e4atagen2026-10-22 12:30 UTC13
// limitations under the License.
7ff8adafe9e4atagen2026-10-22 12:30 UTC14
7ff8adafe9e4atagen2026-10-22 12:30 UTC15
use std::{mem::ManuallyDrop, ops::Deref};
7ff8adafe9e4atagen2026-10-22 12:30 UTC16
7ff8adafe9e4atagen2026-10-22 12:30 UTC17
use ruma::{MilliSecondsSinceUnixEpoch, UInt};
7ff8adafe9e4atagen2026-10-22 12:30 UTC18
use tracing::warn;
7ff8adafe9e4atagen2026-10-22 12:30 UTC19
7ff8adafe9e4atagen2026-10-22 12:30 UTC20
use crate::runtime::get_runtime_handle;
7ff8adafe9e4atagen2026-10-22 12:30 UTC21
7ff8adafe9e4atagen2026-10-22 12:30 UTC22
#[derive(Debug, Clone)]
7ff8adafe9e4atagen2026-10-22 12:30 UTC23
pub struct Timestamp(u64);
7ff8adafe9e4atagen2026-10-22 12:30 UTC24
7ff8adafe9e4atagen2026-10-22 12:30 UTC25
impl From<MilliSecondsSinceUnixEpoch> for Timestamp {
7ff8adafe9e4atagen2026-10-22 12:30 UTC26
    fn from(date: MilliSecondsSinceUnixEpoch) -> Self {
7ff8adafe9e4atagen2026-10-22 12:30 UTC27
        Self(date.0.into())
7ff8adafe9e4atagen2026-10-22 12:30 UTC28
    }
7ff8adafe9e4atagen2026-10-22 12:30 UTC29
}
7ff8adafe9e4atagen2026-10-22 12:30 UTC30
7ff8adafe9e4atagen2026-10-22 12:30 UTC31
uniffi::custom_newtype!(Timestamp, u64);
7ff8adafe9e4atagen2026-10-22 12:30 UTC32
7ff8adafe9e4atagen2026-10-22 12:30 UTC33
pub(crate) fn u64_to_uint(u: u64) -> UInt {
7ff8adafe9e4atagen2026-10-22 12:30 UTC34
    UInt::new(u).unwrap_or_else(|| {
7ff8adafe9e4atagen2026-10-22 12:30 UTC35
        warn!("u64 -> UInt conversion overflowed, falling back to UInt::MAX");
7ff8adafe9e4atagen2026-10-22 12:30 UTC36
        UInt::MAX
7ff8adafe9e4atagen2026-10-22 12:30 UTC37
    })
7ff8adafe9e4atagen2026-10-22 12:30 UTC38
}
7ff8adafe9e4atagen2026-10-22 12:30 UTC39
7ff8adafe9e4atagen2026-10-22 12:30 UTC40
/// Tiny wrappers for data types that must be dropped in the context of an async
7ff8adafe9e4atagen2026-10-22 12:30 UTC41
/// runtime.
7ff8adafe9e4atagen2026-10-22 12:30 UTC42
///
7ff8adafe9e4atagen2026-10-22 12:30 UTC43
/// This is useful whenever such a data type may transitively call some
7ff8adafe9e4atagen2026-10-22 12:30 UTC44
/// runtime's `block_on` function in their `Drop` impl (since we lack async drop
7ff8adafe9e4atagen2026-10-22 12:30 UTC45
/// at the moment), like done in some `deadpool` drop impls.
7ff8adafe9e4atagen2026-10-22 12:30 UTC46
pub(crate) struct AsyncRuntimeDropped<T>(ManuallyDrop<T>);
7ff8adafe9e4atagen2026-10-22 12:30 UTC47
7ff8adafe9e4atagen2026-10-22 12:30 UTC48
impl<T> AsyncRuntimeDropped<T> {
7ff8adafe9e4atagen2026-10-22 12:30 UTC49
    /// Create a new wrapper for this type that will be dropped under an async
7ff8adafe9e4atagen2026-10-22 12:30 UTC50
    /// runtime.
7ff8adafe9e4atagen2026-10-22 12:30 UTC51
    pub fn new(val: T) -> Self {
7ff8adafe9e4atagen2026-10-22 12:30 UTC52
        Self(ManuallyDrop::new(val))
7ff8adafe9e4atagen2026-10-22 12:30 UTC53
    }
7ff8adafe9e4atagen2026-10-22 12:30 UTC54
}
7ff8adafe9e4atagen2026-10-22 12:30 UTC55
7ff8adafe9e4atagen2026-10-22 12:30 UTC56
impl<T> Drop for AsyncRuntimeDropped<T> {
7ff8adafe9e4atagen2026-10-22 12:30 UTC57
    fn drop(&mut self) {
7ff8adafe9e4atagen2026-10-22 12:30 UTC58
        let _guard = get_runtime_handle().enter();
7ff8adafe9e4atagen2026-10-22 12:30 UTC59
        // SAFETY: self.inner is never used again, which is the only requirement
7ff8adafe9e4atagen2026-10-22 12:30 UTC60
        //         for ManuallyDrop::drop to be used safely.
7ff8adafe9e4atagen2026-10-22 12:30 UTC61
        unsafe {
7ff8adafe9e4atagen2026-10-22 12:30 UTC62
            ManuallyDrop::drop(&mut self.0);
7ff8adafe9e4atagen2026-10-22 12:30 UTC63
        }
7ff8adafe9e4atagen2026-10-22 12:30 UTC64
    }
7ff8adafe9e4atagen2026-10-22 12:30 UTC65
}
7ff8adafe9e4atagen2026-10-22 12:30 UTC66
7ff8adafe9e4atagen2026-10-22 12:30 UTC67
// What is an `AsyncRuntimeDropped<T>`, if not a `T` in disguise?
7ff8adafe9e4atagen2026-10-22 12:30 UTC68
impl<T> Deref for AsyncRuntimeDropped<T> {
7ff8adafe9e4atagen2026-10-22 12:30 UTC69
    type Target = T;
7ff8adafe9e4atagen2026-10-22 12:30 UTC70
7ff8adafe9e4atagen2026-10-22 12:30 UTC71
    fn deref(&self) -> &Self::Target {
7ff8adafe9e4atagen2026-10-22 12:30 UTC72
        &self.0
7ff8adafe9e4atagen2026-10-22 12:30 UTC73
    }
7ff8adafe9e4atagen2026-10-22 12:30 UTC74
}
7ff8adafe9e4atagen2026-10-22 12:30 UTC75
7ff8adafe9e4atagen2026-10-22 12:30 UTC76
impl<T: Clone> Clone for AsyncRuntimeDropped<T> {
7ff8adafe9e4atagen2026-10-22 12:30 UTC77
    fn clone(&self) -> Self {
7ff8adafe9e4atagen2026-10-22 12:30 UTC78
        Self(self.0.clone())
7ff8adafe9e4atagen2026-10-22 12:30 UTC79
    }
7ff8adafe9e4atagen2026-10-22 12:30 UTC80
}