taitan_orm_parser/
table_def.rs1use 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