use super::{Object, RbFields, RbHash, RbString, Symbol, Userdata, Value};
macro_rules! utf8_enc {
() => {{
let mut f = RbFields::new();
f.insert("E".into(), true.into());
f
}};
}
impl Value {
#[must_use]
pub fn from_symbol(symbol: String) -> Self {
Self::Symbol(symbol.into())
}
}
impl<T> From<Option<T>> for Value
where
T: Into<Value>,
{
fn from(value: Option<T>) -> Self {
match value {
Some(v) => v.into(),
None => Self::Nil,
}
}
}
impl From<String> for Value {
fn from(value: String) -> Self {
let fields = utf8_enc!();
Value::String(RbString {
data: value.into_bytes(),
fields,
})
}
}
impl From<&str> for Value {
fn from(value: &str) -> Self {
let fields = utf8_enc!();
Value::String(RbString {
data: value.to_string().into_bytes(),
fields,
})
}
}
impl From<RbString> for Value {
fn from(value: RbString) -> Self {
Self::String(value)
}
}
impl From<Symbol> for Value {
fn from(value: Symbol) -> Self {
Self::Symbol(value)
}
}
impl From<bool> for Value {
fn from(value: bool) -> Self {
Self::Bool(value)
}
}
impl From<f64> for Value {
fn from(value: f64) -> Self {
Self::Float(value)
}
}
impl From<i64> for Value {
fn from(value: i64) -> Self {
Self::Integer(value)
}
}
impl From<RbHash> for Value {
fn from(value: RbHash) -> Self {
Self::Hash(value)
}
}
impl<T> From<Vec<T>> for Value
where
T: Into<Value>,
{
fn from(value: Vec<T>) -> Self {
Self::Array(value.into_iter().map(Into::into).collect())
}
}
impl TryInto<String> for Value {
type Error = Self;
fn try_into(self) -> Result<String, Self::Error> {
self.into_string()
.map(|str| str.to_string_lossy().into_owned())
}
}
impl TryInto<RbString> for Value {
type Error = Self;
fn try_into(self) -> Result<RbString, Self::Error> {
self.into_string()
}
}
impl TryInto<i64> for Value {
type Error = Self;
fn try_into(self) -> Result<i64, Self::Error> {
self.into_integer()
}
}
impl TryInto<f64> for Value {
type Error = Self;
fn try_into(self) -> Result<f64, Self::Error> {
self.into_float()
}
}
impl TryInto<Object> for Value {
type Error = Self;
fn try_into(self) -> Result<Object, Self::Error> {
self.into_object()
}
}
impl TryInto<Userdata> for Value {
type Error = Self;
fn try_into(self) -> Result<Userdata, Self::Error> {
self.into_userdata()
}
}
impl From<Value> for bool {
fn from(value: Value) -> Self {
match value {
Value::Nil => false,
Value::Bool(b) => b,
_ => true,
}
}
}