Skip to main content

scratch_test_model/blocks/
expr_or_cmp.rs

1use 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}