1use crate::{Kind, Token};
2
3#[derive(Debug, Copy, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)]
34#[cfg_attr(feature = "serde", derive(serde::Serialize))]
35pub enum PairWise {
36 Paren,
37 Curly,
38 Square,
39}
40
41impl PairWise {
42 pub fn from_token(token: &Token) -> Option<Self> {
43 match token.kind() {
44 Kind::LeftParen | Kind::Function => Some(Self::Paren),
45 Kind::LeftCurly => Some(Self::Curly),
46 Kind::LeftSquare => Some(Self::Square),
47 Kind::RightParen => Some(Self::Paren),
48 Kind::RightCurly => Some(Self::Curly),
49 Kind::RightSquare => Some(Self::Square),
50 _ => None,
51 }
52 }
53
54 pub fn start(&self) -> Token {
55 match self {
56 Self::Paren => Token::LEFT_PAREN,
57 Self::Curly => Token::LEFT_CURLY,
58 Self::Square => Token::LEFT_SQUARE,
59 }
60 }
61
62 pub fn end(&self) -> Token {
63 match self {
64 Self::Paren => Token::RIGHT_PAREN,
65 Self::Curly => Token::RIGHT_CURLY,
66 Self::Square => Token::RIGHT_SQUARE,
67 }
68 }
69}
70
71impl PartialEq<Kind> for PairWise {
72 fn eq(&self, other: &Kind) -> bool {
73 self.end() == *other || self.start() == *other
74 }
75}
76
77#[test]
78fn test_partial_eq_kind() {
79 assert_eq!(PairWise::Paren, Kind::LeftParen);
80 assert_eq!(PairWise::Paren, Kind::RightParen);
81 assert_eq!(PairWise::Square, Kind::LeftSquare);
82 assert_eq!(PairWise::Square, Kind::RightSquare);
83 assert_eq!(PairWise::Curly, Kind::LeftCurly);
84 assert_eq!(PairWise::Curly, Kind::RightCurly);
85}