rustr/traits/
rfield.rs

1use ::rdll::*;
2use traits::{ToSEXP, SetSEXP, RNew};
3use protect::stackp::Shield;
4
5use util::c_str;
6use error::*;
7
8pub trait RField: ToSEXP+ SetSEXP{
9    fn get<D: RNew>(&self, field_name: &str) -> RResult<D> {
10        unsafe {
11            let call = Shield::new(Rf_lang3(R_DollarSymbol,
12                                            self.s(),
13                                            Rf_mkString(c_str(field_name).as_ptr())));
14            RNew::rnew(Rf_eval(call.s(), R_GlobalEnv))
15        }
16    }
17    fn set<T: ToSEXP>(&mut self, field_name: &str, x: T) {
18        unsafe {
19            let dollar = Rf_install(c_str(field_name).as_ptr());
20            let call = Shield::new(Rf_lang4(dollar,
21                                            self.s(),
22                                            Rf_mkString(c_str(field_name).as_ptr()),
23                                            x.s()));
24            self.set_s(Rf_eval(call.s(), R_GlobalEnv));
25        }
26    }
27}