aboutsummaryrefslogtreecommitdiff
path: root/mesonbuild/cargo/raw.py
diff options
context:
space:
mode:
Diffstat (limited to 'mesonbuild/cargo/raw.py')
-rw-r--r--mesonbuild/cargo/raw.py192
1 files changed, 192 insertions, 0 deletions
diff --git a/mesonbuild/cargo/raw.py b/mesonbuild/cargo/raw.py
new file mode 100644
index 0000000..67dd58a
--- /dev/null
+++ b/mesonbuild/cargo/raw.py
@@ -0,0 +1,192 @@
+# SPDX-License-Identifier: Apache-2.0
+# Copyright © 2022-2024 Intel Corporation
+
+"""Type definitions for cargo manifest files."""
+
+from __future__ import annotations
+import typing as T
+
+from typing_extensions import Literal, TypedDict, Required
+
+EDITION = Literal['2015', '2018', '2021']
+CRATE_TYPE = Literal['bin', 'lib', 'dylib', 'staticlib', 'cdylib', 'rlib', 'proc-macro']
+
+
+class FromWorkspace(TypedDict):
+
+ """An entry or section that is copied from the workspace."""
+
+ workspace: bool
+
+
+Package = TypedDict(
+ 'Package',
+ {
+ 'name': Required[str],
+ 'version': Required[T.Union[FromWorkspace, str]],
+ 'authors': T.Union[FromWorkspace, T.List[str]],
+ 'edition': T.Union[FromWorkspace, EDITION],
+ 'rust-version': T.Union[FromWorkspace, str],
+ 'description': T.Union[FromWorkspace, str],
+ 'readme': T.Union[FromWorkspace, str],
+ 'license': T.Union[FromWorkspace, str],
+ 'license-file': T.Union[FromWorkspace, str],
+ 'keywords': T.Union[FromWorkspace, T.List[str]],
+ 'categories': T.Union[FromWorkspace, T.List[str]],
+ 'homepage': T.Union[FromWorkspace, str],
+ 'repository': T.Union[FromWorkspace, str],
+ 'documentation': T.Union[FromWorkspace, str],
+ 'workspace': str,
+ 'build': str,
+ 'links': str,
+ 'include': T.Union[FromWorkspace, T.List[str]],
+ 'exclude': T.Union[FromWorkspace, T.List[str]],
+ 'publish': T.Union[FromWorkspace, bool],
+ 'metadata': T.Dict[str, T.Dict[str, str]],
+ 'default-run': str,
+ 'autolib': bool,
+ 'autobins': bool,
+ 'autoexamples': bool,
+ 'autotests': bool,
+ 'autobenches': bool,
+ },
+ total=False,
+)
+"""A description of the Package Dictionary."""
+
+class Badge(TypedDict):
+
+ """An entry in the badge section."""
+
+ status: Literal['actively-developed', 'passively-developed', 'as-is', 'experimental', 'deprecated', 'none']
+
+
+Dependency = TypedDict(
+ 'Dependency',
+ {
+ 'version': str,
+ 'registry': str,
+ 'git': str,
+ 'branch': str,
+ 'rev': str,
+ 'path': str,
+ 'optional': bool,
+ 'package': str,
+ 'default-features': bool,
+ 'features': T.List[str],
+ },
+ total=False,
+)
+"""An entry in the *dependencies sections."""
+
+
+DependencyV = T.Union[Dependency, str]
+"""A Dependency entry, either a string or a Dependency Dict."""
+
+
+_BaseBuildTarget = TypedDict(
+ '_BaseBuildTarget',
+ {
+ 'path': str,
+ 'test': bool,
+ 'doctest': bool,
+ 'bench': bool,
+ 'doc': bool,
+ 'plugin': bool,
+ 'proc-macro': bool,
+ 'harness': bool,
+ 'edition': EDITION,
+ 'crate-type': T.List[CRATE_TYPE],
+ 'required-features': T.List[str],
+ },
+ total=False,
+)
+
+
+class BuildTarget(_BaseBuildTarget, total=False):
+
+ name: Required[str]
+
+
+class LibTarget(_BaseBuildTarget, total=False):
+
+ name: str
+
+
+class Target(TypedDict):
+
+ """Target entry in the Manifest File."""
+
+ dependencies: T.Dict[str, T.Union[FromWorkspace, DependencyV]]
+
+
+class Workspace(TypedDict):
+
+ """The representation of a workspace.
+
+ In a vritual manifest the :attribute:`members` is always present, but in a
+ project manifest, an empty workspace may be provided, in which case the
+ workspace is implicitly filled in by values from the path based dependencies.
+
+ the :attribute:`exclude` is always optional
+ """
+
+ members: T.List[str]
+ exclude: T.List[str]
+ package: Package
+ dependencies: T.Dict[str, DependencyV]
+
+
+Manifest = TypedDict(
+ 'Manifest',
+ {
+ 'package': Required[Package],
+ 'badges': T.Dict[str, Badge],
+ 'dependencies': T.Dict[str, T.Union[FromWorkspace, DependencyV]],
+ 'dev-dependencies': T.Dict[str, T.Union[FromWorkspace, DependencyV]],
+ 'build-dependencies': T.Dict[str, T.Union[FromWorkspace, DependencyV]],
+ 'lib': LibTarget,
+ 'bin': T.List[BuildTarget],
+ 'test': T.List[BuildTarget],
+ 'bench': T.List[BuildTarget],
+ 'example': T.List[BuildTarget],
+ 'features': T.Dict[str, T.List[str]],
+ 'target': T.Dict[str, Target],
+ 'workspace': Workspace,
+
+ # TODO: patch?
+ # TODO: replace?
+ },
+ total=False,
+)
+"""The Cargo Manifest format."""
+
+
+class VirtualManifest(TypedDict, total=False):
+
+ """The Representation of a virtual manifest.
+
+ Cargo allows a root manifest that contains only a workspace, this is called
+ a virtual manifest. This doesn't really map 1:1 with any meson concept,
+ except perhaps the proposed "meta project".
+ """
+
+ workspace: Workspace
+
+class CargoLockPackage(TypedDict, total=False):
+
+ """A description of a package in the Cargo.lock file format."""
+
+ name: str
+ version: str
+ source: str
+ checksum: str
+
+
+class CargoLock(TypedDict, total=False):
+
+ """A description of the Cargo.lock file format."""
+
+ version: int
+ package: T.List[CargoLockPackage]
+ metadata: T.Dict[str, str]