Skip to content

Commit 1b984c7

Browse files
authored
[native_assets_cli] Replace TypeErrors with FormatExceptions (#112)
1 parent b2b26db commit 1b984c7

File tree

8 files changed

+91
-26
lines changed

8 files changed

+91
-26
lines changed

pkgs/native_assets_cli/CHANGELOG.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@
22

33
- Added topics.
44
- Fixed metadata example.
5+
- Throws `FormatException`s instead of `TypeError`s when failing to parse Yaml
6+
([#109](https://github.com/dart-lang/native/issues/109)).
57

68
## 0.1.0
79

pkgs/native_assets_cli/lib/src/model/asset.dart

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -27,8 +27,8 @@ abstract class AssetPath {
2727
}
2828

2929
factory AssetPath.fromYaml(YamlMap yamlMap) {
30-
final pathType = yamlMap[_pathTypeKey] as String;
31-
final uriString = yamlMap[_uriKey] as String?;
30+
final pathType = as<String>(yamlMap[_pathTypeKey]);
31+
final uriString = as<String?>(yamlMap[_uriKey]);
3232
final uri = uriString != null ? Uri(path: uriString) : null;
3333
return AssetPath(pathType, uri);
3434
}
@@ -203,10 +203,10 @@ class Asset {
203203
});
204204

205205
factory Asset.fromYaml(YamlMap yamlMap) => Asset(
206-
name: yamlMap[_nameKey] as String,
207-
path: AssetPath.fromYaml(yamlMap[_pathKey] as YamlMap),
208-
target: Target.fromString(yamlMap[_targetKey] as String),
209-
linkMode: LinkMode.fromName(yamlMap[_linkModeKey] as String),
206+
name: as<String>(yamlMap[_nameKey]),
207+
path: AssetPath.fromYaml(as<YamlMap>(yamlMap[_pathKey])),
208+
target: Target.fromString(as<String>(yamlMap[_targetKey])),
209+
linkMode: LinkMode.fromName(as<String>(yamlMap[_linkModeKey])),
210210
);
211211

212212
static List<Asset> listFromYamlString(String yaml) {
@@ -215,14 +215,14 @@ class Asset {
215215
return [];
216216
}
217217
return [
218-
for (final yamlElement in yamlObject as YamlList)
219-
Asset.fromYaml(yamlElement as YamlMap),
218+
for (final yamlElement in as<YamlList>(yamlObject))
219+
Asset.fromYaml(as<YamlMap>(yamlElement)),
220220
];
221221
}
222222

223223
static List<Asset> listFromYamlList(YamlList yamlList) => [
224224
for (final yamlElement in yamlList)
225-
Asset.fromYaml(yamlElement as YamlMap),
225+
Asset.fromYaml(as<YamlMap>(yamlElement)),
226226
];
227227

228228
Asset copyWith({

pkgs/native_assets_cli/lib/src/model/build_config.dart

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -443,7 +443,7 @@ class BuildConfig {
443443
}
444444
final result = <String, Metadata>{};
445445
for (final entry in fileValue.entries) {
446-
final packageName = entry.key;
446+
final packageName = as<String>(entry.key);
447447
final defines = entry.value;
448448
if (defines is! Map) {
449449
throw FormatException("Unexpected value '$defines' for key "
@@ -452,13 +452,11 @@ class BuildConfig {
452452
}
453453
final packageResult = <String, Object>{};
454454
for (final entry2 in defines.entries) {
455-
final key = entry2.key;
456-
assert(key is String);
457-
final value = entry2.value;
458-
assert(value != null);
459-
packageResult[key as String] = value as Object;
455+
final key = as<String>(entry2.key);
456+
final value = as<Object>(entry2.value);
457+
packageResult[key] = value;
460458
}
461-
result[packageName as String] = Metadata(packageResult.sortOnKey());
459+
result[packageName] = Metadata(packageResult.sortOnKey());
462460
}
463461
return result.sortOnKey();
464462
}

pkgs/native_assets_cli/lib/src/model/build_output.dart

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -43,12 +43,12 @@ class BuildOutput {
4343
static const _versionKey = 'version';
4444

4545
factory BuildOutput.fromYamlString(String yaml) {
46-
final yamlObject = loadYaml(yaml) as YamlMap;
47-
return BuildOutput.fromYaml(yamlObject);
46+
final yamlObject = loadYaml(yaml);
47+
return BuildOutput.fromYaml(as<YamlMap>(yamlObject));
4848
}
4949

5050
factory BuildOutput.fromYaml(YamlMap yamlMap) {
51-
final outputVersion = Version.parse(yamlMap['version'] as String);
51+
final outputVersion = Version.parse(as<String>(yamlMap['version']));
5252
if (outputVersion.major > version.major) {
5353
throw FormatException(
5454
'The output version $outputVersion is newer than the '
@@ -65,11 +65,11 @@ class BuildOutput {
6565
}
6666

6767
return BuildOutput(
68-
timestamp: DateTime.parse(yamlMap[_timestampKey] as String),
69-
assets: Asset.listFromYamlList(yamlMap[_assetsKey] as YamlList),
68+
timestamp: DateTime.parse(as<String>(yamlMap[_timestampKey])),
69+
assets: Asset.listFromYamlList(as<YamlList>(yamlMap[_assetsKey])),
7070
dependencies:
71-
Dependencies.fromYaml(yamlMap[_dependenciesKey] as YamlList?),
72-
metadata: Metadata.fromYaml(yamlMap[_metadataKey] as YamlMap?),
71+
Dependencies.fromYaml(as<YamlList?>(yamlMap[_dependenciesKey])),
72+
metadata: Metadata.fromYaml(as<YamlMap?>(yamlMap[_metadataKey])),
7373
);
7474
}
7575

pkgs/native_assets_cli/lib/src/model/dependencies.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ class Dependencies {
2525
factory Dependencies.fromYaml(YamlList? yamlList) => Dependencies([
2626
if (yamlList != null)
2727
for (final dependency in yamlList)
28-
fileSystemPathToUri(dependency as String),
28+
fileSystemPathToUri(as<String>(dependency)),
2929
]);
3030

3131
List<String> toYaml() => [

pkgs/native_assets_cli/lib/src/model/metadata.dart

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,10 +14,10 @@ class Metadata {
1414
const Metadata(this.metadata);
1515

1616
factory Metadata.fromYaml(YamlMap? yamlMap) =>
17-
Metadata(yamlMap?.cast<String, Object>() ?? {});
17+
Metadata(yamlMap?.formatCast<String, Object>() ?? {});
1818

1919
factory Metadata.fromYamlString(String yaml) {
20-
final yamlObject = loadYaml(yaml) as YamlMap;
20+
final yamlObject = as<YamlMap>(loadYaml(yaml));
2121
return Metadata.fromYaml(yamlObject);
2222
}
2323

pkgs/native_assets_cli/lib/src/utils/yaml.dart

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,3 +16,18 @@ String yamlEncode(Object yamlEncoding) {
1616
);
1717
return editor.toString();
1818
}
19+
20+
T as<T>(Object? object) {
21+
if (object is T) {
22+
return object;
23+
}
24+
throw FormatException(
25+
"Unexpected value '$object' in YAML. Expected a $T.",
26+
);
27+
}
28+
29+
extension YamlMapCast on YamlMap {
30+
Map<K, V> formatCast<K, V>() => <K, V>{
31+
for (final e in entries) as<K>(e.key): as<V>(e.value),
32+
};
33+
}

pkgs/native_assets_cli/test/model/build_output_test.dart

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -109,4 +109,54 @@ version: ${BuildOutput.version}''';
109109
);
110110
});
111111
}
112+
113+
test('format exception', () {
114+
expect(
115+
() => BuildOutput.fromYamlString('''timestamp: 2022-11-10 13:25:01.000
116+
assets:
117+
- name: foo
118+
link_mode: dynamic
119+
path:
120+
path_type:
121+
some: map
122+
uri: path/to/libfoo.so
123+
target: android_x64
124+
dependencies: []
125+
metadata:
126+
key: value
127+
version: ${BuildOutput.version}'''),
128+
throwsFormatException,
129+
);
130+
expect(
131+
() => BuildOutput.fromYamlString('''timestamp: 2022-11-10 13:25:01.000
132+
assets:
133+
- name: foo
134+
link_mode: dynamic
135+
path:
136+
path_type: absolute
137+
uri: path/to/libfoo.so
138+
target: android_x64
139+
dependencies:
140+
1: foo
141+
metadata:
142+
key: value
143+
version: ${BuildOutput.version}'''),
144+
throwsFormatException,
145+
);
146+
expect(
147+
() => BuildOutput.fromYamlString('''timestamp: 2022-11-10 13:25:01.000
148+
assets:
149+
- name: foo
150+
link_mode: dynamic
151+
path:
152+
path_type: absolute
153+
uri: path/to/libfoo.so
154+
target: android_x64
155+
dependencies: []
156+
metadata:
157+
123: value
158+
version: ${BuildOutput.version}'''),
159+
throwsFormatException,
160+
);
161+
});
112162
}

0 commit comments

Comments
 (0)