array_object/convert/
into_string.rs

1use 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}