array_object/convert/
into_string.rs1use crate::adaptor::*;
2use crate::error::ArrayObjectError;
3use crate::storage::*;
4
5impl TryFrom<ArrayObject> for String {
6 type Error = ArrayObjectError;
7 fn try_from(val: ArrayObject) -> Result<Self, Self::Error> {
8 if !val.shape.is_empty() || val.datatype != DataType::String {
9 return Err(ArrayObjectError::WrongDataType(
10 val.datatype,
11 val.shape.len(),
12 ));
13 }
14 Ok(String::from_utf8(val.data).unwrap())
15 }
16}
17
18impl TryFrom<ArrayObject> for VecShape<String> {
19 type Error = ArrayObjectError;
20 fn try_from(mut val: ArrayObject) -> Result<Self, Self::Error> {
21 if val.shape.is_empty() || val.datatype != DataType::String {
22 return Err(ArrayObjectError::WrongDataType(
23 val.datatype,
24 val.shape.len(),
25 ));
26 }
27 if val.len() == 0 {
28 return Ok(VecShape(vec![], val.shape));
29 }
30 let mut data = vec![];
31 while let Some(p) = val.data.iter().position(|&x| x == 255) {
32 let mut s = val.data.split_off(p + 1);
33 std::mem::swap(&mut s, &mut val.data);
34 s.pop();
35 data.push(String::from_utf8(s).unwrap());
36 }
37 data.push(String::from_utf8(val.data).unwrap());
38 Ok(VecShape(data, val.shape))
39 }
40}
41
42impl TryFrom<ArrayObject> for Vec<String> {
43 type Error = ArrayObjectError;
44 fn try_from(val: ArrayObject) -> Result<Self, Self::Error> {
45 if val.shape.len() != 1 {
46 return Err(ArrayObjectError::WrongDataType(
47 val.datatype,
48 val.shape.len(),
49 ));
50 }
51 let VecShape::<String>(data, _) = val.try_into()?;
52 Ok(data)
53 }
54}
55
56impl<const N: usize> TryFrom<ArrayObject> for [String; N] {
57 type Error = ArrayObjectError;
58 fn try_from(val: ArrayObject) -> Result<Self, Self::Error> {
59 if val.len() != N {
60 return Err(ArrayObjectError::WrongDataType(
61 val.datatype,
62 val.shape.len(),
63 ));
64 }
65 let data: Vec<String> = val.try_into()?;
66 Ok(data.try_into().unwrap())
67 }
68}