rpgmvx_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
10/*
11pub(crate) fn ruby_string_array2string_array(
12    ctx: &FromValueContext,
13    value: &Value,
14) -> Result<Vec<String>, FromValueError> {
15    struct Wrapper(String);
16
17    impl<'a> FromValue<'a> for Wrapper {
18        fn from_value(
19            ctx: &FromValueContext<'a>,
20            value: &'a Value,
21        ) -> Result<Self, FromValueError> {
22            let value = ruby_string2string(ctx, value)?;
23            Ok(Self(value))
24        }
25    }
26
27    let value: Vec<Wrapper> = FromValue::from_value(ctx, value)?;
28    let value = value.into_iter().map(|value| value.0).collect();
29
30    Ok(value)
31}
32
33pub(crate) fn string_array2ruby_string_array(
34    string_array: Vec<String>,
35    arena: &mut ValueArena,
36) -> Result<ValueHandle, ruby_marshal::IntoValueError> {
37    let mut value = Vec::with_capacity(string_array.len());
38    for string in string_array {
39        value.push(string2ruby_string(string, arena)?);
40    }
41    Ok(arena.create_array(value).into())
42}
43*/
44
45pub(crate) fn optional_ruby_string_array2optional_string_array(
46    ctx: &FromValueContext,
47    value: &Value,
48) -> Result<Vec<Option<String>>, FromValueError> {
49    struct Wrapper(Option<String>);
50
51    impl<'a> FromValue<'a> for Wrapper {
52        fn from_value(
53            ctx: &FromValueContext<'a>,
54            value: &'a Value,
55        ) -> Result<Self, FromValueError> {
56            if matches!(value, Value::Nil(_)) {
57                return Ok(Self(None));
58            }
59
60            let value = ruby_string2string(ctx, value)?;
61            Ok(Self(Some(value)))
62        }
63    }
64
65    let value: Vec<Wrapper> = FromValue::from_value(ctx, value)?;
66    let value = value.into_iter().map(|value| value.0).collect();
67
68    Ok(value)
69}
70
71pub(crate) fn optional_string_array2optional_ruby_string_array(
72    optional_string_array: Vec<Option<String>>,
73    arena: &mut ValueArena,
74) -> Result<ValueHandle, ruby_marshal::IntoValueError> {
75    let mut value = Vec::with_capacity(optional_string_array.len());
76    for optional_string in optional_string_array {
77        let handle = match optional_string {
78            Some(string) => string2ruby_string(string, arena)?,
79            None => arena.create_nil().into(),
80        };
81        value.push(handle);
82    }
83    Ok(arena.create_array(value).into())
84}