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 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103
/* dynamic.rs
*
* Developed by Tim Walls <tim.walls@snowgoons.com>
* Copyright (c) All Rights Reserved, Tim Walls
*/
//! Dynamic data binding for the display layer
// Imports ===================================================================
use core::cell::RefCell;
// Declarations ==============================================================
/// Trait implemented by things that we want to be able to display values of
pub trait DisplayAs<X> {
fn display_value(&self) -> X;
/// True if this value is mutable (i.e. can change underneath us :-).)
fn is_mutable(&self) -> bool;
}
pub trait OptionalDisplayAs<X> {
fn is_displayed(&self) -> bool;
fn display_value(&self) -> X;
/// True if this value is mutable (i.e. can change underneath us :-).)
fn is_mutable(&self) -> bool;
}
// Code ======================================================================
impl<X> DisplayAs<X> for X
where
X: Clone
{
fn display_value(&self) -> X {
self.clone()
}
fn is_mutable(&self) -> bool {
false
}
}
impl<X,Y> OptionalDisplayAs<X> for Option<Y>
where
X: Default,
Y: DisplayAs<X>
{
fn is_displayed(&self) -> bool {
self.is_some()
}
fn display_value(&self) -> X {
match self {
Some(v) => {
v.display_value()
},
None => {
X::default()
}
}
}
fn is_mutable(&self) -> bool {
match self {
Some(v) => {
v.is_mutable()
},
None => {
false
}
}
}
}
impl<X> DisplayAs<X> for &RefCell<X>
where
X: Clone
{
fn display_value(&self) -> X {
(*self).borrow().clone()
}
fn is_mutable(&self) -> bool {
true
}
}
impl<X,Y> OptionalDisplayAs<Y> for &RefCell<X>
where
X: OptionalDisplayAs<Y>
{
fn is_displayed(&self) -> bool {
(*self).borrow().is_displayed()
}
fn display_value(&self) -> Y {
(*self).borrow().display_value()
}
fn is_mutable(&self) -> bool {
true
}
}
// Tests =====================================================================