bladeink 1.2.5

This is a Rust port of inkle's ink, a scripting language for writing interactive narrative.
Documentation
use std::{collections::HashMap, rc::Rc};

use crate::{ink_list::InkList, list_definition::ListDefinition, value::Value};

#[derive(Clone)]
pub struct ListDefinitionsOrigin {
    lists: HashMap<String, ListDefinition>,
    all_unambiguous_list_value_cache: HashMap<String, Rc<Value>>,
}

impl ListDefinitionsOrigin {
    pub fn new(lists: &mut Vec<ListDefinition>) -> Self {
        let mut list_definitions_origin = ListDefinitionsOrigin {
            lists: HashMap::new(),
            all_unambiguous_list_value_cache: HashMap::new(),
        };

        for list in lists {
            list_definitions_origin
                .lists
                .insert(list.get_name().to_string(), list.clone());

            for (key, val) in list.get_items() {
                let mut l = InkList::new();
                l.items.insert(key.clone(), *val);

                let list_value = Rc::new(Value::new::<InkList>(l));

                list_definitions_origin
                    .all_unambiguous_list_value_cache
                    .insert(key.get_item_name().to_string(), list_value.clone());
                list_definitions_origin
                    .all_unambiguous_list_value_cache
                    .insert(key.get_full_name().to_string(), list_value.clone());
            }
        }

        list_definitions_origin
    }

    pub fn get_list_definition(&self, name: &str) -> Option<&ListDefinition> {
        self.lists.get(name)
    }

    pub fn find_single_item_list_with_name(&self, name: &str) -> Option<&Rc<Value>> {
        if name.trim().is_empty() {
            return None;
        }

        self.all_unambiguous_list_value_cache.get(name)
    }
}