blob: b638c687a6ea45ab521369ede39abc6e891d9a4c [file] [log] [blame]
// Copyright 2020 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
pub mod client;
use std::fmt::Debug;
use std::time::Duration;
/// A type representing an instant in time.
pub trait Instant: Sized + Ord + Copy + Clone + Debug + Send + Sync + 'static {
// Note that this trait intentionally does not have a `now` method to return
// the current time instant to force the platform to provide the time instant
// when an event is handled.
/// Returns the amount of time elapsed from another instant to this one.
///
/// # Panics
///
/// This function will panic if `earlier` is later than `self`.
fn duration_since(&self, earlier: Self) -> Duration;
/// Returns `Some(t)` where `t` is the time `self + duration` if `t` can be
/// represented as `Instant` (which means it's inside the bounds of the
/// underlying data structure), `None` otherwise.
fn checked_add(&self, duration: Duration) -> Option<Self>;
}
pub(crate) trait InstantExt: Instant {
/// Adds the duration to the instant.
///
/// We can't do a blanket `impl<I: Instant> Add<Duration> for I` because `I`
/// may be foreign type and `Add` is also a foreign type. We use this ext
/// trait to avoid having to do `.checked_add(..).unwrap()` when we want to
/// add an [`Instant`] with a [`Duration`].
///
/// # Panics
///
/// This function may panic if the resulting point in time cannot be represented by the
/// underlying data structure. See [`Instant::checked_add`] for a version without panic.
fn add(self, duration: Duration) -> Self;
}
impl<I: Instant> InstantExt for I {
fn add(self, duration: Duration) -> Self {
self.checked_add(duration).unwrap_or_else(|| {
panic!("overflow when adding duration={:?} to instant={:?}", duration, self,)
})
}
}
impl Instant for std::time::Instant {
fn duration_since(&self, earlier: Self) -> Duration {
std::time::Instant::duration_since(self, earlier)
}
fn checked_add(&self, duration: Duration) -> Option<Self> {
std::time::Instant::checked_add(self, duration)
}
}
// The client currently supports DUID-LL and DUID-LLT with MAC addresses only
// and DUID-UUID, the largest of which is DUID-UUID which takes up 18 bytes.
pub type ClientDuid = arrayvec::ArrayVec<u8, 18>;