ketos 0.12.0

Lisp dialect scripting and extension language
Documentation
extern crate ketos;
#[macro_use] extern crate ketos_derive;

use std::fmt;

use ketos::{FromValue, FromValueRef, Value};

#[derive(Debug, ForeignValue, FromValue, FromValueRef, IntoValue)]
struct NoClone(&'static str);

#[derive(Clone, Debug, ForeignValue, FromValueClone, FromValueRef, IntoValue)]
struct Cloner(&'static str);

#[test]
fn test_derive() {
    let a: Value = NoClone("foo").into();
    let b = a.clone();

    assert!(<&NoClone>::from_value_ref(&a).is_ok());
    assert!(NoClone::from_value(a).is_err());
    assert!(NoClone::from_value(b).is_ok());

    let a: Value = Cloner("foo").into();
    let b = a.clone();

    assert!(<&Cloner>::from_value_ref(&a).is_ok());
    assert!(Cloner::from_value(a).is_ok());
    assert!(Cloner::from_value(b).is_ok());
}

#[derive(ForeignValue, FromValue, FromValueRef, IntoValue)]
struct Generic<T: 'static>(T);

impl<T> fmt::Debug for Generic<T> {
    fn fmt(&self, _: &mut fmt::Formatter) -> fmt::Result { unimplemented!() }
}

#[derive(ForeignValue, FromValue, FromValueRef, IntoValue)]
struct GenericWhere<T>(T) where T: 'static;

impl<T> fmt::Debug for GenericWhere<T> {
    fn fmt(&self, _: &mut fmt::Formatter) -> fmt::Result { unimplemented!() }
}

#[derive(ForeignValue, FromValueClone, FromValueRef, IntoValue)]
struct CloneGeneric<T: 'static>(T);

impl<T> Clone for CloneGeneric<T> {
    fn clone(&self) -> Self { unimplemented!() }
}

impl<T> fmt::Debug for CloneGeneric<T> {
    fn fmt(&self, _: &mut fmt::Formatter) -> fmt::Result { unimplemented!() }
}

#[derive(ForeignValue, FromValueClone, FromValueRef, IntoValue)]
struct CloneGenericWhere<T>(T) where T: 'static;

impl<T> Clone for CloneGenericWhere<T> {
    fn clone(&self) -> Self { unimplemented!() }
}

impl<T> fmt::Debug for CloneGenericWhere<T> {
    fn fmt(&self, _: &mut fmt::Formatter) -> fmt::Result { unimplemented!() }
}