Skip to content

Commit 0fb4018

Browse files
authored
Standardize on world selection throughout tooling (#505)
This updates to use `Resolve::select_world` which was added to `wit-parser` from #494.
1 parent 271e1b6 commit 0fb4018

File tree

6 files changed

+16
-100
lines changed

6 files changed

+16
-100
lines changed

Cargo.lock

Lines changed: 2 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ indexmap = "1.9.1"
3232
wasm-encoder = "0.24.0"
3333
wasm-metadata = "0.2.0"
3434
wat = "1.0.59"
35-
wit-parser = "0.6.0"
35+
wit-parser = "0.6.1"
3636
wit-component = "0.7.0"
3737

3838
wit-bindgen-core = { path = 'crates/bindgen-core', version = '0.3.0' }

crates/guest-rust-macro/src/lib.rs

Lines changed: 9 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -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-
153116
impl Config {
154117
fn expand(self) -> Result<TokenStream> {
155118
let mut files = Default::default();

crates/test-helpers/src/lib.rs

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -135,11 +135,6 @@ fn parse_wit(path: &Path) -> (Resolve, WorldId) {
135135
)
136136
.unwrap()
137137
};
138-
let world = resolve.packages[pkg]
139-
.documents
140-
.iter()
141-
.filter_map(|(_, doc)| resolve.documents[*doc].default_world)
142-
.next()
143-
.expect("no `default world` found");
138+
let world = resolve.select_world(pkg, None).unwrap();
144139
(resolve, world)
145140
}

src/bin/wit-bindgen.rs

Lines changed: 2 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
use anyhow::{anyhow, bail, Context, Result};
1+
use anyhow::{bail, Context, Result};
22
use clap::Parser;
33
use std::path::PathBuf;
44
use std::str;
@@ -142,44 +142,7 @@ fn gen_world(
142142
&Default::default(),
143143
)?
144144
};
145-
let world = match &opts.world {
146-
Some(world) => {
147-
let mut parts = world.splitn(2, '.');
148-
let doc = parts.next().unwrap();
149-
let world = parts.next();
150-
let doc = *resolve.packages[pkg]
151-
.documents
152-
.get(doc)
153-
.ok_or_else(|| anyhow!("no document named `{doc}` in package"))?;
154-
match world {
155-
Some(name) => *resolve.documents[doc]
156-
.worlds
157-
.get(name)
158-
.ok_or_else(|| anyhow!("no world named `{name}` in document"))?,
159-
None => resolve.documents[doc]
160-
.default_world
161-
.ok_or_else(|| anyhow!("no default world in document"))?,
162-
}
163-
}
164-
None => {
165-
if resolve.packages[pkg].documents.is_empty() {
166-
bail!("no documents found in package")
167-
}
168-
169-
let mut unique_default_world = None;
170-
for (_name, doc) in &resolve.documents {
171-
if let Some(default_world) = doc.default_world {
172-
if unique_default_world.is_some() {
173-
bail!("multiple default worlds found in package, specify which to bind with `--world` argument")
174-
} else {
175-
unique_default_world = Some(default_world);
176-
}
177-
}
178-
}
179-
180-
unique_default_world.ok_or_else(|| anyhow!("no default world in package"))?
181-
}
182-
};
145+
let world = resolve.select_world(pkg, opts.world.as_deref())?;
183146
generator.generate(&resolve, world, files);
184147
Ok(())
185148
}

tests/runtime/main.rs

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -76,12 +76,7 @@ fn tests(name: &str) -> Result<Vec<PathBuf>> {
7676

7777
let mut resolve = Resolve::new();
7878
let (pkg, _files) = resolve.push_dir(&dir).unwrap();
79-
let world = resolve.packages[pkg]
80-
.documents
81-
.iter()
82-
.filter_map(|(_, doc)| resolve.documents[*doc].default_world)
83-
.next()
84-
.expect("no default world found");
79+
let world = resolve.select_world(pkg, None).unwrap();
8580

8681
let mut rust = Vec::new();
8782
let mut c = Vec::new();

0 commit comments

Comments
 (0)