1use crate::{ast::*, error::*};
106use serde::{
107 Deserialize,
108 de::{self, IntoDeserializer, VariantAccess},
109};
110use std::{collections::HashMap, fmt, marker::PhantomData};
111
112pub trait IntoOwned: Clone + 'static {
114 type Owned;
115 type Table;
116 fn into_owned(self, table: &Self::Table) -> Result<Self::Owned>;
117}
118
119impl<T: IntoOwned> IntoOwned for Vec<T> {
120 type Owned = Vec<T::Owned>;
121 type Table = T::Table;
122
123 fn into_owned(self, table: &Self::Table) -> Result<Self::Owned> {
124 self.into_iter().map(|x| x.into_owned(table)).collect()
125 }
126}
127
128pub trait Holder: IntoOwned {
130 fn name() -> &'static str;
131 fn attr_len() -> usize;
132}
133
134pub trait WithVisitor {
135 type Visitor: for<'de> de::Visitor<'de, Value = Self>;
136 fn visitor_new() -> Self::Visitor;
137}
138
139pub trait EntityTable<T: Holder<Table = Self>> {
141 fn get_owned(&self, entity_id: u64) -> Result<T::Owned>;
143
144 fn owned_iter<'table>(
146 &'table self,
147 ) -> Box<dyn Iterator<Item = Result<T::Owned>> + 'table>;
148}
149
150pub trait TableInit: Default {
152 fn append_data_section(&mut self, section: &DataSection) -> Result<()>;
153
154 fn from_data_section(section: &DataSection) -> Result<Self> {
155 let mut table = Self::default();
156 table.append_data_section(section)?;
157 Ok(table)
158 }
159
160 fn from_data_sections(sections: &[DataSection]) -> Result<Self> {
161 let mut table = Self::default();
162 for section in sections {
163 table.append_data_section(section)?;
164 }
165 Ok(table)
166 }
167}
168
169pub fn get_owned<T, Table>(
170 table: &Table,
171 map: &HashMap<u64, T>,
172 entity_id: u64,
173) -> Result<T::Owned>
174where
175 T: Holder<Table = Table>,
176 Table: EntityTable<T>,
177{
178 match map.get(&entity_id) {
179 Some(holder) => holder.clone().into_owned(table),
180 None => Err(Error::UnknownEntity(entity_id)),
181 }
182}
183
184pub fn owned_iter<'table, T, Table>(
185 table: &'table Table,
186 map: &'table HashMap<u64, T>,
187) -> Box<dyn Iterator<Item = Result<T::Owned>> + 'table>
188where
189 T: Holder<Table = Table>,
190 Table: EntityTable<T>,
191{
192 Box::new(
193 map.values()
194 .cloned()
195 .map(move |value| value.into_owned(table)),
196 )
197}
198
199pub fn insert_record<'de, T: de::Deserialize<'de>>(
201 table: &mut HashMap<u64, T>,
202 id: u64,
203 record: &Record,
204) -> crate::error::Result<()> {
205 if table
206 .insert(id, de::Deserialize::deserialize(record)?)
207 .is_some()
208 {
209 Err(Error::DuplicatedEntity(id))
210 } else {
211 Ok(())
212 }
213}
214
215#[derive(Debug, Clone, PartialEq)]
217pub enum PlaceHolder<T> {
218 Ref(Name),
219 Owned(T),
220}
221
222impl<T: Holder> IntoOwned for PlaceHolder<T>
223where
224 T::Table: EntityTable<T>,
225{
226 type Owned = T::Owned;
227 type Table = T::Table;
228
229 fn into_owned(self, table: &Self::Table) -> Result<T::Owned> {
236 match self {
237 PlaceHolder::Ref(id) => match id {
238 Name::Entity(id) => table.get_owned(id),
239 _ => unimplemented!("ENTITY is only supported now"),
240 },
241 PlaceHolder::Owned(a) => a.into_owned(table),
242 }
243 }
244}
245
246impl<T: Holder> From<T> for PlaceHolder<T> {
247 fn from(owned: T) -> Self {
248 PlaceHolder::Owned(owned)
249 }
250}
251
252impl<T> From<Name> for PlaceHolder<T> {
253 fn from(rvalue: Name) -> Self {
254 PlaceHolder::Ref(rvalue)
255 }
256}
257
258impl<'de, T: Holder + WithVisitor + Deserialize<'de>> Deserialize<'de>
259 for PlaceHolder<T>
260{
261 fn deserialize<D>(deserializer: D) -> ::std::result::Result<Self, D::Error>
262 where
263 D: de::Deserializer<'de>,
264 {
265 deserializer.deserialize_tuple_struct(
266 T::name(),
267 T::attr_len(),
268 PlaceHolderVisitor::<T>::default(),
269 )
270 }
271}
272
273struct PlaceHolderVisitor<T> {
274 phantom: PhantomData<T>,
275}
276
277impl<T> Default for PlaceHolderVisitor<T> {
278 fn default() -> Self {
279 PlaceHolderVisitor {
280 phantom: PhantomData,
281 }
282 }
283}
284
285impl<'de, T: Deserialize<'de> + Holder + WithVisitor> de::Visitor<'de>
286 for PlaceHolderVisitor<T>
287{
288 type Value = PlaceHolder<T>;
289
290 fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
291 write!(formatter, "PlaceHolder<{}>", std::any::type_name::<T>())
292 }
293
294 fn visit_i64<E>(self, v: i64) -> ::std::result::Result<Self::Value, E>
295 where
296 E: de::Error,
297 {
298 Ok(PlaceHolder::Owned(T::deserialize(v.into_deserializer())?))
299 }
300
301 fn visit_f64<E>(self, v: f64) -> ::std::result::Result<Self::Value, E>
302 where
303 E: de::Error,
304 {
305 Ok(PlaceHolder::Owned(T::deserialize(v.into_deserializer())?))
306 }
307
308 fn visit_str<E>(self, v: &str) -> ::std::result::Result<Self::Value, E>
309 where
310 E: de::Error,
311 {
312 Ok(PlaceHolder::Owned(T::deserialize(v.into_deserializer())?))
313 }
314
315 fn visit_seq<A>(
316 self,
317 seq: A,
318 ) -> ::std::result::Result<Self::Value, A::Error>
319 where
320 A: de::SeqAccess<'de>,
321 {
322 let visitor = T::visitor_new();
323 Ok(PlaceHolder::Owned(visitor.visit_seq(seq)?))
324 }
325
326 fn visit_enum<A>(
328 self,
329 data: A,
330 ) -> ::std::result::Result<Self::Value, A::Error>
331 where
332 A: de::EnumAccess<'de>,
333 {
334 let (key, variant): (String, _) = data.variant()?;
335 match key.as_str() {
336 "Entity" => {
337 let value: u64 = variant.newtype_variant()?;
338 Ok(PlaceHolder::Ref(Name::Entity(value)))
339 }
340 "Value" => {
341 let value: u64 = variant.newtype_variant()?;
342 Ok(PlaceHolder::Ref(Name::Value(value)))
343 }
344 "ConstantEntity" => {
345 let name: String = variant.newtype_variant()?;
346 Ok(PlaceHolder::Ref(Name::ConstantEntity(name)))
347 }
348 "ConstantValue" => {
349 let name: String = variant.newtype_variant()?;
350 Ok(PlaceHolder::Ref(Name::ConstantValue(name)))
351 }
352 _ => unreachable!("Invalid key while deserializing PlaceHolder"),
353 }
354 }
355
356 fn visit_map<A>(
358 self,
359 map: A,
360 ) -> ::std::result::Result<Self::Value, A::Error>
361 where
362 A: de::MapAccess<'de>,
363 {
364 let visitor = T::visitor_new();
365 Ok(PlaceHolder::Owned(visitor.visit_map(map)?))
366 }
367}