scratch_test_model/blocks/
expr_or_cmp.rs1use crate::attrs::{DoForAttrs, DoForAttrsStrategy};
2
3use super::{CmpBlockKind, CmpBlockKindUnit, ExprBlockKind, ExprBlockKindUnit};
4
5#[derive(Debug, PartialEq, Clone, derive_more::From)]
6pub enum ExprOrCmpBlockKind {
7 Expr(ExprBlockKind),
8 Cmp(CmpBlockKind),
9}
10
11#[derive(
12 derive_more::Display,
13 Debug,
14 PartialEq,
15 Clone,
16 derive_more::From,
17 Copy,
18 Eq,
19 PartialOrd,
20 Ord,
21 Hash,
22)]
23#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))]
24#[cfg_attr(feature = "serde", derive(serde::Deserialize, serde::Serialize))]
25#[cfg_attr(feature = "serde", serde(untagged))]
26pub enum ExprOrCmpBlockKindUnit {
27 #[display("{_0}")]
28 Expr(ExprBlockKindUnit),
29 #[display("{_0}")]
30 Cmp(CmpBlockKindUnit),
31}
32
33#[cfg(feature = "utoipa")]
34impl utoipa::PartialSchema for ExprOrCmpBlockKindUnit {
35 fn schema() -> utoipa::openapi::RefOr<utoipa::openapi::schema::Schema> {
36 let inner = [ExprBlockKindUnit::schema(), CmpBlockKindUnit::schema()];
37
38 use itertools::Itertools;
39 use utoipa::openapi::RefOr;
40 use utoipa::openapi::schema::Schema;
41
42 let enum_values = inner
43 .into_iter()
44 .flat_map(|s| match s {
45 RefOr::T(Schema::Object(o)) => o.enum_values,
46 _ => panic!("unexpected schema kind"),
47 })
48 .flatten()
49 .sorted_by_key(ToString::to_string)
50 .collect_vec();
51
52 let mut object = utoipa::openapi::schema::Object::new();
53 object.enum_values = Some(enum_values);
54
55 RefOr::T(Schema::Object(object))
56 }
57}
58#[cfg(feature = "utoipa")]
59impl utoipa::ToSchema for ExprOrCmpBlockKindUnit {
60 fn name() -> std::borrow::Cow<'static, str> {
61 "ExprOrCmpBlockKindUnit".into()
62 }
63}
64
65impl<'a, S: DoForAttrsStrategy<'a>> DoForAttrs<'a, S> for ExprOrCmpBlockKind
66where
67 ExprBlockKind: DoForAttrs<'a, S>,
68 CmpBlockKind: DoForAttrs<'a, S>,
69{
70 fn do_for_attrs(
71 &'a self,
72 inputs: &<S as DoForAttrsStrategy<'a>>::Inputs,
73 outputs: &mut <S as DoForAttrsStrategy<'a>>::Outputs,
74 ) -> Result<(), <S as DoForAttrsStrategy<'a>>::Error> {
75 match self {
76 Self::Expr(k) => k.do_for_attrs(inputs, outputs),
77 Self::Cmp(k) => k.do_for_attrs(inputs, outputs),
78 }
79 }
80}