Skip to content
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
5 changes: 4 additions & 1 deletion native_toolchain_rust/lib/src/build_runner.dart
Original file line number Diff line number Diff line change
Expand Up @@ -70,6 +70,7 @@ interface class RustBuildRunner {
final outputDir = path.join(path.fromUri(input.outputDirectory), 'target');
final manifestPath = path.join(crateDirectory.path, 'Cargo.toml');
final (
:libName,
:crateName,
:toolchainChannel,
) = crateInfoValidator.fetchAndValidateCrateInfo(
Expand Down Expand Up @@ -114,7 +115,9 @@ interface class RustBuildRunner {
outputDir,
targetTriple,
buildMode.name,
targetOS.libraryFileName(crateName, linkMode).replaceAll('-', '_'),
targetOS
.libraryFileName(libName ?? crateName, linkMode)
.replaceAll('-', '_'),
);

// NOTE: re-run build whenever any of the dependencies change
Expand Down
21 changes: 18 additions & 3 deletions native_toolchain_rust/lib/src/crate_info_validator.dart
Original file line number Diff line number Diff line change
Expand Up @@ -12,17 +12,28 @@ interface class CrateInfoValidator {
final ToolchainTomlParser toolchainTomlParser;
final CargoManifestParser cargoManifestParser;

({String crateName, String toolchainChannel}) fetchAndValidateCrateInfo({
({String? libName, String crateName, String toolchainChannel})
fetchAndValidateCrateInfo({
required String manifestPath,
required String toolchainTomlPath,
required String targetTriple,
}) {
final manifest = cargoManifestParser.parseManifest(
manifestPath,
);

final [
String? libName,
String crateName,
String toolchainChannel,
] = RustValidationException.compose<dynamic>([
() => manifest.libName,
() {
final (:crateName, :libCrateTypes) = cargoManifestParser.parseManifest(
final CargoManifest(
:libName,
:crateName,
:libCrateTypes,
) = cargoManifestParser.parseManifest(
manifestPath,
);

Expand Down Expand Up @@ -71,6 +82,10 @@ For more information, see https://github.com/GregoryConrad/native_toolchain_rust
},
]);

return (crateName: crateName, toolchainChannel: toolchainChannel);
return (
libName: libName,
crateName: crateName,
toolchainChannel: toolchainChannel,
);
}
}
31 changes: 29 additions & 2 deletions native_toolchain_rust/lib/src/toml_parsing.dart
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,19 @@ import 'package:meta/meta.dart';
import 'package:native_toolchain_rust/src/exception.dart';
import 'package:toml/toml.dart';

@internal
class CargoManifest {
const CargoManifest({
required this.crateName,
required this.libCrateTypes,
this.libName,
});

final String? libName;
final String crateName;
final List<String> libCrateTypes;
}

@internal
interface class TomlDocumentWrapperFactory {
const TomlDocumentWrapperFactory(this.logger);
Expand Down Expand Up @@ -53,7 +66,7 @@ interface class CargoManifestParser {
final Logger logger;
final TomlDocumentWrapperFactory tomlDocumentFactory;

({String crateName, List<String> libCrateTypes}) parseManifest(
CargoManifest parseManifest(
String manifestPath,
) {
logger.info('Looking for Cargo.toml');
Expand Down Expand Up @@ -81,9 +94,19 @@ The following exception was thrown: $exception''',
}

final [
String? libName,
String crateName,
List<String> libCrateTypes,
] = RustValidationException.compose<dynamic>([
() {
try {
return manifest.walk<String>('lib.name');
} on RustValidationException {
logger.fine(
'`lib.name` is not defined. Using `package.name` instead',
);
}
},
() {
try {
return manifest.walk<String>('package.name');
Expand All @@ -109,7 +132,11 @@ and https://doc.rust-lang.org/cargo/reference/cargo-targets.html#the-crate-type-
},
]);

return (crateName: crateName, libCrateTypes: libCrateTypes);
return CargoManifest(
libName: libName,
crateName: crateName,
libCrateTypes: libCrateTypes,
);
}
}

Expand Down
20 changes: 12 additions & 8 deletions native_toolchain_rust/test/crate_info_validator_test.dart
Original file line number Diff line number Diff line change
Expand Up @@ -24,10 +24,12 @@ void main() {
});

test('fetchAndValidateCrateInfo returns correct info on success', () {
when(() => mockCargoManifestParser.parseManifest(any())).thenReturn((
crateName: 'my_crate',
libCrateTypes: ['staticlib', 'cdylib'],
));
when(() => mockCargoManifestParser.parseManifest(any())).thenReturn(
const CargoManifest(
crateName: 'my_crate',
libCrateTypes: ['staticlib', 'cdylib'],
),
);
when(() => mockToolchainTomlParser.parseToolchainToml(any())).thenReturn((
channel: '1.90.0',
targets: {'aarch64-linux-android'},
Expand All @@ -44,10 +46,12 @@ void main() {
});

test('fetchAndValidateCrateInfo throws exception on validation issues', () {
when(() => mockCargoManifestParser.parseManifest(any())).thenReturn((
crateName: 'my_crate',
libCrateTypes: ['staticlib'],
));
when(() => mockCargoManifestParser.parseManifest(any())).thenReturn(
const CargoManifest(
crateName: 'my_crate',
libCrateTypes: ['staticlib'],
),
);
when(() => mockToolchainTomlParser.parseToolchainToml(any())).thenReturn((
channel: 'stable',
targets: {'x86_64-linux-gnu'},
Expand Down
Loading