Skip to main content

oxilean_parse/pattern/
patterncompiler_pattern_to_string_group.rs

1//! # PatternCompiler - pattern_to_string_group Methods
2//!
3//! This module contains method implementations for `PatternCompiler`.
4//!
5//! 🤖 Generated with [SplitRS](https://github.com/cool-japan/splitrs)
6
7use crate::Pattern;
8
9use super::patterncompiler_type::PatternCompiler;
10
11impl PatternCompiler {
12    /// Pretty-print a pattern to a string.
13    #[allow(dead_code)]
14    pub fn pattern_to_string(&self, pattern: &Pattern) -> String {
15        match pattern {
16            Pattern::Wild => "_".to_string(),
17            Pattern::Var(name) => name.clone(),
18            Pattern::Ctor(name, args) => {
19                if args.is_empty() {
20                    name.clone()
21                } else {
22                    let args_str: Vec<String> = args
23                        .iter()
24                        .map(|a| {
25                            let s = self.pattern_to_string(&a.value);
26                            if matches!(
27                                & a.value, Pattern::Ctor(_, ref sub) if ! sub.is_empty()
28                            ) {
29                                format!("({})", s)
30                            } else {
31                                s
32                            }
33                        })
34                        .collect();
35                    format!("{} {}", name, args_str.join(" "))
36                }
37            }
38            Pattern::Lit(lit) => format!("{}", lit),
39            Pattern::Or(left, right) => {
40                let ls = self.pattern_to_string(&left.value);
41                let rs = self.pattern_to_string(&right.value);
42                format!("{} | {}", ls, rs)
43            }
44        }
45    }
46    /// Convert patterns to a canonical form for comparison.
47    pub fn canonicalize(&self, pattern: &Pattern) -> String {
48        self.pattern_to_string(pattern)
49    }
50}