Skip to content

[native_assets_cli] Replace TypeErrors with FormatExceptions #112

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 4 commits into from
Aug 7, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions pkgs/native_assets_cli/CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,8 @@

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

## 0.1.0

Expand Down
18 changes: 9 additions & 9 deletions pkgs/native_assets_cli/lib/src/model/asset.dart
Original file line number Diff line number Diff line change
Expand Up @@ -27,8 +27,8 @@ abstract class AssetPath {
}

factory AssetPath.fromYaml(YamlMap yamlMap) {
final pathType = yamlMap[_pathTypeKey] as String;
final uriString = yamlMap[_uriKey] as String?;
final pathType = as<String>(yamlMap[_pathTypeKey]);
final uriString = as<String?>(yamlMap[_uriKey]);
final uri = uriString != null ? Uri(path: uriString) : null;
return AssetPath(pathType, uri);
}
Expand Down Expand Up @@ -203,10 +203,10 @@ class Asset {
});

factory Asset.fromYaml(YamlMap yamlMap) => Asset(
name: yamlMap[_nameKey] as String,
path: AssetPath.fromYaml(yamlMap[_pathKey] as YamlMap),
target: Target.fromString(yamlMap[_targetKey] as String),
linkMode: LinkMode.fromName(yamlMap[_linkModeKey] as String),
name: as<String>(yamlMap[_nameKey]),
path: AssetPath.fromYaml(as<YamlMap>(yamlMap[_pathKey])),
target: Target.fromString(as<String>(yamlMap[_targetKey])),
linkMode: LinkMode.fromName(as<String>(yamlMap[_linkModeKey])),
);

static List<Asset> listFromYamlString(String yaml) {
Expand All @@ -215,14 +215,14 @@ class Asset {
return [];
}
return [
for (final yamlElement in yamlObject as YamlList)
Asset.fromYaml(yamlElement as YamlMap),
for (final yamlElement in as<YamlList>(yamlObject))
Asset.fromYaml(as<YamlMap>(yamlElement)),
];
}

static List<Asset> listFromYamlList(YamlList yamlList) => [
for (final yamlElement in yamlList)
Asset.fromYaml(yamlElement as YamlMap),
Asset.fromYaml(as<YamlMap>(yamlElement)),
];

Asset copyWith({
Expand Down
12 changes: 5 additions & 7 deletions pkgs/native_assets_cli/lib/src/model/build_config.dart
Original file line number Diff line number Diff line change
Expand Up @@ -443,7 +443,7 @@ class BuildConfig {
}
final result = <String, Metadata>{};
for (final entry in fileValue.entries) {
final packageName = entry.key;
final packageName = as<String>(entry.key);
final defines = entry.value;
if (defines is! Map) {
throw FormatException("Unexpected value '$defines' for key "
Expand All @@ -452,13 +452,11 @@ class BuildConfig {
}
final packageResult = <String, Object>{};
for (final entry2 in defines.entries) {
final key = entry2.key;
assert(key is String);
final value = entry2.value;
assert(value != null);
packageResult[key as String] = value as Object;
final key = as<String>(entry2.key);
final value = as<Object>(entry2.value);
packageResult[key] = value;
}
result[packageName as String] = Metadata(packageResult.sortOnKey());
result[packageName] = Metadata(packageResult.sortOnKey());
}
return result.sortOnKey();
}
Expand Down
14 changes: 7 additions & 7 deletions pkgs/native_assets_cli/lib/src/model/build_output.dart
Original file line number Diff line number Diff line change
Expand Up @@ -43,12 +43,12 @@ class BuildOutput {
static const _versionKey = 'version';

factory BuildOutput.fromYamlString(String yaml) {
final yamlObject = loadYaml(yaml) as YamlMap;
return BuildOutput.fromYaml(yamlObject);
final yamlObject = loadYaml(yaml);
return BuildOutput.fromYaml(as<YamlMap>(yamlObject));
}

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

return BuildOutput(
timestamp: DateTime.parse(yamlMap[_timestampKey] as String),
assets: Asset.listFromYamlList(yamlMap[_assetsKey] as YamlList),
timestamp: DateTime.parse(as<String>(yamlMap[_timestampKey])),
assets: Asset.listFromYamlList(as<YamlList>(yamlMap[_assetsKey])),
dependencies:
Dependencies.fromYaml(yamlMap[_dependenciesKey] as YamlList?),
metadata: Metadata.fromYaml(yamlMap[_metadataKey] as YamlMap?),
Dependencies.fromYaml(as<YamlList?>(yamlMap[_dependenciesKey])),
metadata: Metadata.fromYaml(as<YamlMap?>(yamlMap[_metadataKey])),
);
}

Expand Down
2 changes: 1 addition & 1 deletion pkgs/native_assets_cli/lib/src/model/dependencies.dart
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ class Dependencies {
factory Dependencies.fromYaml(YamlList? yamlList) => Dependencies([
if (yamlList != null)
for (final dependency in yamlList)
fileSystemPathToUri(dependency as String),
fileSystemPathToUri(as<String>(dependency)),
]);

List<String> toYaml() => [
Expand Down
4 changes: 2 additions & 2 deletions pkgs/native_assets_cli/lib/src/model/metadata.dart
Original file line number Diff line number Diff line change
Expand Up @@ -14,10 +14,10 @@ class Metadata {
const Metadata(this.metadata);

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

factory Metadata.fromYamlString(String yaml) {
final yamlObject = loadYaml(yaml) as YamlMap;
final yamlObject = as<YamlMap>(loadYaml(yaml));
return Metadata.fromYaml(yamlObject);
}

Expand Down
15 changes: 15 additions & 0 deletions pkgs/native_assets_cli/lib/src/utils/yaml.dart
Original file line number Diff line number Diff line change
Expand Up @@ -16,3 +16,18 @@ String yamlEncode(Object yamlEncoding) {
);
return editor.toString();
}

T as<T>(Object? object) {
if (object is T) {
return object;
}
throw FormatException(
"Unexpected value '$object' in YAML. Expected a $T.",
);
}

extension YamlMapCast on YamlMap {
Map<K, V> formatCast<K, V>() => <K, V>{
for (final e in entries) as<K>(e.key): as<V>(e.value),
};
}
50 changes: 50 additions & 0 deletions pkgs/native_assets_cli/test/model/build_output_test.dart
Original file line number Diff line number Diff line change
Expand Up @@ -109,4 +109,54 @@ version: ${BuildOutput.version}''';
);
});
}

test('format exception', () {
expect(
() => BuildOutput.fromYamlString('''timestamp: 2022-11-10 13:25:01.000
assets:
- name: foo
link_mode: dynamic
path:
path_type:
some: map
uri: path/to/libfoo.so
target: android_x64
dependencies: []
metadata:
key: value
version: ${BuildOutput.version}'''),
throwsFormatException,
);
expect(
() => BuildOutput.fromYamlString('''timestamp: 2022-11-10 13:25:01.000
assets:
- name: foo
link_mode: dynamic
path:
path_type: absolute
uri: path/to/libfoo.so
target: android_x64
dependencies:
1: foo
metadata:
key: value
version: ${BuildOutput.version}'''),
throwsFormatException,
);
expect(
() => BuildOutput.fromYamlString('''timestamp: 2022-11-10 13:25:01.000
assets:
- name: foo
link_mode: dynamic
path:
path_type: absolute
uri: path/to/libfoo.so
target: android_x64
dependencies: []
metadata:
123: value
version: ${BuildOutput.version}'''),
throwsFormatException,
);
});
}