pub struct TokenRule { /* private fields */ }Expand description
Spacing rules for one token kind (or for every token), on either side.
A token rule lives either at the top level of Rules (a default that
applies wherever the token appears) or inside a NodeRule (applies only
to tokens that are direct children of that node, and wins over the
top-level default). On each side the most specific rule wins: a node’s rule
for this exact kind, then the node’s rule for any token, then the top-level
rule for this kind, then the top-level rule for any token.
§Examples
use fmt_lang::{Space, TokenRule};
let plus = TokenRule::new("+").around(Space::Single);
let open_paren = TokenRule::new("(").after(Space::None);
// Every direct child token of a node (used inside a `NodeRule`).
let tight = TokenRule::any().before(Space::None).after(Space::None);Implementations§
Source§impl TokenRule
impl TokenRule
Sourcepub fn new(kind: impl Into<String>) -> Self
pub fn new(kind: impl Into<String>) -> Self
A rule for tokens of the kind named kind, with no spacing set yet.
§Examples
use fmt_lang::{Space, TokenRule};
let semi = TokenRule::new(";").before(Space::None);Sourcepub fn any() -> Self
pub fn any() -> Self
A rule for every token, whatever its kind. Inside a NodeRule it
covers every direct child token of that node.
§Examples
use fmt_lang::{NodeRule, Space, TokenRule};
// A prefix operator hugs its operand: `-x`, not `- x`.
let prefix = NodeRule::new("prefix").token(TokenRule::any().before(Space::None).after(Space::None));Sourcepub fn before(self, space: Space) -> Self
pub fn before(self, space: Space) -> Self
Spacing in the gap before the token.
§Examples
use fmt_lang::{Space, TokenRule};
let close = TokenRule::new(")").before(Space::None);Sourcepub fn after(self, space: Space) -> Self
pub fn after(self, space: Space) -> Self
Spacing in the gap after the token.
§Examples
use fmt_lang::{Space, TokenRule};
let comma = TokenRule::new(",").after(Space::Single);Sourcepub fn around(self, space: Space) -> Self
pub fn around(self, space: Space) -> Self
The same spacing on both sides.
§Examples
use fmt_lang::{Space, TokenRule};
let assign = TokenRule::new("=").around(Space::Single);Sourcepub fn optional(self) -> Self
pub fn optional(self) -> Self
Marks the rule optional: if the language has no kind by this name,
Rules::compile drops the rule instead of reporting
RuleError::UnknownKind. Meant for
presets shared across languages, such as Rules::conventional.
§Examples
use fmt_lang::{Rules, Space, TokenRule};
let rules = Rules::new().token(TokenRule::new("=>").around(Space::Single).optional());
// The language below has no `=>`; the rule is dropped, not an error.
let style = rules.compile(|name| (name == "+").then_some(1u8))?;