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
42
43
44
45
46
47
48
49
50
51
52
53
54
55
// OpenAPI v3.1.0 Specification
//
// OpenAPI inside OpenAPI
//
// The version of the OpenAPI document: 3.1.0
//
// Generated by: https://openapi-generator.tech

use std::{default, ops::Deref};

use derive_more::{Display, Error};

use crate::v31;

#[derive(Clone, Default, Debug, PartialEq, Serialize, Deserialize)]
pub struct Reference {
  #[serde(rename = "$ref", skip_serializing_if = "Option::is_none")]
  pub dollar_ref: Option<String>,
  #[serde(rename = "summary", skip_serializing_if = "Option::is_none")]
  pub summary: Option<String>,
  #[serde(rename = "description", skip_serializing_if = "Option::is_none")]
  pub description: Option<String>,
}

impl Reference {
  pub fn new() -> Reference {
    Reference { dollar_ref: None, summary: None, description: None }
  }
}

#[derive(Clone, Debug, Deserialize, Serialize, PartialEq)]
#[serde(untagged)]
pub enum ObjectOrRef<T> {
  Object(T),
  Ref {
    #[serde(rename = "$ref")]
    r#ref: String,
  },
}

#[derive(Clone, Debug, PartialEq, Display, Error)]
pub enum ObjectRefErr {
  #[display(fmt = "Reference Error")]
  Ref,
}

impl<T> ObjectOrRef<T> {
  // TODO: implement resolve
  pub fn resolve(&self) -> Result<&T, ObjectRefErr> {
    match self {
      ObjectOrRef::Object(object) => Ok(object),
      ObjectOrRef::Ref { r#ref: _ } => Err(ObjectRefErr::Ref),
    }
  }
}