use crate::expr::{Expr, Prop};
use crate::Ident;
#[derive(Debug, Clone, PartialEq)]
#[cfg_attr(
all(feature = "serde", not(feature = "esprima")),
derive(Deserialize, Serialize)
)]
#[cfg_attr(all(feature = "serde", feature = "esprima"), derive(Deserialize))]
#[cfg_attr(all(feature = "serde", feature = "esprima"), serde(untagged))]
pub enum Pat<'a> {
Ident(Ident<'a>),
Obj(ObjPat<'a>),
Array(Vec<Option<ArrayPatPart<'a>>>),
RestElement(Box<Pat<'a>>),
Assign(AssignPat<'a>),
}
impl<'a> Pat<'a> {
pub fn ident_from(s: &'a str) -> Self {
Pat::Ident(Ident::from(s))
}
}
#[derive(PartialEq, Debug, Clone)]
#[cfg_attr(all(feature = "serialization"), derive(Deserialize, Serialize))]
#[cfg_attr(all(feature = "serde", feature = "esprima"), serde(untagged))]
pub enum ArrayPatPart<'a> {
Pat(Pat<'a>),
Expr(Expr<'a>),
}
pub type ObjPat<'a> = Vec<ObjPatPart<'a>>;
#[derive(PartialEq, Debug, Clone)]
#[cfg_attr(all(feature = "serialization"), derive(Deserialize, Serialize))]
#[cfg_attr(all(feature = "serde", feature = "esprima"), serde(untagged))]
pub enum ObjPatPart<'a> {
Assign(Prop<'a>),
Rest(Box<Pat<'a>>),
}
#[derive(Debug, Clone, PartialEq)]
#[cfg_attr(
all(feature = "serde", not(feature = "esprima")),
derive(Deserialize, Serialize)
)]
#[cfg_attr(all(feature = "serde", feature = "esprima"), derive(Deserialize))]
pub struct AssignPat<'a> {
pub left: Box<Pat<'a>>,
pub right: Box<Expr<'a>>,
}