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}