1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
//! Nützliche Traits und Funktionen die alle Teile dieses Projekts verwenden
//!
//! # Examples
//! ```
//! use xmz_server::prelude::*;
//! ```

use std::any::Any;

// Oft benötigte crates
pub use std::time::Duration;
pub use std::fmt;

// Reexports
pub use config::Config;
pub use configuration;
pub use error::ServerError;
pub use messzelle::{BoxedMesszelle, Messzelle, MesszelleList, MesszelleType, MetzConnectCI4Analog420, RaGasNO2Mod, RaGasCOMod};
pub use runtime_info;
pub use sensor::{BoxedSensor, MetzConnectCI4, RaGasCONO2Mod, Sensor, SensorList, SensorType, TestSensor};
pub use server::Server;
pub use std::error::Error;
pub use std::sync::{Arc, Mutex, RwLock};
pub use std::thread;
pub use zone::Zone;

/// Die `id` Funktion liefert genau den Wert zurück der auch in die Funktion gegeben wurde.
///
/// https://bluss.github.io/rust/fun/2015/10/11/stuff-the-identity-function-does/
///
/// # Examples
/// ```
/// use xmz_server::prelude::*;
///
/// assert_eq!(1, id(1));
/// ```
pub fn id<T>(x: T) -> T {
    x
}

/// Dieser Trait ist für das Upcasting nötig
///
/// * https://stackoverflow.com/questions/42056422/using-any-with-traits-in-rust
/// * https://stackoverflow.com/questions/28632968/why-doesnt-rust-support-trait-object-upcasting
/// * https://github.com/rust-lang/rust/issues/5665
pub trait AsAny: Any {
    fn as_any(&self) -> &Any;
}

/// Implementiere AsAny für alle Typen
impl<T: Any> AsAny for T {
    fn as_any(&self) -> &Any {
        self
    }
}