rpgmvx_types/util.rs
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 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84
pub(crate) use rpgm_common_types::ruby_string2string;
pub(crate) use rpgm_common_types::string2ruby_string;
use ruby_marshal::FromValue;
use ruby_marshal::FromValueContext;
use ruby_marshal::FromValueError;
use ruby_marshal::Value;
use ruby_marshal::ValueArena;
use ruby_marshal::ValueHandle;
/*
pub(crate) fn ruby_string_array2string_array(
ctx: &FromValueContext,
value: &Value,
) -> Result<Vec<String>, FromValueError> {
struct Wrapper(String);
impl<'a> FromValue<'a> for Wrapper {
fn from_value(
ctx: &FromValueContext<'a>,
value: &'a Value,
) -> Result<Self, FromValueError> {
let value = ruby_string2string(ctx, value)?;
Ok(Self(value))
}
}
let value: Vec<Wrapper> = FromValue::from_value(ctx, value)?;
let value = value.into_iter().map(|value| value.0).collect();
Ok(value)
}
pub(crate) fn string_array2ruby_string_array(
string_array: Vec<String>,
arena: &mut ValueArena,
) -> Result<ValueHandle, ruby_marshal::IntoValueError> {
let mut value = Vec::with_capacity(string_array.len());
for string in string_array {
value.push(string2ruby_string(string, arena)?);
}
Ok(arena.create_array(value).into())
}
*/
pub(crate) fn optional_ruby_string_array2optional_string_array(
ctx: &FromValueContext,
value: &Value,
) -> Result<Vec<Option<String>>, FromValueError> {
struct Wrapper(Option<String>);
impl<'a> FromValue<'a> for Wrapper {
fn from_value(
ctx: &FromValueContext<'a>,
value: &'a Value,
) -> Result<Self, FromValueError> {
if matches!(value, Value::Nil(_)) {
return Ok(Self(None));
}
let value = ruby_string2string(ctx, value)?;
Ok(Self(Some(value)))
}
}
let value: Vec<Wrapper> = FromValue::from_value(ctx, value)?;
let value = value.into_iter().map(|value| value.0).collect();
Ok(value)
}
pub(crate) fn optional_string_array2optional_ruby_string_array(
optional_string_array: Vec<Option<String>>,
arena: &mut ValueArena,
) -> Result<ValueHandle, ruby_marshal::IntoValueError> {
let mut value = Vec::with_capacity(optional_string_array.len());
for optional_string in optional_string_array {
let handle = match optional_string {
Some(string) => string2ruby_string(string, arena)?,
None => arena.create_nil().into(),
};
value.push(handle);
}
Ok(arena.create_array(value).into())
}