Documentation
use super::*;

pub fn reduce_stack(stack: &mut Vec<Unfinished>, top: Node) -> Result<Option<Map>, ()> {
    match stack.last_mut() {
        None => match top {
            Node::Map(top) => Ok(Some(top)),
            _ => Err(()),
        },
        Some(Unfinished::AtomValue(_)) => Err(()),
        Some(Unfinished::List(UnfinishedList { elements })) => {
            elements.push(top);
            Ok(None)
        }
        Some(Unfinished::Map(UnfinishedMap {
            entries,
            pending_entry,
        })) => {
            if pending_entry.has_equal {
                entries.push(MapEntry {
                    key: Identifier::new(pending_entry.key.clone())
                        .expect("Pending key should always be valid"),
                    value: top,
                });

                *pending_entry = UnfinishedMapEntry::empty();

                Ok(None)
            } else {
                Err(())
            }
        }
    }
}