@@ -33,11 +33,10 @@ impl Parse for Config {
3333 let mut world = None ;
3434 let mut source = None ;
3535
36- let document = if input. peek ( token:: Brace ) {
36+ if input. peek ( token:: Brace ) {
3737 let content;
3838 syn:: braced!( content in input) ;
3939 let fields = Punctuated :: < Opt , Token ! [ , ] > :: parse_terminated ( & content) ?;
40- let mut document = None ;
4140 for field in fields. into_pairs ( ) {
4241 match field. into_value ( ) {
4342 Opt :: Path ( s) => {
@@ -47,10 +46,10 @@ impl Parse for Config {
4746 source = Some ( Source :: Path ( s. value ( ) ) ) ;
4847 }
4948 Opt :: World ( s) => {
50- if document . is_some ( ) {
51- return Err ( Error :: new ( s. span ( ) , "cannot specify second document " ) ) ;
49+ if world . is_some ( ) {
50+ return Err ( Error :: new ( s. span ( ) , "cannot specify second world " ) ) ;
5251 }
53- document = Some ( parse_doc ( & s. value ( ) , & mut world ) ) ;
52+ world = Some ( s. value ( ) ) ;
5453 }
5554 Opt :: Inline ( s) => {
5655 if source. is_some ( ) {
@@ -67,43 +66,17 @@ impl Parse for Config {
6766 Opt :: Skip ( list) => opts. skip . extend ( list. iter ( ) . map ( |i| i. value ( ) ) ) ,
6867 }
6968 }
70- match ( document, & source) {
71- ( Some ( doc) , _) => doc,
72- ( None , Some ( Source :: Inline ( _) ) ) => "macro-input" . to_string ( ) ,
73- _ => {
74- return Err ( Error :: new (
75- call_site,
76- "must specify a `world` to generate bindings for" ,
77- ) )
78- }
79- }
8069 } else {
81- let document = input. parse :: < syn:: LitStr > ( ) ?;
70+ world = input. parse :: < Option < syn:: LitStr > > ( ) ?. map ( |s| s . value ( ) ) ;
8271 if input. parse :: < Option < syn:: token:: In > > ( ) ?. is_some ( ) {
8372 source = Some ( Source :: Path ( input. parse :: < syn:: LitStr > ( ) ?. value ( ) ) ) ;
8473 }
85- parse_doc ( & document. value ( ) , & mut world)
86- } ;
74+ }
8775 let ( resolve, pkg, files) =
8876 parse_source ( & source) . map_err ( |err| Error :: new ( call_site, format ! ( "{err:?}" ) ) ) ?;
89- let doc = resolve. packages [ pkg]
90- . documents
91- . get ( & document)
92- . copied ( )
93- . ok_or_else ( || {
94- Error :: new ( call_site, format ! ( "no document named `{document}` found" ) )
95- } ) ?;
96-
97- let world = match & world {
98- Some ( name) => resolve. documents [ doc]
99- . worlds
100- . get ( name)
101- . copied ( )
102- . ok_or_else ( || Error :: new ( call_site, format ! ( "no world named `{name}` found" ) ) ) ?,
103- None => resolve. documents [ doc] . default_world . ok_or_else ( || {
104- Error :: new ( call_site, format ! ( "no default world found in `{document}`" ) )
105- } ) ?,
106- } ;
77+ let world = resolve
78+ . select_world ( pkg, world. as_deref ( ) )
79+ . map_err ( |e| Error :: new ( call_site, format ! ( "{e:?}" ) ) ) ?;
10780 Ok ( Config {
10881 opts,
10982 resolve,
@@ -140,16 +113,6 @@ fn parse_source(source: &Option<Source>) -> anyhow::Result<(Resolve, PackageId,
140113 Ok ( ( resolve, pkg, files) )
141114}
142115
143- fn parse_doc ( s : & str , world : & mut Option < String > ) -> String {
144- match s. find ( '.' ) {
145- Some ( pos) => {
146- * world = Some ( s[ pos + 1 ..] . to_string ( ) ) ;
147- s[ ..pos] . to_string ( )
148- }
149- None => s. to_string ( ) ,
150- }
151- }
152-
153116impl Config {
154117 fn expand ( self ) -> Result < TokenStream > {
155118 let mut files = Default :: default ( ) ;
0 commit comments