codegenr_lib/helpers/
openapi3.rs

1use handlebars::{HelperDef, ScopedJson};
2use serde_json::Value;
3
4use super::handlebars_ext::HandlebarsExt;
5
6pub const IS_OAPI3_PARAM_REQUIRED: &str = "is_oapi3_parameter_required";
7pub const IS_OAPI3_PROP_REQUIRED: &str = "is_oapi3_property_required";
8
9/// Returns true is the current context is an open api 3 required parameter.
10/// ```
11/// # use codegenr_lib::helpers::*;
12/// # use serde_json::json;
13/// let json = json!({
14///   "parameters": [
15///     {
16///       "in": "query",
17///       "name": "offset",
18///       "schema": {
19///         "type": "integer"
20///       }
21///     },
22///     {
23///       "in": "path",
24///       "name": "limit",
25///       "schema": {
26///         "type": "integer"
27///       },
28///       "required": true
29///     },
30///     {
31///       "in": "header",
32///       "name": "jwt",
33///       "schema": {
34///         "type": "string"
35///       },
36///       "required": false
37///     }
38///   ]
39/// });
40/// assert_eq!(
41///   exec_template(json, "{{#each parameters}}{{name}} is {{#if (is_oapi3_parameter_required this)}}required{{else}}not required{{/if}}\n{{/each}}"),
42///   r#"offset is not required
43/// limit is required
44/// jwt is not required
45/// "#
46/// );
47/// ```
48pub struct IsOApi3ParamRequiredHelper;
49
50impl HelperDef for IsOApi3ParamRequiredHelper {
51  fn call_inner<'reg: 'rc, 'rc>(
52    &self,
53    h: &handlebars::Helper<'reg, 'rc>,
54    _: &'reg handlebars::Handlebars<'reg>,
55    _: &'rc handlebars::Context,
56    _: &mut handlebars::RenderContext<'reg, 'rc>,
57  ) -> Result<handlebars::ScopedJson<'reg, 'rc>, handlebars::RenderError> {
58    h.ensure_arguments_count(1, IS_OAPI3_PARAM_REQUIRED)?;
59    let json = h.get_param_as_json_or_fail(0, IS_OAPI3_PARAM_REQUIRED)?;
60    let required = json["required"].as_bool().unwrap_or(false);
61    Ok(ScopedJson::Derived(Value::Bool(required)))
62  }
63}
64
65/// Returns true is the current context is an open api 3 required component property,
66/// false otherwise
67/// ```
68/// # use codegenr_lib::helpers::*;
69/// # use serde_json::json;
70/// let json = json!({
71///   "type": "object",
72///   "properties": {
73///     "id": {
74///       "type": "integer"
75///     },
76///     "username": {
77///       "type": "string"
78///     },
79///     "name": {
80///       "type": "string"
81///     }
82///   },
83///   "required": [
84///     "id",
85///     "username"
86///   ]
87/// });
88/// assert_eq!(
89///   exec_template(json, "{{#each properties}}{{@key}} is {{#if (is_oapi3_property_required @key ../required)}}required{{else}}not required{{/if}}\n{{/each}}"),
90///   r#"id is required
91/// username is required
92/// name is not required
93/// "#
94/// );
95/// ```
96pub struct IsOApi3PropRequiredHelper;
97
98impl HelperDef for IsOApi3PropRequiredHelper {
99  fn call_inner<'reg: 'rc, 'rc>(
100    &self,
101    h: &handlebars::Helper<'reg, 'rc>,
102    _: &'reg handlebars::Handlebars<'reg>,
103    _: &'rc handlebars::Context,
104    _: &mut handlebars::RenderContext<'reg, 'rc>,
105  ) -> Result<handlebars::ScopedJson<'reg, 'rc>, handlebars::RenderError> {
106    h.ensure_arguments_count(2, IS_OAPI3_PROP_REQUIRED)?;
107    let name = h.get_param_as_json_or_fail(0, IS_OAPI3_PROP_REQUIRED)?;
108    let required = h
109      .get_param_as_array(1)
110      .map(|required_array| required_array.iter().any(|s| s == name))
111      .unwrap_or(false);
112    Ok(ScopedJson::Derived(Value::Bool(required)))
113  }
114}