1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90
use quote::quote; use super::{Entity, EntityType}; pub fn file_parser(file: syn::File) -> Vec<Entity> { let mut entities: Vec<Entity> = vec![]; for item in file.items { match item { syn::Item::Enum(_item) => (), syn::Item::Struct(item) => { entities.push(struct_parser(item)); } _ => (), } } entities } fn struct_parser(item: syn::ItemStruct) -> Entity { let name = item.ident.to_string(); let fields = fields_parser(item.fields); Entity { entity_type: EntityType::Struct, name, fields, } } fn fields_parser(item: syn::Fields) -> Vec<Entity> { match item { syn::Fields::Named(syn::FieldsNamed { named: fields, .. }) => { fields.into_iter().map(field_parser).collect() } _ => vec![], } } fn field_parser(field: syn::Field) -> Entity { let name = field .ident .map(|ident| ident.to_string()) .unwrap_or_else(|| "".to_string()); if has_dependencies(&type_parser(field.ty.clone())) { let fields = make_dependencies(&type_parser(field.ty.clone())); return Entity::new( EntityType::Field(name), &type_parser(field.ty), vec![fields], ); } Entity::new(EntityType::Field(name), &type_parser(field.ty), Vec::new()) } fn type_parser(type_: syn::Type) -> String { let type_name = quote!(#type_); type_name .to_string() .chars() .filter(|c| *c != ' ') .collect() } fn has_dependencies(type_name: &str) -> bool { let cnt = type_name .chars() .filter(|x| (*x == ',') || (*x == '<') || (*x == '>')) .count(); if cnt != 0 { return true; } false } fn make_dependencies(type_name: &str) -> Entity { let dependencies: Vec<&str> = type_name .split(|x| (x == ',') || (x == '<') || (x == '>')) .collect(); let dependencies = dependencies .into_iter() .map(|x| x.to_string()) .filter(|x| x != "") .map(|x| x.replace(" ", "")) .collect::<Vec<String>>(); let dependencies = dependencies .into_iter() .map(|x| Entity::new(EntityType::Field("".to_string()), &x, Vec::new())) .collect::<Vec<Entity>>(); Entity::new(EntityType::Struct, type_name, dependencies) }