aorist_extendr_api/wrapper/
symbol.rs1use super::*;
2
3#[derive(Debug, PartialEq, Clone)]
14pub struct Symbol {
15    pub(crate) robj: Robj,
16}
17
18impl Symbol {
19    pub fn from_string<S: AsRef<str>>(val: S) -> Self {
29        let val = val.as_ref();
30        Symbol {
31            robj: unsafe { new_owned(make_symbol(val)) },
32        }
33    }
34
35    fn from_sexp(sexp: SEXP) -> Symbol {
37        unsafe {
38            assert!(TYPEOF(sexp) == SYMSXP as i32);
39        }
40        Symbol {
41            robj: unsafe { new_sys(sexp) },
42        }
43    }
44
45    pub fn as_str(&self) -> &str {
53        unsafe {
54            let sexp = self.robj.get();
55            let printname = PRINTNAME(sexp);
56            assert!(TYPEOF(printname) as u32 == CHARSXP);
57            to_str(R_CHAR(printname) as *const u8)
58        }
59    }
60}
61
62impl From<&str> for Symbol {
63    fn from(name: &str) -> Self {
65        Symbol::from_string(name)
66    }
67}
68
69pub fn unbound_value() -> Symbol {
71    unsafe { Symbol::from_sexp(R_UnboundValue) }
72}
73
74pub fn missing_arg() -> Symbol {
76    unsafe { Symbol::from_sexp(R_MissingArg) }
77}
78
79pub fn base_symbol() -> Symbol {
81    unsafe { Symbol::from_sexp(R_BaseSymbol) }
82}
83
84pub fn brace_symbol() -> Symbol {
86    unsafe { Symbol::from_sexp(R_BraceSymbol) }
87}
88
89pub fn bracket_2_symbol() -> Symbol {
91    unsafe { Symbol::from_sexp(R_Bracket2Symbol) }
92}
93
94pub fn bracket_symbol() -> Symbol {
96    unsafe { Symbol::from_sexp(R_BracketSymbol) }
97}
98
99pub fn class_symbol() -> Symbol {
101    unsafe { Symbol::from_sexp(R_ClassSymbol) }
102}
103
104pub fn device_symbol() -> Symbol {
106    unsafe { Symbol::from_sexp(R_DeviceSymbol) }
107}
108
109pub fn dimnames_symbol() -> Symbol {
111    unsafe { Symbol::from_sexp(R_DimNamesSymbol) }
112}
113
114pub fn dim_symbol() -> Symbol {
116    unsafe { Symbol::from_sexp(R_DimSymbol) }
117}
118
119pub fn dollar_symbol() -> Symbol {
121    unsafe { Symbol::from_sexp(R_DollarSymbol) }
122}
123
124pub fn dots_symbol() -> Symbol {
126    unsafe { Symbol::from_sexp(R_DotsSymbol) }
127}
128pub fn double_colon_symbol() -> Symbol {
132    unsafe { Symbol::from_sexp(R_DoubleColonSymbol) }
133}
134
135pub fn lastvalue_symbol() -> Symbol {
137    unsafe { Symbol::from_sexp(R_LastvalueSymbol) }
138}
139pub fn levels_symbol() -> Symbol {
141    unsafe { Symbol::from_sexp(R_LevelsSymbol) }
142}
143pub fn mode_symbol() -> Symbol {
145    unsafe { Symbol::from_sexp(R_ModeSymbol) }
146}
147pub fn na_rm_symbol() -> Symbol {
149    unsafe { Symbol::from_sexp(R_NaRmSymbol) }
150}
151pub fn name_symbol() -> Symbol {
153    unsafe { Symbol::from_sexp(R_NameSymbol) }
154}
155pub fn names_symbol() -> Symbol {
157    unsafe { Symbol::from_sexp(R_NamesSymbol) }
158}
159pub fn namespace_env_symbol() -> Symbol {
161    unsafe { Symbol::from_sexp(R_NamespaceEnvSymbol) }
162}
163pub fn package_symbol() -> Symbol {
165    unsafe { Symbol::from_sexp(R_PackageSymbol) }
166}
167pub fn previous_symbol() -> Symbol {
169    unsafe { Symbol::from_sexp(R_PreviousSymbol) }
170}
171pub fn quote_symbol() -> Symbol {
173    unsafe { Symbol::from_sexp(R_QuoteSymbol) }
174}
175pub fn row_names_symbol() -> Symbol {
177    unsafe { Symbol::from_sexp(R_RowNamesSymbol) }
178}
179pub fn seeds_symbol() -> Symbol {
181    unsafe { Symbol::from_sexp(R_SeedsSymbol) }
182}
183pub fn sort_list_symbol() -> Symbol {
185    unsafe { Symbol::from_sexp(R_SortListSymbol) }
186}
187pub fn source_symbol() -> Symbol {
189    unsafe { Symbol::from_sexp(R_SourceSymbol) }
190}
191pub fn spec_symbol() -> Symbol {
193    unsafe { Symbol::from_sexp(R_SpecSymbol) }
194}
195pub fn tsp_symbol() -> Symbol {
197    unsafe { Symbol::from_sexp(R_TspSymbol) }
198}
199pub fn triple_colon_symbol() -> Symbol {
201    unsafe { Symbol::from_sexp(R_TripleColonSymbol) }
202}
203pub fn dot_defined() -> Symbol {
205    unsafe { Symbol::from_sexp(R_dot_defined) }
206}
207pub fn dot_method() -> Symbol {
209    unsafe { Symbol::from_sexp(R_dot_Method) }
210}
211pub fn dot_package_name() -> Symbol {
213    unsafe { Symbol::from_sexp(R_dot_packageName) }
214}
215
216pub fn dot_target() -> Symbol {
218    unsafe { Symbol::from_sexp(R_dot_target) }
219}
220
221#[cfg(test)]
222mod test {
223    use super::*;
224
225    #[test]
226    fn test_constant_symbols() {
227        test! {
228            assert!(unbound_value().is_symbol());
229            assert!(missing_arg().is_symbol());
230            assert!(base_symbol().is_symbol());
231            assert!(brace_symbol().is_symbol());
232            assert!(bracket_2_symbol().is_symbol());
233            assert!(bracket_symbol().is_symbol());
234            assert!(class_symbol().is_symbol());
235            assert!(device_symbol().is_symbol());
236            assert!(dimnames_symbol().is_symbol());
237            assert!(dim_symbol().is_symbol());
238            assert!(dollar_symbol().is_symbol());
239            assert!(dots_symbol().is_symbol());
240            assert!(lastvalue_symbol().is_symbol());
241            assert!(levels_symbol().is_symbol());
242            assert!(mode_symbol().is_symbol());
243            assert!(na_rm_symbol().is_symbol());
244            assert!(name_symbol().is_symbol());
245            assert!(names_symbol().is_symbol());
246            assert!(namespace_env_symbol().is_symbol());
247            assert!(package_symbol().is_symbol());
248            assert!(previous_symbol().is_symbol());
249            assert!(quote_symbol().is_symbol());
250            assert!(row_names_symbol().is_symbol());
251            assert!(seeds_symbol().is_symbol());
252            assert!(sort_list_symbol().is_symbol());
253            assert!(source_symbol().is_symbol());
254            assert!(spec_symbol().is_symbol());
255            assert!(tsp_symbol().is_symbol());
256            assert!(triple_colon_symbol().is_symbol());
257            assert!(dot_defined().is_symbol());
258            assert!(dot_method().is_symbol());
259            assert!(dot_package_name().is_symbol());
260            assert!(dot_target().is_symbol());
261        }
262    }
263}