1pub(crate) use spanned::*;
2
3/// An optional spanned value.
4#[derive(Debug, Clone)]
5pub struct OptWithLine<T>(Option<Spanned<T>>);
6
7impl<T> std::ops::Deref for OptWithLine<T> {
8 type Target = Option<Spanned<T>>;
9
10 fn deref(&self) -> &Self::Target {
11 &self.0
12 }
13}
14
15impl<T> From<Option<Spanned<T>>> for OptWithLine<T> {
16 fn from(value: Option<Spanned<T>>) -> Self {
17 Self(value)
18 }
19}
20
21impl<T> From<Spanned<T>> for OptWithLine<T> {
22 fn from(value: Spanned<T>) -> Self {
23 Self(Some(value))
24 }
25}
26
27impl<T> Default for OptWithLine<T> {
28 fn default() -> Self {
29 Self(Default::default())
30 }
31}
32
33impl<T> OptWithLine<T> {
34 /// Creates a new optional spanned value.
35 pub fn new(data: T, span: Span) -> Self {
36 Self(Some(Spanned::new(data, span)))
37 }
38
39 /// Tries to set the value if not already set. Returns newly passed
40 /// value in case there was already a value there.
41 #[must_use]
42 pub fn set(&mut self, data: T, span: Span) -> Option<Spanned<T>> {
43 let new = Spanned::new(data, span);
44 if self.0.is_some() {
45 Some(new)
46 } else {
47 self.0 = Some(new);
48 None
49 }
50 }
51
52 /// Consumes `self` and returns the inner value.
53 #[must_use]
54 pub fn into_inner(self) -> Option<Spanned<T>> {
55 self.0
56 }
57}
58