taitan_orm_parser/info_parser/
field_parser.rs1use crate::attr_parser::AttrParser;
2use crate::field_def::TableColumnDef;
3
4use std::borrow::Cow;
5use syn::{Attribute, Field};
6
7pub struct FieldAttrParser;
25impl FieldAttrParser {
26 pub fn parse<'a>(field: &'a Field, external_column_name: Option<String>) -> TableColumnDef<'a> {
33 let field_attr = AttrParser::get_attr(&field.attrs, "field");
34 let mut table_column_def: TableColumnDef = if let Some(attr) = field_attr {
35 FieldAttrParser::parse_field_attr(&attr)
36 } else {
37 TableColumnDef::default()
38 };
39 if let Some(column_name) = external_column_name {
40 if table_column_def.name.is_none() {
41 table_column_def.name = Some(Cow::Owned(column_name));
42 }
43 }
44 table_column_def
45 }
46
47 fn parse_bool(value: Option<Cow<'_, str>>) -> bool {
48 if let Some(value) = value {
49 value == "true"
50 } else {
51 false
52 }
53 }
54
55 pub fn parse_field_attr<'a>(attr: &'a Attribute) -> TableColumnDef<'a> {
56 if !AttrParser::is_attr(attr, "field") {
57 panic!("attribute is not named as #[field]")
58 }
59 let named_attrs = AttrParser::parse_list(attr);
60 let name_attr = named_attrs.iter().find(|a| a.name == Cow::Borrowed("name"));
61 let name = name_attr.map(|a| a.values[0].clone());
62
63 let name_attr = named_attrs
64 .iter()
65 .find(|a| a.name == Cow::Borrowed("column_type"));
66 let column_type = name_attr.map(|a| a.values[0].clone());
67
68 let default_attr = named_attrs
69 .iter()
70 .find(|a| a.name == Cow::Borrowed("default_value"));
71 let default_value = default_attr.map(|a| a.values[0].clone());
72
73 let generated_attr = named_attrs
74 .iter()
75 .find(|a| a.name == Cow::Borrowed("generated"));
76 let generated = generated_attr.map(|a| a.values[0].clone());
77
78 let nullable_attr = named_attrs
79 .iter()
80 .find(|a| a.name == Cow::Borrowed("nullable"));
81 let nullable_opt = nullable_attr.map(|a| a.values[0].clone());
82 let nullable = Self::parse_bool(nullable_opt);
83
84 let auto_inc_attr = named_attrs
85 .iter()
86 .find(|a| a.name == Cow::Borrowed("auto_inc"));
87 let auto_inc_opt = auto_inc_attr.map(|a| a.values[0].clone());
88 let auto_inc = Self::parse_bool(auto_inc_opt);
89
90 TableColumnDef {
91 name,
92 column_type,
93 default_value,
94 nullable,
95 generated,
96 auto_inc,
97 }
98 }
99}