mod def;
mod server;
mod class;
mod dev;
mod attr;
mod command;
mod admin;
mod signal;
#[cfg(feature = "cli")]
mod cli;
pub use def::{ClassDef, CommandDef, AttrDef};
pub use server::{Server, ServerBuilder, ServerHandle};
pub use class::{AnyClass, Class};
pub use dev::{AnyDev, Dev};
pub use command::Command;
pub use attr::Attr;
#[cfg(feature = "cli")]
pub use cli::ServerArgs;
use std::marker::PhantomData;
use std::fmt::{self, Debug};
use std::ops::Deref;
use std::sync::{Arc, Weak};
use crate::dev::DevState;
pub trait Model: Send + Sync + 'static {}
impl<T: Send + Sync + 'static> Model for T {}
const STATE_NAME: &str = "State";
const STATUS_NAME: &str = "Status";
const INIT_NAME: &str = "Init";
const RESERVED_ATTRS: &[&str] = &[STATE_NAME, STATUS_NAME];
const RESERVED_COMMANDS: &[&str] = &[STATE_NAME, STATUS_NAME, INIT_NAME];
const MISSING_STATUS: &str = "The device is not initialized";
const DEFAULT_STATUS: &str = "Device is on";
const DEFAULT_STATE: DevState = DevState::On;
fn reserved_name<'r>(name: &str, reserved: &'r [&'r str]) -> Option<&'r str> {
reserved.iter().copied().find(|other| name.eq_ignore_ascii_case(other))
}
pub struct Ref<'a, T: ?Sized> {
inner: Arc<T>,
_borrow: PhantomData<&'a T>,
}
impl<T: ?Sized> Ref<'_, T> {
#[inline]
pub(super) fn new(inner: Arc<T>) -> Self {
Self { inner, _borrow: PhantomData }
}
#[inline]
pub fn downgrade(this: &Self) -> WeakRef<T> {
WeakRef { inner: Arc::downgrade(&this.inner) }
}
}
impl<T: ?Sized> Deref for Ref<'_, T> {
type Target = T;
#[inline]
fn deref(&self) -> &T {
&self.inner
}
}
impl<T: ?Sized + Debug> Debug for Ref<'_, T> {
#[inline]
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
Debug::fmt(&*self.inner, f)
}
}
pub struct WeakRef<T: ?Sized> {
inner: Weak<T>,
}
impl<T: ?Sized> WeakRef<T> {
#[inline]
pub fn upgrade(&self) -> Option<Ref<'_, T>> {
self.inner.upgrade().map(Ref::new)
}
}
impl<T: ?Sized> Clone for WeakRef<T> {
#[inline]
fn clone(&self) -> Self {
Self { inner: self.inner.clone() }
}
}
impl<T: ?Sized> Debug for WeakRef<T> {
#[inline]
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
f.write_str("(WeakRef)")
}
}