Expand description
§Manifest Parser Grammar
This documentation explains the rules and structure of the manifest parser grammar used in this project.
§Core Rules
§WHITESPACE and COMMENTS
WHITESPACE = _{ " " | "\t" | "\r" | "\n" }
COMMENT = _{ "#" ~ (!NEWLINE ~ ANY)* ~ (NEWLINE | EOI) }
These rules handle basic formatting:
WHITESPACE
: Matches any whitespace characters (space, tab, return, newline)COMMENT
: Matches lines starting with#
until the end of line
§Version Rules
version_core = _{ numeric_identifier ~ "." ~ numeric_identifier ~ "." ~ numeric_identifier }
version = { "\"" ~ version_core ~ ("-" ~ pre_release)? ~ ("+" ~ build)? ~ "\"" }
Handles semantic versioning (SemVer) format:
version_core
: MatchesMAJOR.MINOR.PATCH
formatversion
: Full version string including pre-release and build metadata- Example:
"1.2.3"
,"1.2.3-alpha"
,"1.2.3+build.123"
§Section Names
section_name = @{
"lib"
| "bin"
| "example"
| "test"
| "bench"
| "build-dependencies"
| "target"
| "badges"
| "features"
| "lints"
| "patch"
| "replace"
| "profile"
| "workspace"
}
Predefined section names allowed in the manifest.
§Identifier Rules
non_digit = _{ ASCII_ALPHA | "-" }
identifier_characters = _{ (ASCII_DIGIT | non_digit)+ }
Rules for parsing identifiers:
non_digit
: Any alphabetic character or hyphenidentifier_characters
: Combination of digits and non-digits
§Section Structure
§Package Section
package_section = {
"[package]" ~ "name" ~ "=" ~ value ~ "version" ~ "=" ~ version ~ section_inside
}
The required package section containing:
- Package name
- Version number
- Additional metadata
§Dependencies Section
dependencies_section = {
("[dependencies]" | "[dev-dependencies]") ~ dependencies_key_value*
}
Dependencies section with various dependency specifications:
dependency_spec = {
"{" ~ (
dependency_version |
dependency_git |
dependency_path |
dependency_registry |
dependency_workspace |
dependency_optional |
features
)+ ~ "}"
}
Example dependency formats:
[dependencies]
simple = "1.0.0"
complex = { version = "1.0.0", features = ["async"] }
local = { path = "../local-dep" }
git-dep = { git = "https://github.com/user/repo" }
§Key-Value Pairs
key = @{ (ASCII_ALPHANUMERIC | "_" | "-")+ }
value = @{ (!NEWLINE ~ WHITESPACE* ~ possible_value_char)+ }
key_value = { key ~ "=" ~ value }
Basic key-value pair structure:
key
: Alphanumeric characters with underscores and hyphensvalue
: Any characters except newline- Example:
key = "value"
§Section Structure
section_definition = { "[" ~ "["? ~ section_name ~ "]" ~ "]"? }
section_inside = { key_value* }
section = { section_definition ~ section_inside }
General section structure supporting both single and double brackets:
- Single bracket:
[section]
- Double bracket:
[[section]]
§Main Manifest Rule
manifest = {
SOI ~ package_section ~ (section | dependencies_section)* ~ EOI
}
Complete manifest structure:
- Start of input
- Required package section
- Optional additional sections
- End of input
§Examples
§Basic Manifest
[package]
name = "my-package"
version = "1.0.0"
edition = "2021"
[dependencies]
serde = "1.0.0"
tokio = { version = "1.0.0", features = ["full"] }
§Complex Manifest
[package]
name = "complex-package"
version = "0.1.0-alpha+build.123"
edition = "2021"
[dependencies]
local-dep = { path = "../local" }
git-dep = { git = "https://github.com/user/repo" }
[[bin]]
name = "tool"
path = "src/main.rs"
[features]
default = ["async"]
async = ["tokio"]
A parser for manifest files using Pest grammar.
Structs§
- Manifest
- Represents a parsed manifest containing sections of key-value pairs.
- Manifest
Parser - The main parser for manifest files. This parser reads and validates manifest files that define sections including package information and dependencies.
Enums§
- Manifest
Error - Represents errors that can occur during manifest parsing.
- Rule