shelly-shell 0.5.2

A Rust based Unix style shell with a typed and structured language syntax.

use std::collections::HashMap;

use crate::language::data::{ map_key::MapKey, types::TypeKind, value::Value };


pub(super) fn properties(receiver: &mut Value, _: &[Value]) -> Result<Value, String>
{
    let mut members = HashMap::new();
    if let Value::Struct(item) = receiver.underlying()
    {
        if let TypeKind::Struct(fields) = &item.definition.kind
        {
            for (field, value) in fields.iter().zip(&item.fields)
            { members.insert(MapKey::String(field.name.clone()), value.clone()); }
        }
    }
    else
    {
        members.insert(MapKey::String("value".into()), receiver.clone());
        if let Value::Enum(item) = receiver.underlying()
        { members.insert(MapKey::String("index".into()), Value::Integer(item.variant as i64)); }
        if let Value::Type(item) = receiver.underlying()
        { members.insert(MapKey::String("name".into()), Value::from_string(item.name.clone())); }
    }
    Ok(Value::from_hash_map(members))
}