geoarrow_geojson/encoder/
wkt.rs1use arrow_array::OffsetSizeTrait;
2use arrow_json::Encoder;
3use geoarrow_array::GeoArrowArrayAccessor;
4use geoarrow_array::array::{GenericWktArray, WktViewArray};
5
6use crate::encoder::geometry::encode_geometry;
7
8pub struct GenericWktEncoder<O: OffsetSizeTrait>(GenericWktArray<O>);
10
11impl<O: OffsetSizeTrait> GenericWktEncoder<O> {
12 pub fn new(array: GenericWktArray<O>) -> Self {
13 Self(array)
14 }
15}
16
17impl<O: OffsetSizeTrait> Encoder for GenericWktEncoder<O> {
18 fn encode(&mut self, idx: usize, out: &mut Vec<u8>) {
19 let geom = self.0.value(idx).unwrap();
20 encode_geometry(&geom, out);
21 }
22}
23
24pub struct WktViewEncoder(WktViewArray);
26
27impl WktViewEncoder {
28 pub fn new(array: WktViewArray) -> Self {
29 Self(array)
30 }
31}
32
33impl Encoder for WktViewEncoder {
34 fn encode(&mut self, idx: usize, out: &mut Vec<u8>) {
35 let geom = self.0.value(idx).unwrap();
36 encode_geometry(&geom, out);
37 }
38}
39
40#[cfg(test)]
41mod test {
42 use geoarrow_array::cast::to_wkt;
43 use geoarrow_array::test::geometry::array;
44 use geoarrow_schema::CoordType;
45
46 use super::*;
47
48 #[test]
49 fn encode_geometry() {
50 let geom_array = array(CoordType::Separated, false);
51 let wkt_arr = to_wkt::<i32>(&geom_array).unwrap();
52 let mut encoder = GenericWktEncoder::new(wkt_arr);
53
54 let mut out = vec![];
55 encoder.encode(0, &mut out);
56 let s = String::from_utf8(out).unwrap();
57 let expected = r#"{"type":"Point","coordinates":[30,10]}"#;
58 assert_eq!(s, expected);
59 }
60}