boseiju/lexer/tokens/intermediates/
player_specifier.rs

1use crate::lexer::IntoToken;
2
3/// Fixme: doc
4#[derive(idris_derive::Idris)]
5#[derive(serde::Serialize, serde::Deserialize)]
6#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, PartialOrd, Ord)]
7pub enum PlayerSpecifier {
8    All {
9        #[cfg(feature = "spanned_tree")]
10        span: crate::ability_tree::span::TreeSpan,
11    },
12    Any {
13        #[cfg(feature = "spanned_tree")]
14        span: crate::ability_tree::span::TreeSpan,
15    },
16    Controller {
17        #[cfg(feature = "spanned_tree")]
18        span: crate::ability_tree::span::TreeSpan,
19    },
20    DefendingPlayer {
21        #[cfg(feature = "spanned_tree")]
22        span: crate::ability_tree::span::TreeSpan,
23    },
24    EachOpponent {
25        #[cfg(feature = "spanned_tree")]
26        span: crate::ability_tree::span::TreeSpan,
27    },
28    TargetOpponent {
29        #[cfg(feature = "spanned_tree")]
30        span: crate::ability_tree::span::TreeSpan,
31    },
32    Owner {
33        #[cfg(feature = "spanned_tree")]
34        span: crate::ability_tree::span::TreeSpan,
35    },
36    ToYourLeft {
37        #[cfg(feature = "spanned_tree")]
38        span: crate::ability_tree::span::TreeSpan,
39    },
40    ToYourRight {
41        #[cfg(feature = "spanned_tree")]
42        span: crate::ability_tree::span::TreeSpan,
43    },
44    You {
45        #[cfg(feature = "spanned_tree")]
46        span: crate::ability_tree::span::TreeSpan,
47    },
48}
49
50#[cfg(feature = "spanned_tree")]
51impl PlayerSpecifier {
52    pub fn span(&self) -> crate::ability_tree::span::TreeSpan {
53        match self {
54            Self::All { span } => *span,
55            Self::Any { span } => *span,
56            Self::Controller { span } => *span,
57            Self::DefendingPlayer { span } => *span,
58            Self::EachOpponent { span } => *span,
59            Self::Owner { span } => *span,
60            Self::TargetOpponent { span } => *span,
61            Self::ToYourLeft { span } => *span,
62            Self::ToYourRight { span } => *span,
63            Self::You { span } => *span,
64        }
65    }
66}
67
68impl IntoToken for PlayerSpecifier {
69    #[cfg(feature = "lexer")]
70    fn try_from_span(span: &crate::lexer::Span) -> Option<Self> {
71        match span.text {
72            "each player" | "players" => Some(Self::All {
73                #[cfg(feature = "spanned_tree")]
74                span: span.into(),
75            }),
76            "an opponent" | "a player" => Some(Self::Any {
77                #[cfg(feature = "spanned_tree")]
78                span: span.into(),
79            }),
80            "controller" => Some(Self::Controller {
81                #[cfg(feature = "spanned_tree")]
82                span: span.into(),
83            }),
84            "defending player" => Some(Self::DefendingPlayer {
85                #[cfg(feature = "spanned_tree")]
86                span: span.into(),
87            }),
88            "each opponent" | "opponents" | "your opponents" => Some(Self::EachOpponent {
89                #[cfg(feature = "spanned_tree")]
90                span: span.into(),
91            }),
92            "owner" => Some(Self::Owner {
93                #[cfg(feature = "spanned_tree")]
94                span: span.into(),
95            }),
96            "target opponent" | "target player" | "target players" => Some(Self::TargetOpponent {
97                #[cfg(feature = "spanned_tree")]
98                span: span.into(),
99            }),
100            "the player to your left" => Some(Self::ToYourLeft {
101                #[cfg(feature = "spanned_tree")]
102                span: span.into(),
103            }),
104            "the player to your right" => Some(Self::ToYourRight {
105                #[cfg(feature = "spanned_tree")]
106                span: span.into(),
107            }),
108            "you" => Some(Self::You {
109                #[cfg(feature = "spanned_tree")]
110                span: span.into(),
111            }),
112            _ => None,
113        }
114    }
115}