qlib_rs/data/
entity_schema.rs

1use 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}