openapiv3/
reference.rs

1use serde::{Deserialize, Serialize};
2
3#[derive(Serialize, Deserialize, Clone, Debug, PartialEq)]
4#[serde(untagged)]
5pub enum ReferenceOr<T> {
6    Reference {
7        #[serde(rename = "$ref")]
8        reference: String,
9    },
10    Item(T),
11}
12
13impl<T> ReferenceOr<T> {
14    pub fn ref_(r: &str) -> Self {
15        ReferenceOr::Reference {
16            reference: r.to_owned(),
17        }
18    }
19    pub fn boxed_item(item: T) -> ReferenceOr<Box<T>> {
20        ReferenceOr::Item(Box::new(item))
21    }
22
23    /// Converts this [ReferenceOr] to the item inside, if it exists.
24    ///
25    /// The return value will be [Option::Some] if this was a [ReferenceOr::Item] or [Option::None] if this was a [ReferenceOr::Reference].
26    ///
27    /// # Examples
28    ///
29    /// ```
30    /// # use openapiv3::ReferenceOr;
31    ///
32    /// let i = ReferenceOr::Item(1);
33    /// assert_eq!(i.into_item(), Some(1));
34    ///
35    /// let j: ReferenceOr<u8> = ReferenceOr::Reference { reference: String::new() };
36    /// assert_eq!(j.into_item(), None);
37    /// ```
38    pub fn into_item(self) -> Option<T> {
39        match self {
40            ReferenceOr::Reference { .. } => None,
41            ReferenceOr::Item(i) => Some(i),
42        }
43    }
44
45    /// Returns a reference to to the item inside this [ReferenceOr], if it exists.
46    ///
47    /// The return value will be [Option::Some] if this was a [ReferenceOr::Item] or [Option::None] if this was a [ReferenceOr::Reference].
48    ///
49    /// # Examples
50    ///
51    /// ```
52    /// # use openapiv3::ReferenceOr;
53    ///
54    /// let i = ReferenceOr::Item(1);
55    /// assert_eq!(i.as_item(), Some(&1));
56    ///
57    /// let j: ReferenceOr<u8> = ReferenceOr::Reference { reference: String::new() };
58    /// assert_eq!(j.as_item(), None);
59    /// ```
60    pub fn as_item(&self) -> Option<&T> {
61        match self {
62            ReferenceOr::Reference { .. } => None,
63            ReferenceOr::Item(i) => Some(i),
64        }
65    }
66}
67
68impl<T> ReferenceOr<Box<T>> {
69    pub fn unbox(self) -> ReferenceOr<T> {
70        match self {
71            ReferenceOr::Reference { reference } => ReferenceOr::Reference { reference },
72            ReferenceOr::Item(boxed) => ReferenceOr::Item(*boxed),
73        }
74    }
75}