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
use std::io::Write;
use std::mem;
use crate::sys;
use crate::value::Value;
use crate::{Mrb, MrbError};
#[derive(Debug)]
pub struct Rest {
pub rest: Vec<Value>,
}
impl Rest {
pub unsafe fn extract(interp: &Mrb) -> Result<Self, MrbError> {
let mut args = <mem::MaybeUninit<*const sys::mrb_value>>::uninit();
let mut count = <mem::MaybeUninit<usize>>::uninit();
let mut argspec = vec![];
argspec
.write_all(sys::specifiers::REST.as_bytes())
.map_err(|_| MrbError::ArgSpec)?;
argspec.write_all(b"\0").map_err(|_| MrbError::ArgSpec)?;
sys::mrb_get_args(
interp.borrow().mrb,
argspec.as_ptr() as *const i8,
args.as_mut_ptr(),
count.as_mut_ptr(),
);
let args = std::slice::from_raw_parts(args.assume_init(), count.assume_init());
let args = args
.iter()
.map(|value| Value::new(&interp, *value))
.collect::<Vec<_>>();
Ok(Self { rest: args })
}
}