#[non_exhaustive]pub struct ParseOptions {
pub default_width: Option<Width>,
pub existing_symbols_only: bool,
}Expand description
Options for Context::parse.
Fields (Non-exhaustive)§
This struct is marked as non-exhaustive
Non-exhaustive structs could have additional fields added in future. Therefore, non-exhaustive structs cannot be constructed in external crates using the traditional
Struct { .. } syntax; cannot be matched against without a wildcard ..; and struct update syntax will not work.default_width: Option<Width>Width for symbols and literals whose width cannot be inferred. None makes such an
expression an error.
existing_symbols_only: boolOnly resolve symbols that already exist in the context (never create new ones).
Implementations§
Source§impl ParseOptions
impl ParseOptions
Sourcepub fn width(w: Width) -> Self
pub fn width(w: Width) -> Self
Options with a default width.
Examples found in repository?
examples/valeria_rule_audit.rs (line 26)
7fn main() {
8 let strategy = if std::env::args().any(|a| a == "--deobfuscate") {
9 Strategy::deobfuscate()
10 } else {
11 Strategy::standard()
12 };
13 let engine = Engine::builder()
14 .builtin()
15 .strategy(strategy)
16 .build()
17 .unwrap();
18 let mut invalid = false;
19 for line in io::stdin().lock().lines() {
20 let line = line.unwrap();
21 let fields: Vec<_> = line.split('\t').collect();
22 if fields.len() != 4 {
23 panic!("expected id/width/input/reference");
24 }
25 let mut cx = Context::new();
26 let options = ParseOptions::width(Width::new(fields[1].parse().unwrap()).unwrap());
27 let result = (|| -> Result<_, Box<dyn std::error::Error>> {
28 let input = cx.parse(fields[2], &options)?;
29 let reference = cx.parse(fields[3], &options)?;
30 let before = cx.tree_size(input)?;
31 if !agrees(&mut cx, &[input, reference])? {
32 return Ok((
33 "invalid-reference",
34 before,
35 before,
36 cx.tree_size(reference)?,
37 cx.display(input).to_string().replace(['\n', '\t'], " "),
38 cx.display(reference).to_string().replace(['\n', '\t'], " "),
39 ));
40 }
41 let output = engine.simplify(&mut cx, input)?.expr;
42 let want = engine.simplify(&mut cx, reference)?.expr;
43 let after = cx.tree_size(output)?;
44 let target = cx.tree_size(want)?;
45 let status = if !agrees(&mut cx, &[input, reference, output, want])? {
46 "invalid-output"
47 } else if output == want {
48 "covered"
49 } else if after > target {
50 "gap"
51 } else {
52 "different-form"
53 };
54 Ok((
55 status,
56 before,
57 after,
58 target,
59 cx.display(output).to_string().replace(['\n', '\t'], " "),
60 cx.display(want).to_string().replace(['\n', '\t'], " "),
61 ))
62 })();
63 match result {
64 Ok((status, before, after, target, output, want)) => {
65 invalid |= status.starts_with("invalid-");
66 println!(
67 "{}\t{}\t{status}\t{before}\t{after}\t{target}\t{output}\t{want}",
68 fields[0], fields[1]
69 );
70 }
71 Err(error) => {
72 invalid = true;
73 println!(
74 "{}\t{}\terror\t{}",
75 fields[0],
76 fields[1],
77 error.to_string().replace(['\n', '\t'], " ")
78 );
79 }
80 }
81 }
82 if invalid {
83 std::process::exit(1);
84 }
85}Sourcepub fn with_existing_symbols_only(self, yes: bool) -> Self
pub fn with_existing_symbols_only(self, yes: bool) -> Self
Sets existing_symbols_only.
Trait Implementations§
Source§impl Clone for ParseOptions
impl Clone for ParseOptions
Source§impl Debug for ParseOptions
impl Debug for ParseOptions
Auto Trait Implementations§
impl Freeze for ParseOptions
impl RefUnwindSafe for ParseOptions
impl Send for ParseOptions
impl Sync for ParseOptions
impl Unpin for ParseOptions
impl UnsafeUnpin for ParseOptions
impl UnwindSafe for ParseOptions
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Mutably borrows from an owned value. Read more