mago_syntax/ast/ast/
yield.rs1use serde::Serialize;
2use strum::Display;
3
4use mago_span::HasSpan;
5use mago_span::Span;
6
7use crate::ast::ast::expression::Expression;
8use crate::ast::ast::keyword::Keyword;
9
10#[derive(Debug, Clone, Eq, PartialEq, Hash, Serialize, PartialOrd, Ord, Display)]
24#[serde(tag = "type", content = "value")]
25pub enum Yield<'arena> {
26 Value(YieldValue<'arena>),
27 Pair(YieldPair<'arena>),
28 From(YieldFrom<'arena>),
29}
30
31#[derive(Debug, Clone, Eq, PartialEq, Hash, Serialize, PartialOrd, Ord)]
43pub struct YieldValue<'arena> {
44 pub r#yield: Keyword<'arena>,
45 pub value: Option<&'arena Expression<'arena>>,
46}
47
48#[derive(Debug, Clone, Eq, PartialEq, Hash, Serialize, PartialOrd, Ord)]
60pub struct YieldPair<'arena> {
61 pub r#yield: Keyword<'arena>,
62 pub key: &'arena Expression<'arena>,
63 pub arrow: Span,
64 pub value: &'arena Expression<'arena>,
65}
66
67#[derive(Debug, Clone, Eq, PartialEq, Hash, Serialize, PartialOrd, Ord)]
79pub struct YieldFrom<'arena> {
80 pub r#yield: Keyword<'arena>,
81 pub from: Keyword<'arena>,
82 pub iterator: &'arena Expression<'arena>,
83}
84
85impl HasSpan for Yield<'_> {
86 fn span(&self) -> Span {
87 match self {
88 Yield::Value(y) => y.span(),
89 Yield::Pair(y) => y.span(),
90 Yield::From(y) => y.span(),
91 }
92 }
93}
94
95impl HasSpan for YieldValue<'_> {
96 fn span(&self) -> Span {
97 if let Some(value) = &self.value { self.r#yield.span().join(value.span()) } else { self.r#yield.span() }
98 }
99}
100
101impl HasSpan for YieldPair<'_> {
102 fn span(&self) -> Span {
103 self.r#yield.span().join(self.value.span())
104 }
105}
106
107impl HasSpan for YieldFrom<'_> {
108 fn span(&self) -> Span {
109 self.r#yield.span().join(self.iterator.span())
110 }
111}