use std::fmt; use crate::reflect::map::ReflectMapIter; use crate::reflect::map::ReflectMapIterTrait; use crate::reflect::ReflectValueRef; use crate::reflect::RuntimeType; #[derive(Clone)] pub(crate) struct DynamicEmptyMap { key_type: RuntimeType, value_type: RuntimeType, } impl DynamicEmptyMap { pub(crate) fn new(key_type: RuntimeType, value_type: RuntimeType) -> DynamicEmptyMap { Self { key_type, value_type, } } pub(crate) fn len(&self) -> usize { 0 } pub(crate) fn is_empty(&self) -> bool { true } pub(crate) fn get<'a>(&'a self, _key: ReflectValueRef) -> Option> { None } pub(crate) fn key_type(&self) -> RuntimeType { self.key_type.clone() } pub(crate) fn value_type(&self) -> RuntimeType { self.value_type.clone() } pub(crate) fn reflect_iter(&self) -> ReflectMapIter { ReflectMapIter::new(DynamicEmptyMapIter { key_type: self.key_type.clone(), value_type: self.value_type.clone(), }) } } impl fmt::Debug for DynamicEmptyMap { fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { f.debug_map().finish() } } struct DynamicEmptyMapIter { key_type: RuntimeType, value_type: RuntimeType, } impl<'a> ReflectMapIterTrait<'a> for DynamicEmptyMapIter { fn next(&mut self) -> Option<(ReflectValueRef<'a>, ReflectValueRef<'a>)> { None } fn key_type(&self) -> RuntimeType { self.key_type.clone() } fn value_type(&self) -> RuntimeType { self.value_type.clone() } }