taitan-orm-parser 0.1.12

Next Generation ORM based on sqlx
Documentation
use std::borrow::{Borrow, Cow};
use syn::{parse_quote, DeriveInput, Field};
use taitan_orm_parser::{
    FieldDef, FieldName, InputParser, NamedVariant, ParsedField, TableColumnDef,
};

#[test]
pub fn enum_parser_spec_001() {
    let input: DeriveInput = parse_quote! {
        enum Foo<'a, 'b> {
            A(&'a str),
            B(Cow<'b, str>),
            C(Option<Expr<Cow<'b, str>>>),
            D(Uuid)
        }
    };
    let variants = InputParser::get_enum_variant(&input.data).unwrap();

    let expect_struct_field = ParsedField {
        name: FieldName::unnamed(0),
        rust_type: Cow::Borrowed("& 'a str"),
        option_nest_level: 0,
        is_location_expr: false,
        is_enum_variant: true,
        lifetime: Some(Cow::Borrowed("'a")),
        origin_field: variants.get(0).unwrap().fields.first().unwrap().clone(),
    };

    let field = variants.get(0).unwrap();
    let actual_field_def = FieldDef::parse(field.fields.first().unwrap(), true, Some(0), None);
    assert_eq!(field.name, "A");
    assert_eq!(actual_field_def.struct_field, expect_struct_field);

    let expect_struct_field = ParsedField {
        name: FieldName::unnamed(1),
        rust_type: Cow::Borrowed("Cow < 'b , str >"),
        option_nest_level: 0,
        is_location_expr: false,
        is_enum_variant: true,
        lifetime: Some(Cow::Borrowed("'b")),
        origin_field: variants.get(1).unwrap().fields.first().unwrap().clone(),
    };
    let field = variants.get(1).unwrap();
    let actual_field_def = FieldDef::parse(field.fields.first().unwrap(), true, Some(1), None);
    assert_eq!(field.name, "B");
    assert_eq!(actual_field_def.struct_field, expect_struct_field);

    let field = variants.get(2).unwrap();
    let actual_field_def = FieldDef::parse(field.fields.first().unwrap(), true, Some(2), None);
    let expect_struct_field = ParsedField {
        name: FieldName::unnamed(2),
        rust_type: Cow::Borrowed("Expr < Cow < 'b , str > >"),
        option_nest_level: 1,
        is_location_expr: true,
        is_enum_variant: true,
        lifetime: Some(Cow::Borrowed("'b")),
        origin_field:(variants.get(2).unwrap().fields.first().unwrap().clone()),
    };
    assert_eq!(field.name, "C");
    assert_eq!(actual_field_def.struct_field, expect_struct_field);

    let field = variants.get(3).unwrap();
    let actual_field_def = FieldDef::parse(field.fields.first().unwrap(), true, Some(3), None);
    let expect_struct_field = ParsedField {
        name: FieldName::unnamed(3),
        rust_type: Cow::Borrowed("Uuid"),
        option_nest_level: 0,
        is_location_expr: false,
        is_enum_variant: true,
        lifetime: None,
        origin_field:variants.get(3).unwrap().fields.first().unwrap().clone(),
    };
    assert_eq!(field.name, "D");
    assert_eq!(actual_field_def.struct_field, expect_struct_field);
}

#[test]
pub fn enum_parser_spec_002() {
    let input: DeriveInput = parse_quote! {
        enum Foo<'a, 'b> {
            A { f1: &'a str, f2: Cow<'b, str>, f3: String },
        }
    };
    let variants = InputParser::get_enum_variant(&input.data).unwrap();

    let field = variants.get(0).unwrap();
    assert_eq!(field.name, "A");

    let actual_field_def = FieldDef::parse(field.fields.get(0).unwrap(), true, None, None);
    let expect_struct_field = ParsedField {
        name: FieldName::named("f1"),
        rust_type: Cow::Borrowed("& 'a str"),
        option_nest_level: 0,
        is_location_expr: false,
        is_enum_variant: true,
        lifetime: Some(Cow::Borrowed("'a")),
        origin_field: variants.first().unwrap().fields.get(0).cloned().unwrap(),
    };
    assert_eq!(actual_field_def.struct_field, expect_struct_field);

    let actual_field_def = FieldDef::parse(field.fields.get(1).unwrap(), true, None, None);
    let expect_struct_field = ParsedField {
        name: FieldName::named("f2"),
        rust_type: Cow::Borrowed("Cow < 'b , str >"),
        option_nest_level: 0,
        is_location_expr: false,
        is_enum_variant: true,
        lifetime: Some(Cow::Borrowed("'b")),
        origin_field: variants.first().unwrap().fields.get(1).cloned().unwrap(),
    };
    assert_eq!(actual_field_def.struct_field, expect_struct_field);

    let actual_field_def = FieldDef::parse(field.fields.get(2).unwrap(), true, None, None);
    let expect_struct_field = ParsedField {
        name: FieldName::named("f3"),
        rust_type: Cow::Borrowed("String"),
        option_nest_level: 0,
        is_location_expr: false,
        is_enum_variant: true,
        lifetime: None,
        origin_field: variants.first().unwrap().fields.get(2).cloned().unwrap(),
    };
    assert_eq!(actual_field_def.struct_field, expect_struct_field);
}

#[test]
pub fn enum_parser_spec_003() {
    let input: DeriveInput = parse_quote! {
        enum Foo<'a, 'b> {
            A {
                #[field(name = user_name1, column_type = VARCHAR, nullable = true, auto_inc = true)]
                f1: &'a str,

                #[field(name = user_name2, column_type = VARCHAR, nullable = true, auto_inc = false)]
                f2: Cow<'b, str>,

                f3: String
            },
        }
    };
    let variants = InputParser::get_enum_variant(&input.data).unwrap();

    let field = variants.get(0).unwrap();
    assert_eq!(field.name, "A");

    let actual_field_def = FieldDef::parse(field.fields.get(0).unwrap(), true, None, None);
    let expect_struct_field = ParsedField {
        name: FieldName::named("f1"),
        rust_type: Cow::Borrowed("& 'a str"),
        option_nest_level: 0,
        is_location_expr: false,
        is_enum_variant: true,
        lifetime: Some(Cow::Borrowed("'a")),
        origin_field: variants.first().unwrap().fields.get(0).cloned().unwrap(),
    };
    let expect_column_field = TableColumnDef {
        name: Some(Cow::Borrowed("user_name1")),
        column_type: Some(Cow::Borrowed("VARCHAR")),
        default_value: None,
        generated: None,
        nullable: true,
        auto_inc: true,
    };
    assert_eq!(actual_field_def.struct_field, expect_struct_field);
    assert_eq!(actual_field_def.table_column, expect_column_field);

    let actual_field_def = FieldDef::parse(field.fields.get(1).unwrap(), true, None, None);
    let expect_struct_field = ParsedField {
        name: FieldName::named("f2"),
        rust_type: Cow::Borrowed("Cow < 'b , str >"),
        option_nest_level: 0,
        is_location_expr: false,
        is_enum_variant: true,
        lifetime: Some(Cow::Borrowed("'b")),
        origin_field: variants.first().unwrap().fields.get(1).cloned().unwrap(),
    };
    assert_eq!(actual_field_def.struct_field, expect_struct_field);

    let actual_field_def = FieldDef::parse(field.fields.get(2).unwrap(), true, None, None);
    let expect_struct_field = ParsedField {
        name: FieldName::named("f3"),
        rust_type: Cow::Borrowed("String"),
        option_nest_level: 0,
        is_location_expr: false,
        is_enum_variant: true,
        lifetime: None,
        origin_field: variants.first().unwrap().fields.get(2).cloned().unwrap(),
    };
    assert_eq!(actual_field_def.struct_field, expect_struct_field);
}

#[test]
pub fn enum_parser_spec_004() {
    let input: DeriveInput = parse_quote! {
        enum Foo<'a, 'b> {
            A(
                #[field(name = user_name1, column_type = VARCHAR, nullable = true, auto_inc = true)]
                &'a str
            )
        }
    };
    let variants = InputParser::get_enum_variant(&input.data).unwrap();

    let field = variants.get(0).unwrap();
    assert_eq!(field.name, "A");

    let actual_field_def = FieldDef::parse(field.fields.get(0).unwrap(), true, Some(0), None);
    let expect_struct_field = ParsedField {
        name: FieldName::default(),
        rust_type: Cow::Borrowed("& 'a str"),
        option_nest_level: 0,
        is_location_expr: false,
        is_enum_variant: true,
        lifetime: Some(Cow::Borrowed("'a")),
        origin_field: variants.first().unwrap().fields.get(0).unwrap().clone(),
    };
    let expect_column_field = TableColumnDef {
        name: Some(Cow::Borrowed("user_name1")),
        column_type: Some(Cow::Borrowed("VARCHAR")),
        default_value: None,
        generated: None,
        nullable: true,
        auto_inc: true,
    };
    assert_eq!(actual_field_def.struct_field, expect_struct_field);
    assert_eq!(actual_field_def.table_column, expect_column_field);
}