k8s_openapi_codegen_common/templates/
json_schema_props_or.rs

1pub(crate) fn generate(
2    mut writer: impl std::io::Write,
3    type_name: &str,
4    or: Or,
5    json_schema_props_type_name: &str,
6    map_namespace: &impl crate::MapNamespace,
7) -> Result<(), crate::Error> {
8    let local = crate::map_namespace_local_to_string(map_namespace)?;
9
10    let or_variant_name = match or {
11        Or::Array => "Schemas",
12        Or::Bool => "Bool",
13        Or::StringArray => "Strings",
14    };
15
16    let or_variant_type: std::borrow::Cow<'_, str> = match or {
17        Or::Array => format!("std::vec::Vec<{json_schema_props_type_name}>").into(),
18        Or::Bool => "bool".into(),
19        Or::StringArray => "std::vec::Vec<std::string::String>".into(),
20    };
21
22    let mut or_visit = String::new();
23    match or {
24        Or::Array => {
25            use std::fmt::Write;
26
27            writeln!(or_visit, "            fn visit_seq<A>(self, seq: A) -> Result<Self::Value, A::Error> where A: {local}serde::de::SeqAccess<'de> {{")?;
28            writeln!(or_visit,
29                "                Ok({type_name}::Schemas({local}serde::de::Deserialize::deserialize({local}serde::de::value::SeqAccessDeserializer::new(seq))?))")?;
30            writeln!(or_visit, "            }}")?;
31        },
32
33        Or::Bool => {
34            use std::fmt::Write;
35
36            writeln!(or_visit, "            fn visit_bool<E>(self, v: bool) -> Result<Self::Value, E> where E: {local}serde::de::Error {{")?;
37            writeln!(or_visit, "                Ok({type_name}::Bool(v))")?;
38            writeln!(or_visit, "            }}")?;
39        },
40
41        Or::StringArray => {
42            use std::fmt::Write;
43
44            writeln!(or_visit, "            fn visit_seq<A>(self, seq: A) -> Result<Self::Value, A::Error> where A: {local}serde::de::SeqAccess<'de> {{")?;
45            writeln!(or_visit,
46                "                Ok({type_name}::Strings({local}serde::de::Deserialize::deserialize({local}serde::de::value::SeqAccessDeserializer::new(seq))?))")?;
47            writeln!(or_visit, "            }}")?;
48        },
49    }
50
51    writeln!(
52        writer,
53        include_str!(concat!(env!("CARGO_MANIFEST_DIR"), "/templates/json_schema_props_or.rs")),
54        local = local,
55        type_name = type_name,
56        json_schema_props_type_name = json_schema_props_type_name,
57        or_variant_name = or_variant_name,
58        or_variant_type = or_variant_type,
59        or_visit = or_visit,
60    )?;
61
62    Ok(())
63}
64
65#[derive(Clone, Copy)]
66pub(crate) enum Or {
67    Array,
68    Bool,
69    StringArray,
70}