aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--mesonbuild/cargo/manifest.py227
1 files changed, 227 insertions, 0 deletions
diff --git a/mesonbuild/cargo/manifest.py b/mesonbuild/cargo/manifest.py
new file mode 100644
index 0000000..e6192d0
--- /dev/null
+++ b/mesonbuild/cargo/manifest.py
@@ -0,0 +1,227 @@
+# SPDX-License-Identifier: Apache-2.0
+# Copyright © 2022-2023 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']
+
+Package = TypedDict(
+ 'Package',
+ {
+ 'name': Required[str],
+ 'version': Required[str],
+ 'authors': T.List[str],
+ 'edition': EDITION,
+ 'rust-version': str,
+ 'description': str,
+ 'readme': str,
+ 'license': str,
+ 'license-file': str,
+ 'keywords': T.List[str],
+ 'categories': T.List[str],
+ 'workspace': str,
+ 'build': str,
+ 'links': str,
+ 'include': T.List[str],
+ 'exclude': T.List[str],
+ 'publish': bool,
+ 'metadata': T.Dict[str, T.Dict[str, str]],
+ 'default-run': str,
+ 'autobins': bool,
+ 'autoexamples': bool,
+ 'autotests': bool,
+ 'autobenches': bool,
+ },
+ total=False,
+)
+"""A description of the Package Dictionary."""
+
+class FixedPackage(TypedDict, total=False):
+
+ """A description of the Package Dictionary, fixed up."""
+
+ name: Required[str]
+ version: Required[str]
+ authors: T.List[str]
+ edition: EDITION
+ rust_version: str
+ description: str
+ readme: str
+ license: str
+ license_file: str
+ keywords: T.List[str]
+ categories: T.List[str]
+ workspace: str
+ build: str
+ links: str
+ include: T.List[str]
+ exclude: T.List[str]
+ publish: bool
+ metadata: T.Dict[str, T.Dict[str, str]]
+ default_run: str
+ autobins: bool
+ autoexamples: bool
+ autotests: bool
+ autobenches: bool
+
+
+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."""
+
+
+class FixedDependency(TypedDict, total=False):
+
+ """An entry in the *dependencies sections, fixed up."""
+
+ version: T.List[str]
+ registry: str
+ git: str
+ branch: str
+ rev: str
+ path: str
+ optional: bool
+ package: str
+ default_features: bool
+ features: T.List[str]
+
+
+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 _BaseFixedBuildTarget(TypedDict, total=False):
+ path: str
+ test: bool
+ doctest: bool
+ bench: bool
+ doc: bool
+ plugin: bool
+ harness: bool
+ edition: EDITION
+ crate_type: T.List[CRATE_TYPE]
+ required_features: T.List[str]
+
+
+class FixedBuildTarget(_BaseFixedBuildTarget, total=False):
+
+ name: str
+
+class FixedLibTarget(_BaseFixedBuildTarget, total=False):
+
+ name: Required[str]
+ proc_macro: bool
+
+
+class Target(TypedDict):
+
+ """Target entry in the Manifest File."""
+
+ dependencies: T.Dict[str, 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]
+
+
+Manifest = TypedDict(
+ 'Manifest',
+ {
+ 'package': Package,
+ 'badges': T.Dict[str, Badge],
+ 'dependencies': T.Dict[str, DependencyV],
+ 'dev-dependencies': T.Dict[str, DependencyV],
+ 'build-dependencies': T.Dict[str, 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):
+
+ """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