impl/
impl.rs

1use arrow::array::*;
2use arrow_message::prelude::*;
3
4#[derive(Debug)]
5struct Metadata {
6    name: Option<String>,
7    width: u32,
8    height: u32,
9}
10
11impl ArrowMessage for Metadata {
12    fn field(name: impl Into<String>) -> Field {
13        make_union_fields(
14            name,
15            vec![
16                Option::<String>::field("name"),
17                Option::<u32>::field("width"),
18                Option::<u32>::field("height"),
19            ],
20        )
21    }
22
23    fn try_from_arrow(data: arrow::array::ArrayData) -> arrow::error::Result<Self>
24    where
25        Self: Sized,
26    {
27        let (map, children) = unpack_union(data);
28
29        Ok(Metadata {
30            name: extract_union_data("name", &map, &children)?,
31            width: extract_union_data("width", &map, &children)?,
32            height: extract_union_data("height", &map, &children)?,
33        })
34    }
35
36    fn try_into_arrow(self) -> arrow::error::Result<arrow::array::ArrayRef> {
37        let union_fields = get_union_fields::<Self>()?;
38
39        make_union_array(
40            union_fields,
41            vec![
42                self.name.try_into_arrow()?,
43                self.width.try_into_arrow()?,
44                self.height.try_into_arrow()?,
45            ],
46        )
47    }
48}
49
50impl TryFrom<ArrayData> for Metadata {
51    type Error = arrow::error::ArrowError;
52
53    fn try_from(data: ArrayData) -> arrow::error::Result<Self> {
54        Metadata::try_from_arrow(data)
55    }
56}
57
58impl TryFrom<Metadata> for ArrayData {
59    type Error = arrow::error::ArrowError;
60
61    fn try_from(metadata: Metadata) -> arrow::error::Result<Self> {
62        metadata.try_into_arrow().map(|array| array.into_data())
63    }
64}
65
66#[derive(Debug)]
67struct Image {
68    data: UInt8Array,
69    metadata: Option<Metadata>,
70}
71
72impl ArrowMessage for Image {
73    fn field(name: impl Into<String>) -> Field {
74        make_union_fields(
75            name,
76            vec![
77                UInt8Array::field("data"),
78                Option::<Metadata>::field("metadata"),
79            ],
80        )
81    }
82
83    fn try_from_arrow(data: arrow::array::ArrayData) -> arrow::error::Result<Self>
84    where
85        Self: Sized,
86    {
87        let (map, children) = unpack_union(data);
88
89        Ok(Image {
90            data: extract_union_data("data", &map, &children)?,
91            metadata: extract_union_data("metadata", &map, &children)?,
92        })
93    }
94
95    fn try_into_arrow(self) -> arrow::error::Result<arrow::array::ArrayRef> {
96        let union_fields = get_union_fields::<Self>()?;
97
98        make_union_array(
99            union_fields,
100            vec![self.data.try_into_arrow()?, self.metadata.try_into_arrow()?],
101        )
102    }
103}
104
105impl TryFrom<ArrayData> for Image {
106    type Error = arrow::error::ArrowError;
107
108    fn try_from(data: ArrayData) -> arrow::error::Result<Self> {
109        Image::try_from_arrow(data)
110    }
111}
112
113impl TryFrom<Image> for ArrayData {
114    type Error = arrow::error::ArrowError;
115
116    fn try_from(image: Image) -> arrow::error::Result<Self> {
117        image.try_into_arrow().map(|array| array.into_data())
118    }
119}
120
121fn main() -> arrow::error::Result<()> {
122    let image = Image {
123        data: UInt8Array::from(vec![1, 2, 3]),
124        metadata: Some(Metadata {
125            name: Some("example".to_string()),
126            width: 12,
127            height: 12,
128        }),
129    };
130
131    println!("{:?}", image);
132
133    let arrow = ArrayData::try_from(image)?;
134    let image = Image::try_from(arrow)?;
135
136    println!("{:?}", image);
137
138    Ok(())
139}