direct_match_a/
direct_match_a.rs

1#![allow(
2    dead_code,
3    irrefutable_let_patterns,
4    unused_variables,
5    unused_imports,
6    unused
7)]
8//! This module demonstrates the Direct match strategy
9//! The rules are:
10//! ```pest
11//! a = { "a" }
12//! ```
13extern crate pest;
14use pest_tree::ParsingContext;
15use std::rc::Rc;
16
17use pest::*;
18extern crate pest_derive;
19#[macro_use]
20extern crate pest_tree_derive;
21extern crate pest_tree;
22use pest_derive::*;
23use pest_tree::PestTree;
24use pest_tree::TreeError;
25use pest_tree_derive::PestTree;
26
27#[derive(Parser)]
28#[grammar = "../examples/sequential.pest"]
29pub struct DirectParser;
30
31#[derive(PestTree, Debug, PartialEq)]
32#[pest_tree(strategy(Direct))]
33#[pest_tree(require(rule(Rule::a)))]
34struct A {}
35
36fn main() {
37    // successful match
38    let test_str = "a";
39    let parsed: iterators::Pair<'_, Rule> = DirectParser::parse(Rule::a, test_str)
40        .unwrap()
41        .next()
42        .unwrap();
43    let ctx = pest_tree::ParsingContext {
44        filename: "testfile.file".to_string(),
45        contents: test_str.to_string(),
46    };
47    let a = A::with_pair(parsed, Rc::new(ctx)).unwrap();
48    assert_eq!(a, A {});
49    // unsuccessful match (rule b instead of a)
50    let test_str = "b";
51    let parsed = DirectParser::parse(Rule::b, test_str)
52        .unwrap()
53        .next()
54        .unwrap();
55    let ctx = pest_tree::ParsingContext {
56        filename: "wrongfile.bad".to_string(),
57        contents: test_str.to_string(),
58    };
59    let tree_error = A::with_pair(parsed, Rc::new(ctx)).unwrap_err();
60    // pretty print error
61    tree_error.eprint();
62}