blob: e6192d03cd98e2eef31ef43e07f3acebcdf8289f [file] [log] [blame]
# 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