use std::any::Any;
use std::collections::HashMap;
use std::sync::Arc;
pub fn object_keys(v: &Arc<dyn Any + Send + Sync>) -> Result<Arc<dyn Any + Send + Sync>, String> {
let arc_map = v
.clone()
.downcast::<HashMap<String, Arc<dyn Any + Send + Sync>>>()
.map_err(|_| {
format!(
"Unsupported type for object keys input: {} (input must be HashMap<String, Arc<dyn Any + Send + Sync>>)",
std::any::type_name_of_val(&**v)
)
})?;
let keys: Vec<Arc<dyn Any + Send + Sync>> = arc_map
.keys()
.map(|k| Arc::new(k.clone()) as Arc<dyn Any + Send + Sync>)
.collect();
Ok(Arc::new(keys) as Arc<dyn Any + Send + Sync>)
}
pub fn object_values(v: &Arc<dyn Any + Send + Sync>) -> Result<Arc<dyn Any + Send + Sync>, String> {
let arc_map = v
.clone()
.downcast::<HashMap<String, Arc<dyn Any + Send + Sync>>>()
.map_err(|_| {
format!(
"Unsupported type for object values input: {} (input must be HashMap<String, Arc<dyn Any + Send + Sync>>)",
std::any::type_name_of_val(&**v)
)
})?;
let values: Vec<Arc<dyn Any + Send + Sync>> = arc_map.values().cloned().collect();
Ok(Arc::new(values) as Arc<dyn Any + Send + Sync>)
}
pub fn object_entries(
v: &Arc<dyn Any + Send + Sync>,
) -> Result<Arc<dyn Any + Send + Sync>, String> {
let arc_map = v
.clone()
.downcast::<HashMap<String, Arc<dyn Any + Send + Sync>>>()
.map_err(|_| {
format!(
"Unsupported type for object entries input: {} (input must be HashMap<String, Arc<dyn Any + Send + Sync>>)",
std::any::type_name_of_val(&**v)
)
})?;
let entries: Vec<Arc<dyn Any + Send + Sync>> = arc_map
.iter()
.map(|(k, v)| {
let pair: Vec<Arc<dyn Any + Send + Sync>> =
vec![Arc::new(k.clone()) as Arc<dyn Any + Send + Sync>, v.clone()];
Arc::new(pair) as Arc<dyn Any + Send + Sync>
})
.collect();
Ok(Arc::new(entries) as Arc<dyn Any + Send + Sync>)
}
pub fn object_property(
v: &Arc<dyn Any + Send + Sync>,
key: &Arc<dyn Any + Send + Sync>,
) -> Result<Arc<dyn Any + Send + Sync>, String> {
let arc_map = v
.clone()
.downcast::<HashMap<String, Arc<dyn Any + Send + Sync>>>()
.map_err(|_| {
format!(
"Unsupported type for object property input: {} (input must be HashMap<String, Arc<dyn Any + Send + Sync>>)",
std::any::type_name_of_val(&**v)
)
})?;
let arc_key = key.clone().downcast::<String>().map_err(|_| {
format!(
"Unsupported type for object property key: {} (key must be String)",
std::any::type_name_of_val(&**key)
)
})?;
arc_map
.get(&*arc_key)
.cloned()
.ok_or_else(|| format!("Property '{}' not found in object", *arc_key))
}
pub fn object_has_property(
v: &Arc<dyn Any + Send + Sync>,
key: &Arc<dyn Any + Send + Sync>,
) -> Result<Arc<dyn Any + Send + Sync>, String> {
let arc_map = v
.clone()
.downcast::<HashMap<String, Arc<dyn Any + Send + Sync>>>()
.map_err(|_| {
format!(
"Unsupported type for object has_property input: {} (input must be HashMap<String, Arc<dyn Any + Send + Sync>>)",
std::any::type_name_of_val(&**v)
)
})?;
let arc_key = key.clone().downcast::<String>().map_err(|_| {
format!(
"Unsupported type for object has_property key: {} (key must be String)",
std::any::type_name_of_val(&**key)
)
})?;
let has_property = arc_map.contains_key(&*arc_key);
Ok(Arc::new(has_property) as Arc<dyn Any + Send + Sync>)
}
pub fn object_merge(
v1: &Arc<dyn Any + Send + Sync>,
v2: &Arc<dyn Any + Send + Sync>,
) -> Result<Arc<dyn Any + Send + Sync>, String> {
let arc_map1 = v1
.clone()
.downcast::<HashMap<String, Arc<dyn Any + Send + Sync>>>()
.map_err(|_| {
format!(
"Unsupported type for object merge input 1: {} (input must be HashMap<String, Arc<dyn Any + Send + Sync>>)",
std::any::type_name_of_val(&**v1)
)
})?;
let arc_map2 = v2
.clone()
.downcast::<HashMap<String, Arc<dyn Any + Send + Sync>>>()
.map_err(|_| {
format!(
"Unsupported type for object merge input 2: {} (input must be HashMap<String, Arc<dyn Any + Send + Sync>>)",
std::any::type_name_of_val(&**v2)
)
})?;
let mut merged: HashMap<String, Arc<dyn Any + Send + Sync>> = (*arc_map1).clone();
for (k, v) in arc_map2.iter() {
merged.insert(k.clone(), v.clone());
}
Ok(Arc::new(merged) as Arc<dyn Any + Send + Sync>)
}
pub fn object_set_property(
v: &Arc<dyn Any + Send + Sync>,
key: &Arc<dyn Any + Send + Sync>,
value: &Arc<dyn Any + Send + Sync>,
) -> Result<Arc<dyn Any + Send + Sync>, String> {
let arc_map = v
.clone()
.downcast::<HashMap<String, Arc<dyn Any + Send + Sync>>>()
.map_err(|_| {
format!(
"Unsupported type for object set_property input: {} (input must be HashMap<String, Arc<dyn Any + Send + Sync>>)",
std::any::type_name_of_val(&**v)
)
})?;
let arc_key = key.clone().downcast::<String>().map_err(|_| {
format!(
"Unsupported type for object set_property key: {} (key must be String)",
std::any::type_name_of_val(&**key)
)
})?;
let mut new_map: HashMap<String, Arc<dyn Any + Send + Sync>> = (*arc_map).clone();
new_map.insert((*arc_key).clone(), value.clone());
Ok(Arc::new(new_map) as Arc<dyn Any + Send + Sync>)
}
pub fn object_delete_property(
v: &Arc<dyn Any + Send + Sync>,
key: &Arc<dyn Any + Send + Sync>,
) -> Result<Arc<dyn Any + Send + Sync>, String> {
let arc_map = v
.clone()
.downcast::<HashMap<String, Arc<dyn Any + Send + Sync>>>()
.map_err(|_| {
format!(
"Unsupported type for object delete_property input: {} (input must be HashMap<String, Arc<dyn Any + Send + Sync>>)",
std::any::type_name_of_val(&**v)
)
})?;
let arc_key = key.clone().downcast::<String>().map_err(|_| {
format!(
"Unsupported type for object delete_property key: {} (key must be String)",
std::any::type_name_of_val(&**key)
)
})?;
let mut new_map: HashMap<String, Arc<dyn Any + Send + Sync>> = (*arc_map).clone();
new_map.remove(&*arc_key);
Ok(Arc::new(new_map) as Arc<dyn Any + Send + Sync>)
}
pub fn object_size(v: &Arc<dyn Any + Send + Sync>) -> Result<Arc<dyn Any + Send + Sync>, String> {
let arc_map = v
.clone()
.downcast::<HashMap<String, Arc<dyn Any + Send + Sync>>>()
.map_err(|_| {
format!(
"Unsupported type for object size input: {} (input must be HashMap<String, Arc<dyn Any + Send + Sync>>)",
std::any::type_name_of_val(&**v)
)
})?;
let size = arc_map.len() as i64;
Ok(Arc::new(size) as Arc<dyn Any + Send + Sync>)
}