use crate::ast::{Ast, Expr, NodeId, Tuple};
use proc_macro2::Span;
use std::rc::Rc;
#[derive(Debug, Clone)]
pub enum LoopSourceValue {
Value(Rc<Expr>),
Tuple(Tuple<Expr>),
}
impl LoopSourceValue {
pub fn from_value(expr: Expr) -> Self {
Self::Value(Rc::new(expr))
}
pub fn from_tuple(tuple: Tuple<Expr>) -> Self {
Self::Tuple(tuple)
}
}
impl Ast for LoopSourceValue {
fn id(&self) -> NodeId {
match self {
LoopSourceValue::Value(expr) => expr.id(),
LoopSourceValue::Tuple(tuple) => tuple.id(),
}
}
fn span(&self) -> Span {
match self {
LoopSourceValue::Value(expr) => expr.span(),
LoopSourceValue::Tuple(tuple) => tuple.span(),
}
}
}
#[derive(Debug, Clone)]
pub struct LoopSourceValueList {
id: NodeId,
values: Vec<LoopSourceValue>,
span: Span,
}
impl LoopSourceValueList {
pub fn new(id: NodeId, values: Vec<LoopSourceValue>, span: Span) -> Self {
Self { id, values, span }
}
pub fn values(&self) -> &[LoopSourceValue] {
&self.values
}
}
impl Ast for LoopSourceValueList {
fn id(&self) -> NodeId {
self.id
}
fn span(&self) -> Span {
self.span
}
}