taitan_orm_parser/info_parser/
field_parser.rs

1use crate::attr_parser::AttrParser;
2use crate::field_def::TableColumnDef;
3
4use std::borrow::Cow;
5use syn::{Attribute, Field};
6
7// pub struct FieldParser;
8// impl FieldParser {
9//     pub fn parse(
10//         field: &Field,
11//         is_enum_variant: bool,
12//         unnamed_idx: Option<usize>,
13//         external_column_name: Option<String>,
14//     ) -> FieldDef<'_> {
15//         let struct_field = ParsedField::parse(field, is_enum_variant, unnamed_idx);
16//         let table_column = FieldAttrParser::parse(field, external_column_name);
17//         FieldDef {
18//             struct_field,
19//             table_column,
20//         }
21//     }
22// }
23
24pub struct FieldAttrParser;
25impl FieldAttrParser {
26    // use this function will raise lifetime error
27    // fn extract_single_value<'a>(attrs: &'a Vec<NamedAttribute>, name: &'a str)-> Option<Cow<'a, str>> {
28    //     let attr_opt = attrs.iter().find(|a| a.name == Cow::Borrowed(name));
29    //     attr_opt.map(|a|a.values[0].clone())
30    // }
31
32    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}