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}