use core::ops::{Range, RangeInclusive};
#[cfg(not(feature = "no_object"))]
use rhai::Map;
#[cfg(not(feature = "no_index"))]
use rhai::{Array, Blob};
use rhai::{Dynamic, INT};
#[cfg(feature = "decimal")]
use rust_decimal::Decimal;
pub(crate) fn is_poolable(value: &Dynamic) -> bool {
#[cfg(not(feature = "no_closure"))]
if value.is_shared() {
return false;
}
#[cfg(not(feature = "no_float"))]
if value.is_float() {
return true;
}
if value.is_unit() || value.is_bool() || value.is_int() || value.is_char() || value.is_string()
{
return true;
}
#[cfg(not(feature = "no_index"))]
if value.is_array() {
return value
.read_lock::<Array>()
.map_or(false, |array| array.iter().all(is_poolable));
}
#[cfg(not(feature = "no_object"))]
if value.is_map() {
return value
.read_lock::<Map>()
.map_or(false, |map| map.values().all(is_poolable));
}
#[cfg(not(feature = "no_index"))]
if value.is_blob() {
return value.read_lock::<Blob>().is_some();
}
#[cfg(feature = "decimal")]
if value.is_decimal() {
return value.read_lock::<Decimal>().is_some();
}
if value.is_fnptr() {
return value.read_lock::<rhai::FnPtr>().is_some();
}
if value.is::<Range<INT>>() || value.is::<RangeInclusive<INT>>() {
return true;
}
false
}