qlib_rs/data/
entity_schema.rs1use std::collections::HashMap;
2use serde::{Deserialize, Serialize};
3
4use crate::data::{EntityType, FieldSchema, FieldType};
5
6#[derive(Debug, Clone, PartialEq, Eq, Hash, Serialize, Deserialize)]
7pub struct Single;
8
9#[derive(Debug, Clone, PartialEq, Eq, Hash, Serialize, Deserialize)]
10pub struct Complete;
11
12#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
13pub struct EntitySchema<T> {
14 pub entity_type: EntityType,
15 pub inherit: Option<EntityType>,
16 pub fields: HashMap<FieldType, FieldSchema>,
17
18 _marker: std::marker::PhantomData<T>,
19}
20
21impl EntitySchema<Single> {
22 pub fn new(entity_type: impl Into<EntityType>, inherit: Option<EntityType>) -> Self {
23 Self {
24 entity_type: entity_type.into(),
25 inherit,
26 fields: HashMap::new(),
27 _marker: std::marker::PhantomData,
28 }
29 }
30}
31
32impl EntitySchema<Complete> {
33 pub fn new(entity_type: impl Into<EntityType>) -> Self {
34 Self {
35 entity_type: entity_type.into(),
36 inherit: None,
37 fields: HashMap::new(),
38 _marker: std::marker::PhantomData,
39 }
40 }
41}
42
43impl<T> EntitySchema<T> {
44 pub fn diff(&self, other: &EntitySchema<T>) -> Vec<FieldSchema> {
45 self.fields
46 .values()
47 .filter(|v| !other.fields.contains_key(&v.field_type))
48 .cloned()
49 .collect()
50 }
51}
52
53impl From<EntitySchema<Single>> for EntitySchema<Complete> {
54 fn from(schema: EntitySchema<Single>) -> Self {
55 Self {
56 entity_type: schema.entity_type,
57 inherit: schema.inherit,
58 fields: schema.fields,
59 _marker: std::marker::PhantomData,
60 }
61 }
62}