1+ use proc_macro2:: Span ;
2+ use quote:: ToTokens ;
13use syn:: parse:: { Parse , ParseStream } ;
24use syn:: punctuated:: Punctuated ;
35use syn:: token:: { Comma , Gt , Lt } ;
4- use syn:: Ident ;
6+ use syn:: { Error , Ident } ;
7+
8+ use crate :: derive_component:: entry:: Entries ;
59
610pub struct ComponentSpec {
711 pub provider_name : Ident ,
@@ -10,7 +14,60 @@ pub struct ComponentSpec {
1014 pub component_params : Punctuated < Ident , Comma > ,
1115}
1216
17+ pub struct ComponentNameSpec {
18+ pub component_name : Ident ,
19+ pub component_params : Punctuated < Ident , Comma > ,
20+ }
21+
1322impl Parse for ComponentSpec {
23+ fn parse ( input : ParseStream ) -> syn:: Result < Self > {
24+ let Entries { entries } = input. parse ( ) ?;
25+
26+ let context_type: Ident = {
27+ let raw_context_type = entries. get ( & Ident :: new ( "context" , Span :: call_site ( ) ) ) ;
28+
29+ if let Some ( context_type) = raw_context_type {
30+ syn:: parse2 ( context_type. to_token_stream ( ) ) ?
31+ } else {
32+ Ident :: new ( "Context" , Span :: call_site ( ) )
33+ }
34+ } ;
35+
36+ let provider_name: Ident = {
37+ let raw_provider_name = entries
38+ . get ( & Ident :: new ( "provider" , Span :: call_site ( ) ) )
39+ . ok_or_else ( || Error :: new ( input. span ( ) , "expect provider name to be given" ) ) ?;
40+
41+ syn:: parse2 ( raw_provider_name. to_token_stream ( ) ) ?
42+ } ;
43+
44+ let ( component_name, component_params) = {
45+ let raw_component_name = entries. get ( & Ident :: new ( "name" , Span :: call_site ( ) ) ) ;
46+
47+ if let Some ( raw_component_name) = raw_component_name {
48+ let ComponentNameSpec {
49+ component_name,
50+ component_params,
51+ } = syn:: parse2 ( raw_component_name. to_token_stream ( ) ) ?;
52+ ( component_name, component_params)
53+ } else {
54+ (
55+ Ident :: new ( & format ! ( "{}Component" , provider_name) , provider_name. span ( ) ) ,
56+ Punctuated :: default ( ) ,
57+ )
58+ }
59+ } ;
60+
61+ Ok ( ComponentSpec {
62+ component_name,
63+ provider_name,
64+ context_type,
65+ component_params,
66+ } )
67+ }
68+ }
69+
70+ impl Parse for ComponentNameSpec {
1471 fn parse ( input : ParseStream ) -> syn:: Result < Self > {
1572 let component_name: Ident = input. parse ( ) ?;
1673
@@ -27,20 +84,8 @@ impl Parse for ComponentSpec {
2784 Punctuated :: default ( )
2885 } ;
2986
30- let _: Comma = input. parse ( ) ?;
31-
32- let provider_name: Ident = input. parse ( ) ?;
33-
34- let _: Lt = input. parse ( ) ?;
35-
36- let context_type: Ident = input. parse ( ) ?;
37-
38- let _: Gt = input. parse ( ) ?;
39-
40- Ok ( ComponentSpec {
87+ Ok ( Self {
4188 component_name,
42- provider_name,
43- context_type,
4489 component_params,
4590 } )
4691 }
0 commit comments