@@ -9,18 +9,98 @@ pub fn expand_derive(input: &syn::DeriveInput) -> Result<TokenStream, Vec<syn::E
99 } ;
1010
1111 let mut token_stream: TokenStream = TokenStream :: default ( ) ;
12+ token_stream. extend ( make_helper_funcs_token_stream ( & cont) ) ;
1213 token_stream. extend ( make_to_node_data_token_stream ( & cont) ) ;
1314
1415 if let Some ( get_value_token_stream) = make_get_set_value_token_steam ( & cont) {
1516 token_stream. extend ( get_value_token_stream) ;
1617 }
1718
19+ token_stream. extend ( make_alter_children_token_stream ( & ast_result, & cont) ) ;
1820 ast_result. check ( ) ?;
1921 Ok ( token_stream)
2022}
2123
22- pub fn make_alter_children_token_stream ( ast : & ASTContainer ) -> TokenStream {
24+ pub fn make_helper_funcs_token_stream ( ast : & ASTContainer ) -> TokenStream {
2325 let mut token_streams = TokenStream :: default ( ) ;
26+ let struct_ident = & ast. ident ;
27+ token_streams. extend ( quote ! {
28+ impl #struct_ident {
29+ pub fn get_path( & self ) -> Path {
30+ self . tree. read( ) . path_from_node_id( self . node_id. clone( ) )
31+ }
32+ }
33+ } ) ;
34+ token_streams
35+ }
36+
37+ pub fn make_alter_children_token_stream ( ast_result : & ASTResult , ast : & ASTContainer ) -> TokenStream {
38+ let mut token_streams = TokenStream :: default ( ) ;
39+ let children_fields = ast
40+ . data
41+ . all_fields ( )
42+ . filter ( |field| field. node_attrs . has_child )
43+ . collect :: < Vec < & ASTField > > ( ) ;
44+
45+ if !children_fields. is_empty ( ) {
46+ let struct_ident = & ast. ident ;
47+ if children_fields. len ( ) > 1 {
48+ ast_result. error_spanned_by ( struct_ident, "Only one children property" ) ;
49+ return token_streams;
50+ }
51+ let children_field = children_fields. first ( ) . unwrap ( ) ;
52+ let field_name = children_field. name ( ) . unwrap ( ) ;
53+ eprintln ! ( "😄 {:?} {:?}" , struct_ident, field_name) ;
54+ let child_name = children_field. node_attrs . child_name . as_ref ( ) . unwrap ( ) ;
55+ let get_func_name = format_ident ! ( "get_{}" , child_name. value( ) ) ;
56+ let get_mut_func_name = format_ident ! ( "get_mut_{}" , child_name. value( ) ) ;
57+ let add_func_name = format_ident ! ( "add_{}" , child_name. value( ) ) ;
58+ let remove_func_name = format_ident ! ( "remove_{}" , child_name. value( ) ) ;
59+ let ty = children_field. bracket_inner_ty . as_ref ( ) . unwrap ( ) . clone ( ) ;
60+
61+ token_streams. extend ( quote ! {
62+ impl #struct_ident {
63+ pub fn #get_func_name( & self , id: & str ) -> Option <& #ty> {
64+ self . #field_name. iter( ) . find( |element| element. id == id)
65+ }
66+
67+ pub fn #get_mut_func_name( & mut self , id: & str ) -> Option <& mut #ty> {
68+ self . #field_name. iter_mut( ) . find( |element| element. id == id)
69+ }
70+
71+ pub fn #remove_func_name( & mut self , id: & str ) {
72+ if let Some ( index) = self . #field_name. iter( ) . position( |element| element. id == id) {
73+ let element = self . #field_name. remove( index) ;
74+ let element_path = element. get_path( ) ;
75+
76+ let mut write_guard = self . tree. write( ) ;
77+ let mut nodes = vec![ ] ;
78+ if let Some ( node_data) = write_guard. get_node_data( element. node_id. clone( ) ) {
79+ nodes. push( node_data) ;
80+ }
81+ let _ = write_guard. apply_op( NodeOperation :: Delete {
82+ path: element_path,
83+ nodes,
84+ } ) ;
85+ }
86+ }
87+
88+ pub fn #add_func_name( & mut self , value: #ty) {
89+ let mut transaction = Transaction :: new( ) ;
90+ let parent_path = self . get_path( ) ;
91+ let path = parent_path. clone_with( self . #field_name. len( ) ) ;
92+ let node_data = value. to_node_data( ) ;
93+ transaction. push_operation( NodeOperation :: Insert {
94+ path,
95+ nodes: vec![ node_data] ,
96+ } ) ;
97+
98+ let _ = self . tree. write( ) . apply_transaction( transaction) ;
99+ self . #field_name. push( value) ;
100+ }
101+ }
102+ } ) ;
103+ }
24104
25105 token_streams
26106}
@@ -35,7 +115,7 @@ pub fn make_to_node_data_token_stream(ast: &ASTContainer) -> TokenStream {
35115 let set_key_values = ast
36116 . data
37117 . all_fields ( )
38- . filter ( |field| !field. node_attrs . is_children )
118+ . filter ( |field| !field. node_attrs . has_child )
39119 . flat_map ( |field| {
40120 let mut field_name = field. name ( ) . expect ( "the name of the field should not be empty" ) ;
41121 let original_field_name = field. name ( ) . expect ( "the name of the field should not be empty" ) ;
@@ -51,7 +131,7 @@ pub fn make_to_node_data_token_stream(ast: &ASTContainer) -> TokenStream {
51131 let children_fields = ast
52132 . data
53133 . all_fields ( )
54- . filter ( |field| field. node_attrs . is_children )
134+ . filter ( |field| field. node_attrs . has_child )
55135 . collect :: < Vec < & ASTField > > ( ) ;
56136
57137 let childrens_token_streams = match children_fields. is_empty ( ) {
@@ -72,8 +152,8 @@ pub fn make_to_node_data_token_stream(ast: &ASTContainer) -> TokenStream {
72152 } ;
73153
74154 token_streams. extend ( quote ! {
75- impl #struct_ident {
76- pub fn to_node_data( & self ) -> NodeData {
155+ impl ToNodeData for #struct_ident {
156+ fn to_node_data( & self ) -> NodeData {
77157 #childrens_token_streams
78158
79159 let builder = NodeDataBuilder :: new( #node_type)
@@ -94,7 +174,7 @@ pub fn make_get_set_value_token_steam(ast: &ASTContainer) -> Option<TokenStream>
94174
95175 let tree = format_ident ! ( "tree" ) ;
96176 for field in ast. data . all_fields ( ) {
97- if field. node_attrs . is_children {
177+ if field. node_attrs . has_child {
98178 continue ;
99179 }
100180
@@ -113,7 +193,7 @@ pub fn make_get_set_value_token_steam(ast: &ASTContainer) -> Option<TokenStream>
113193 token_streams. extend ( quote ! {
114194 impl #struct_ident {
115195 pub fn #get_func_name( & self ) -> Option <#get_value_return_ty> {
116- #get_value_with_fn( self . #tree. clone( ) , & self . path , #field_name_str)
196+ #get_value_with_fn( self . #tree. clone( ) , & self . node_id , #field_name_str)
117197 }
118198 }
119199 } ) ;
@@ -123,12 +203,11 @@ pub fn make_get_set_value_token_steam(ast: &ASTContainer) -> Option<TokenStream>
123203 token_streams. extend ( quote ! {
124204 impl #struct_ident {
125205 pub fn #set_func_name( & self , value: #set_value_input_ty) {
126- let _ = #set_value_with_fn( self . #tree. clone( ) , & self . path , #field_name_str, value) ;
206+ let _ = #set_value_with_fn( self . #tree. clone( ) , & self . node_id , #field_name_str, value) ;
127207 }
128208 }
129209 } ) ;
130210 }
131211 }
132- ast. data . all_fields ( ) . for_each ( |field| { } ) ;
133212 Some ( token_streams)
134213}
0 commit comments