rpgmxp_types/
util.rs

1pub(crate) use rpgm_common_types::ruby_string2string;
2pub(crate) use rpgm_common_types::string2ruby_string;
3use ruby_marshal::FromValue;
4use ruby_marshal::FromValueContext;
5use ruby_marshal::FromValueError;
6use ruby_marshal::Value;
7use ruby_marshal::ValueArena;
8use ruby_marshal::ValueHandle;
9
10pub(crate) fn ruby_string_array2string_array(
11    ctx: &FromValueContext,
12    value: &Value,
13) -> Result<Vec<String>, FromValueError> {
14    struct Wrapper(String);
15
16    impl<'a> FromValue<'a> for Wrapper {
17        fn from_value(
18            ctx: &FromValueContext<'a>,
19            value: &'a Value,
20        ) -> Result<Self, FromValueError> {
21            let value = ruby_string2string(ctx, value)?;
22            Ok(Self(value))
23        }
24    }
25
26    let value: Vec<Wrapper> = FromValue::from_value(ctx, value)?;
27    let value = value.into_iter().map(|value| value.0).collect();
28
29    Ok(value)
30}
31
32pub(crate) fn string_array2ruby_string_array(
33    string_array: Vec<String>,
34    arena: &mut ValueArena,
35) -> Result<ValueHandle, ruby_marshal::IntoValueError> {
36    let mut value = Vec::with_capacity(string_array.len());
37    for string in string_array {
38        value.push(string2ruby_string(string, arena)?);
39    }
40    Ok(arena.create_array(value).into())
41}