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) -> Result<Self, ArrowError>
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) -> Result<arrow::array::ArrayRef, ArrowError> {
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 = ArrowError;
52
53 fn try_from(data: ArrayData) -> Result<Self, Self::Error> {
54 Metadata::try_from_arrow(data)
55 }
56}
57
58impl TryFrom<Metadata> for ArrayData {
59 type Error = ArrowError;
60
61 fn try_from(metadata: Metadata) -> Result<Self, Self::Error> {
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) -> Result<Self, ArrowError>
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) -> Result<arrow::array::ArrayRef, ArrowError> {
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 = ArrowError;
107
108 fn try_from(data: ArrayData) -> Result<Self, Self::Error> {
109 Image::try_from_arrow(data)
110 }
111}
112
113impl TryFrom<Image> for ArrayData {
114 type Error = ArrowError;
115
116 fn try_from(image: Image) -> Result<Self, Self::Error> {
117 image.try_into_arrow().map(|array| array.into_data())
118 }
119}
120
121fn main() -> Result<()> {
122 use miette::IntoDiagnostic;
123
124 let image = Image {
125 data: UInt8Array::from(vec![1, 2, 3]),
126 metadata: Some(Metadata {
127 name: Some("example".to_string()),
128 width: 12,
129 height: 12,
130 }),
131 };
132
133 println!("{:?}", image);
134
135 let arrow = ArrayData::try_from(image).into_diagnostic()?;
136 let image = Image::try_from(arrow).into_diagnostic()?;
137
138 println!("{:?}", image);
139
140 Ok(())
141}