Skip to main content

egml_core/model/
abstract_object_kind.rs

1use crate::model::base::AbstractGmlKind;
2use crate::model::geometry::Envelope;
3use crate::model::geometry::primitives::AbstractSurfacePatchKind;
4
5#[derive(Debug, Clone, PartialEq)]
6pub enum AbstractObjectKind {
7    AbstractGmlKind(AbstractGmlKind),
8    AbstractSurfacePatchKind(AbstractSurfacePatchKind),
9    Envelope(Envelope),
10}
11
12#[macro_export]
13macro_rules! impl_from_for_abstract_object_kind {
14    ($variant:ident, $type:ty) => {
15        impl From<$type> for $crate::model::AbstractObjectKind {
16            #[allow(unreachable_code)]
17            fn from(x: $type) -> Self {
18                $crate::model::AbstractObjectKind::$variant(x.into())
19            }
20        }
21    };
22    ($variant:ident) => {
23        $crate::impl_from_for_abstract_object_kind!($variant, $variant);
24    };
25}
26
27#[macro_export]
28macro_rules! impl_try_from_for_abstract_object_kind {
29    ($variant:ident, $type:ty) => {
30        impl TryFrom<$crate::model::AbstractObjectKind> for $type {
31            type Error = ();
32            #[allow(unreachable_code)]
33            fn try_from(x: $crate::model::AbstractObjectKind) -> Result<Self, ()> {
34                match x {
35                    $crate::model::AbstractObjectKind::$variant(k) => k.try_into().map_err(|_| ()),
36                    #[allow(unreachable_patterns)]
37                    _ => Err(()),
38                }
39            }
40        }
41    };
42    ($variant:ident) => {
43        $crate::impl_try_from_for_abstract_object_kind!($variant, $variant);
44    };
45}
46
47impl_from_for_abstract_object_kind!(AbstractGmlKind);
48impl_from_for_abstract_object_kind!(AbstractSurfacePatchKind);
49
50impl From<Envelope> for AbstractObjectKind {
51    fn from(x: Envelope) -> Self {
52        AbstractObjectKind::Envelope(x)
53    }
54}
55
56impl_try_from_for_abstract_object_kind!(AbstractGmlKind);
57impl_try_from_for_abstract_object_kind!(AbstractSurfacePatchKind);
58
59impl TryFrom<AbstractObjectKind> for Envelope {
60    type Error = ();
61    fn try_from(x: AbstractObjectKind) -> Result<Self, ()> {
62        match x {
63            AbstractObjectKind::Envelope(e) => Ok(e),
64            _ => Err(()),
65        }
66    }
67}