1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
use super::Vec3D;
use arrow2_convert::{ArrowDeserialize, ArrowField, ArrowSerialize};

use crate::Component;

/// A 3D Arrow
///
/// ## Examples
///
/// ```
/// use re_log_types::component_types::Arrow3D;
/// use arrow2_convert::field::ArrowField;
/// use arrow2::datatypes::{DataType, Field};
///
/// assert_eq!(
///     Arrow3D::data_type(),
///     DataType::Struct(vec![
///         Field::new("origin",
///                    DataType::FixedSizeList(
///                        Box::new(Field::new("item", DataType::Float32, false)),
///                        3
///                    ),
///                    false),
///         Field::new("vector",
///                    DataType::FixedSizeList(
///                        Box::new(Field::new("item", DataType::Float32, false)),
///                        3
///                    ),
///                    false),
///     ])
/// );
/// ```
#[derive(Clone, Debug, ArrowField, ArrowSerialize, ArrowDeserialize, PartialEq)]
#[cfg_attr(feature = "serde", derive(serde::Deserialize, serde::Serialize))]
pub struct Arrow3D {
    pub origin: Vec3D,
    pub vector: Vec3D,
}

impl Component for Arrow3D {
    #[inline]
    fn name() -> crate::ComponentName {
        "rerun.arrow3d".into()
    }
}

#[test]
fn test_arrow3d_roundtrip() {
    use arrow2::array::Array;
    use arrow2_convert::{deserialize::TryIntoCollection, serialize::TryIntoArrow};

    let arrows_in = vec![
        Arrow3D {
            origin: [1.0, 2.0, 3.0].into(),
            vector: [4.0, 5.0, 6.0].into(),
        },
        Arrow3D {
            origin: [11.0, 12.0, 13.0].into(),
            vector: [14.0, 15.0, 16.0].into(),
        },
    ];
    let array: Box<dyn Array> = arrows_in.try_into_arrow().unwrap();
    let arrows_out: Vec<Arrow3D> = TryIntoCollection::try_into_collection(array).unwrap();
    assert_eq!(arrows_in, arrows_out);
}