taitan_orm_parser/
table_def.rs

1use crate::attr_parser::{NamedAttribute, NamedAttributes};
2use crate::field_def::FieldDef;
3use crate::info_parser::schema_parser::SchemaParser;
4use serde::{Deserialize, Serialize};
5use std::borrow::Cow;
6use syn::DeriveInput;
7
8#[derive(Debug, PartialEq, Clone, Default)]
9pub struct TableDef<'a> {
10    pub struct_name: Cow<'a, str>,
11    pub table_name: Cow<'a, str>,
12    pub fields: Vec<FieldDef<'a>>,
13    pub serde_structs: Vec<Cow<'a, str>>,
14    pub primary_fields: Vec<Cow<'a, str>>,
15    pub uniques: Vec<NamedFieldsGroup<'a>>,
16    pub indexes: Vec<NamedFieldsGroup<'a>>,
17}
18
19impl<'a> TableDef<'a> {
20    pub fn parse(input: &'a DeriveInput) -> TableDef<'a> {
21        SchemaParser::parse(&input)
22    }
23
24    pub fn get_primary_fields(&'a self) -> Vec<&'a FieldDef<'a>> {
25        self.filter(&self.primary_fields)
26    }
27
28    pub fn get_not_primary_fields(&'a self) -> Vec<&'a FieldDef<'a>> {
29        self.filter_not_in(&self.primary_fields)
30    }
31
32    pub fn get_unique_names(&'a self) -> Vec<Cow<'a, str>> {
33        self.uniques.iter().map(|u| u.name.clone()).collect()
34    }
35
36    pub fn get_index_names(&'a self) -> Vec<Cow<'a, str>> {
37        self.indexes.iter().map(|u| u.name.clone()).collect()
38    }
39
40    pub fn get_unique_fields(&'a self, name: &str) -> Vec<&'a FieldDef<'a>> {
41        let unique = self.uniques.iter().find(|u| u.name == name);
42        if let Some(unique) = unique {
43            self.filter(&unique.fields)
44        } else {
45            Vec::new()
46        }
47    }
48
49    pub fn get_index_fields(&'a self, name: &str) -> Vec<&'a FieldDef<'a>> {
50        let index = self.indexes.iter().find(|u| u.name == name);
51        if let Some(index) = index {
52            self.filter(&index.fields)
53        } else {
54            Vec::new()
55        }
56    }
57
58    fn filter(&'a self, names: &[Cow<'a, str>]) -> Vec<&'a FieldDef<'a>> {
59        self.fields
60            .iter()
61            .filter(|f| names.iter().any(|a| a == f.origin_column_name()))
62            .collect::<Vec<_>>()
63    }
64
65    fn filter_not_in(&'a self, names: &[Cow<'a, str>]) -> Vec<&'a FieldDef<'a>> {
66        self.fields
67            .iter()
68            .filter(|f| names.iter().all(|a| a != f.origin_column_name()))
69            .collect::<Vec<_>>()
70    }
71}
72
73#[derive(Debug, PartialEq, Clone, Default, Serialize, Deserialize)]
74pub struct NamedFieldsGroup<'a> {
75    pub name: Cow<'a, str>,
76    pub fields: Vec<Cow<'a, str>>,
77}
78
79pub fn translate_attr_groups(attrs: NamedAttributes) -> Vec<NamedFieldsGroup> {
80    let mut groups: Vec<NamedFieldsGroup> = vec![];
81    for attr in attrs.attrs.iter() {
82        let mut named = NamedFieldsGroup::default();
83        named.name = attr.name.clone();
84        named.fields = attr.values.clone();
85        groups.push(named);
86    }
87    groups
88}
89
90impl<'a> From<NamedAttribute<'a>> for NamedFieldsGroup<'a> {
91    fn from(attr: NamedAttribute<'a>) -> NamedFieldsGroup<'a> {
92        NamedFieldsGroup {
93            name: attr.name,
94            fields: attr.values,
95        }
96    }
97}
98
99// impl<'a> NamedFieldsGroup<'a> {
100//
101//     pub fn new_indexes(fields: &'a [FieldDef<'a>], attrs_vec: &'a [NamedAttributes]) -> Vec<Self> {
102//         attrs_vec.iter().map(|attrs| Self::new_index(fields, attrs)).collect()
103//     }
104//     pub fn new_index(fields: &'a [FieldDef<'a>], attrs: &'a NamedAttributes) -> Self {
105//         let mut group = NamedFieldsGroup::default();
106//         Self::build_index_from_attrs(&mut group, fields, attrs);
107//         group
108//     }
109//
110//     pub fn new(fields: &'a [FieldDef<'a>], attr: &'a NamedAttribute) -> Self {
111//         let mut group = NamedFieldsGroup::default();
112//         Self::build_index_from_attr(&mut group, fields, attr);
113//         group
114//     }
115//     fn build_index_from_attrs(named: &mut NamedFieldsGroup<'a>, fields: &'a [FieldDef<'a>], attrs: &'a NamedAttributes) {
116//         for attr in attrs.attrs.iter() {
117//             if attr.name == "name" {
118//                 named.name = attr.values.get(0).unwrap().clone();
119//             }
120//             if attr.name == "fields" {
121//                 let field_defs = fields
122//                     .iter()
123//                     .filter(|f| attr.values.iter().any(|a| a == f.column_name()))
124//                     .collect::<Vec<_>>();
125//                 named.fields = field_defs
126//             }
127//         }
128//     }
129//
130//     fn build_index_from_attr(named: &mut NamedFieldsGroup<'a>, fields: &'a [FieldDef<'a>], attr: &'a NamedAttribute) {
131//         let field_defs = fields
132//             .iter()
133//             .filter(|f| attr.values.iter().any(|a| a == f.column_name()))
134//             .collect::<Vec<_>>();
135//         named.fields = field_defs
136//     }
137// }