summaryrefslogtreecommitdiff
path: root/mesonbuild/modules/rust.py
diff options
context:
space:
mode:
Diffstat (limited to 'mesonbuild/modules/rust.py')
-rw-r--r--mesonbuild/modules/rust.py29
1 files changed, 26 insertions, 3 deletions
diff --git a/mesonbuild/modules/rust.py b/mesonbuild/modules/rust.py
index 29d1b1fbb..186774413 100644
--- a/mesonbuild/modules/rust.py
+++ b/mesonbuild/modules/rust.py
@@ -101,6 +101,7 @@ class RustWorkspace(ModuleObject):
self.ws = ws
self.methods.update({
'packages': self.packages_method,
+ 'package': self.package_method,
'subproject': self.subproject_method,
})
@@ -111,6 +112,12 @@ class RustWorkspace(ModuleObject):
package_names = [pkg.manifest.package.name for pkg in self.ws.packages.values()]
return sorted(package_names)
+ @typed_pos_args('workspace.package', optargs=[str])
+ def package_method(self, state: 'ModuleState', args: T.List, kwargs: TYPE_kwargs) -> RustPackage:
+ """Returns a package object."""
+ package_name = args[0] if args else None
+ return RustPackage(self, self.interpreter.cargo.load_package(self.ws, package_name))
+
def _do_subproject(self, pkg: cargo.PackageState) -> None:
kw: _kwargs.DoSubproject = {
'required': True,
@@ -138,8 +145,8 @@ class RustWorkspace(ModuleObject):
return RustSubproject(self, pkg)
-class RustSubproject(ModuleObject):
- """Represents a Rust package within a workspace."""
+class RustCrate(ModuleObject):
+ """Abstract base class for Rust crate representations."""
def __init__(self, rust_ws: RustWorkspace, package: cargo.PackageState) -> None:
super().__init__()
@@ -148,7 +155,6 @@ class RustSubproject(ModuleObject):
self.methods.update({
'all_features': self.all_features_method,
'api': self.api_method,
- 'dependency': self.dependency_method,
'features': self.features_method,
'name': self.name_method,
'version': self.version_method,
@@ -184,6 +190,23 @@ class RustSubproject(ModuleObject):
"""Returns chosen features for specific package."""
return sorted(list(self.package.cfg.features))
+
+class RustPackage(RustCrate):
+ """Represents a Rust package within a workspace."""
+
+ def __init__(self, rust_ws: RustWorkspace, package: cargo.PackageState) -> None:
+ super().__init__(rust_ws, package)
+
+
+class RustSubproject(RustCrate):
+ """Represents a Cargo subproject."""
+
+ def __init__(self, rust_ws: RustWorkspace, package: cargo.PackageState) -> None:
+ super().__init__(rust_ws, package)
+ self.methods.update({
+ 'dependency': self.dependency_method,
+ })
+
@noPosargs
@typed_kwargs('package.dependency',
KwargInfo('rust_abi', (str, NoneType), default=None, validator=in_set_validator({'rust', 'c', 'proc-macro'})))