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 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}