Skip to content
This repository was archived by the owner on Oct 28, 2024. It is now read-only.

Commit 1184244

Browse files
authored
Generate additional features for new WAGI bindle handling (#18)
1 parent e1a226b commit 1184244

File tree

2 files changed

+92
-3
lines changed

2 files changed

+92
-3
lines changed

README.md

Lines changed: 23 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -79,53 +79,70 @@ bindleVersion = '1.0.0'
7979

8080
[bindle]
8181
name = 'birdsondemand'
82-
version = '1.2.3-ivan-2021.05.18.10.51.09.084'
82+
version = '1.2.3-ivan-2021.05.31.16.49.09.990'
8383
description = 'provides birds as a service'
8484
authors = ['Joan Q Programmer']
8585

8686
# Parcels representing handler WASM modules have a `requires` attribute
87+
# and a `wagi.route` feature
8788

8889
[[parcel]]
8990
[parcel.label]
9091
sha256 = '0a4346f806b28b3ce94905c3ac56fcd5ee2337d8613161696aba52eb0c3551cc'
9192
name = 'bin/penguin.wasm'
93+
[parcel.label.feature.wagi]
94+
file = 'false'
95+
route = '/birds/flightless'
9296
[parcel.conditions]
9397
requires = ['bin/penguin.wasm-files']
9498

9599
[[parcel]]
96100
[parcel.label]
97101
sha256 = '1f71511371129511321c45be058c60e23cf9ba898d8a3f3309555985b5027490'
98102
name = 'bin/cassowary.wasm'
103+
[parcel.label.feature.wagi]
104+
file = 'false'
105+
route = '/birds/irritable/fighty'
99106
[parcel.conditions]
100107
requires = ['bin/cassowary.wasm-files']
101108

102109
[[parcel]]
103110
[parcel.label]
104111
sha256 = 'bab02c178882085bf20defd15c0e8971edd95488a1ecb4a6273e6afcfb3c4030'
105112
name = 'bin/kea.wasm'
113+
[parcel.label.feature.wagi]
114+
file = 'false'
115+
route = '/birds/naughty'
106116
[parcel.conditions]
107117
requires = ['bin/kea.wasm-files']
108118

109-
# Parcels derived from `files` patterns have a `memberOf` attribute
119+
# Parcels derived from `files` patterns have a `memberOf` attribute and a
120+
# `wagi.file` feature of "true"
110121

111122
[[parcel]]
112123
[parcel.label]
113124
sha256 = 'e99f19705a23cbeeeade5d2b4f8b83fff09beb093552e82073cdb302ee10eb76'
114125
name = 'photo/adelie.png'
126+
[parcel.label.feature.wagi]
127+
file = 'true'
115128
[parcel.conditions]
116129
memberOf = ['bin/penguin.wasm-files']
117130

118131
[[parcel]]
119132
[parcel.label]
120133
sha256 = 'e8f7b60dfe5ee560edd1ac616463a0682a0e7c57a5ce2a8fe5c0990e500d0ac5'
121134
name = 'photo/rockhopper.png'
135+
[parcel.label.feature.wagi]
136+
file = 'true'
122137
[parcel.conditions]
123138
memberOf = ['bin/penguin.wasm-files']
124139

125140
[[parcel]]
126141
[parcel.label]
127142
sha256 = '843baaf5a63cbc38d4d4c00036b95e435254eece7480fb717c8a17dcdc2aeefc'
128143
name = 'stock/little-blue.jpg'
144+
[parcel.label.feature.wagi]
145+
file = 'true'
129146
[parcel.conditions]
130147
memberOf = ['bin/penguin.wasm-files']
131148

@@ -135,6 +152,8 @@ memberOf = ['bin/penguin.wasm-files']
135152
[parcel.label]
136153
sha256 = '6451ab5be799a6aa52ce8b8a084a12066bb2dd8e1a73a692627bb96b4b9a72f0'
137154
name = 'stock/wipers.jpg'
155+
[parcel.label.feature.wagi]
156+
file = 'true'
138157
[parcel.conditions]
139158
memberOf = [
140159
'bin/penguin.wasm-files',
@@ -145,6 +164,8 @@ memberOf = [
145164
[parcel.label]
146165
sha256 = '93c3a391d842e3b8032d560db4870b5426c5c05a9f2a60b187e567ae69d8e658'
147166
name = 'stock/kea.jpg'
167+
[parcel.label.feature.wagi]
168+
file = 'true'
148169
[parcel.conditions]
149170
memberOf = [
150171
'bin/penguin.wasm-files',

src/expander.rs

Lines changed: 69 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
1+
use std::collections::BTreeMap;
12
use std::convert::TryFrom;
3+
use std::iter::FromIterator;
24
use std::path::{Path, PathBuf};
35

46
use bindle::{BindleSpec, Condition, Group, Invoice, Label, Parcel};
@@ -128,6 +130,7 @@ fn expand_handler_modules_to_parcels(
128130
convert_one_match_to_parcel(
129131
PathBuf::from(expansion_context.to_absolute(&handler.name)),
130132
expansion_context,
133+
vec![("route", &handler.route), ("file", "false")],
131134
None,
132135
Some(&group_name(handler)),
133136
)
@@ -180,13 +183,17 @@ fn try_convert_one_match_to_parcel(
180183
) -> anyhow::Result<Parcel> {
181184
match path {
182185
Err(e) => Err(anyhow::Error::new(e)),
183-
Ok(path) => convert_one_match_to_parcel(path, expansion_context, Some(member_of), None),
186+
Ok(path) => {
187+
let features = vec![("file", "true")];
188+
convert_one_match_to_parcel(path, expansion_context, features, Some(member_of), None)
189+
}
184190
}
185191
}
186192

187193
fn convert_one_match_to_parcel(
188194
path: PathBuf,
189195
expansion_context: &ExpansionContext,
196+
wagi_features: Vec<(&str, &str)>,
190197
member_of: Option<&str>,
191198
requires: Option<&str>,
192199
) -> anyhow::Result<Parcel> {
@@ -204,12 +211,16 @@ fn convert_one_match_to_parcel(
204211
.first_or_octet_stream()
205212
.to_string();
206213

214+
// let features = vec![("route", route)];
215+
let feature = Some(wagi_feature_of(wagi_features));
216+
207217
Ok(Parcel {
208218
label: Label {
209219
name,
210220
sha256: digest_string,
211221
media_type,
212222
size,
223+
feature,
213224
..Label::default()
214225
},
215226
conditions: Some(Condition {
@@ -303,6 +314,17 @@ fn vector_of(option: Option<&str>) -> Option<Vec<String>> {
303314
option.map(|val| vec![val.to_owned()])
304315
}
305316

317+
fn wagi_feature_of(values: Vec<(&str, &str)>) -> BTreeMap<String, BTreeMap<String, String>> {
318+
BTreeMap::from_iter(vec![("wagi".to_owned(), feature_map_of(values))])
319+
}
320+
321+
fn feature_map_of(values: Vec<(&str, &str)>) -> BTreeMap<String, String> {
322+
values
323+
.into_iter()
324+
.map(|(k, v)| (k.to_owned(), v.to_owned()))
325+
.collect()
326+
}
327+
306328
#[cfg(test)]
307329
mod test {
308330
use std::str::FromStr;
@@ -332,6 +354,25 @@ mod test {
332354
.unwrap()
333355
}
334356

357+
fn parcel_feature_value<'a>(
358+
invoice: &'a Invoice,
359+
parcel_name: &str,
360+
feature_name: &str,
361+
item_name: &str,
362+
) -> &'a str {
363+
parcel_named(invoice, parcel_name)
364+
.label
365+
.feature
366+
.as_ref()
367+
.unwrap()
368+
.get(feature_name)
369+
.as_ref()
370+
.unwrap()
371+
.get(item_name)
372+
.as_ref()
373+
.unwrap()
374+
}
375+
335376
fn parcel_conditions<'a>(invoice: &'a Invoice, parcel_name: &str) -> &'a Condition {
336377
parcel_named(invoice, parcel_name)
337378
.conditions
@@ -356,6 +397,24 @@ mod test {
356397
assert_eq!("weather", invoice.bindle.id.name());
357398
}
358399

400+
#[test]
401+
fn test_route_is_mapped() {
402+
let invoice = expand_test_invoice("app1").unwrap();
403+
assert_eq!(
404+
"/fake",
405+
parcel_feature_value(&invoice, "out/fake.wasm", "wagi", "route")
406+
);
407+
}
408+
409+
#[test]
410+
fn test_handler_parcel_is_not_asset() {
411+
let invoice = expand_test_invoice("app1").unwrap();
412+
assert_eq!(
413+
"false",
414+
parcel_feature_value(&invoice, "out/fake.wasm", "wagi", "file")
415+
);
416+
}
417+
359418
#[test]
360419
fn test_group_is_created_per_handler() {
361420
let invoice = expand_test_invoice("app1").unwrap();
@@ -386,6 +445,15 @@ mod test {
386445
);
387446
}
388447

448+
#[test]
449+
fn test_assets_parcels_are_marked_as_assets() {
450+
let invoice = expand_test_invoice("app1").unwrap();
451+
assert_eq!(
452+
"true",
453+
parcel_feature_value(&invoice, "scripts/real.js", "wagi", "file")
454+
);
455+
}
456+
389457
#[test]
390458
fn test_handler_parcels_are_not_members_of_groups() {
391459
let invoice = expand_test_invoice("app1").unwrap();

0 commit comments

Comments
 (0)