1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
use schemars::schema::Schema;
use serde::Serialize;

#[derive(Serialize, Clone, Debug)]
#[cfg_attr(any(test, feature = "deserialize"), derive(serde::Deserialize, PartialEq))]
#[serde(untagged)]
pub enum ReferenceOr<T: Clone> {
  Object(T),
  Reference {
    #[serde(rename = "$ref")]
    _ref: String,
  },
}

impl From<Schema> for ReferenceOr<Schema> {
  fn from(value: Schema) -> Self {
    Self::Object(value)
  }
}

impl From<String> for ReferenceOr<String> {
  fn from(value: String) -> Self {
    Self::Reference { _ref: value }
  }
}

impl<T: Clone> ReferenceOr<T> {
  pub fn get_object(self) -> Option<T> {
    match self {
      ReferenceOr::Reference { .. } => None,
      ReferenceOr::Object(p) => Some(p),
    }
  }

  pub fn get_object_mut(&mut self) -> Option<&mut T> {
    match self {
      ReferenceOr::Reference { .. } => None,
      ReferenceOr::Object(p) => Some(p),
    }
  }
}