chroma_types/
scalar_encoding.rs

1use super::ConversionError;
2use crate::chroma_proto;
3use chroma_error::{ChromaError, ErrorCodes};
4use thiserror::Error;
5
6#[derive(Clone, Debug, PartialEq)]
7pub enum ScalarEncoding {
8    FLOAT32,
9    INT32,
10}
11
12#[derive(Error, Debug)]
13pub enum ScalarEncodingConversionError {
14    #[error("Invalid encoding, valid encodings are: Float32, Int32")]
15    InvalidEncoding,
16    #[error(transparent)]
17    DecodeError(#[from] ConversionError),
18}
19
20impl_base_convert_error!(ScalarEncodingConversionError, {
21    ScalarEncodingConversionError::InvalidEncoding => ErrorCodes::InvalidArgument,
22});
23
24impl TryFrom<chroma_proto::ScalarEncoding> for ScalarEncoding {
25    type Error = ScalarEncodingConversionError;
26
27    fn try_from(encoding: chroma_proto::ScalarEncoding) -> Result<Self, Self::Error> {
28        match encoding {
29            chroma_proto::ScalarEncoding::Float32 => Ok(ScalarEncoding::FLOAT32),
30            chroma_proto::ScalarEncoding::Int32 => Ok(ScalarEncoding::INT32),
31        }
32    }
33}
34
35impl TryFrom<i32> for ScalarEncoding {
36    type Error = ScalarEncodingConversionError;
37
38    fn try_from(encoding: i32) -> Result<Self, Self::Error> {
39        let maybe_encoding = chroma_proto::ScalarEncoding::try_from(encoding);
40        match maybe_encoding {
41            Ok(encoding) => match encoding {
42                chroma_proto::ScalarEncoding::Float32 => Ok(ScalarEncoding::FLOAT32),
43                chroma_proto::ScalarEncoding::Int32 => Ok(ScalarEncoding::INT32),
44            },
45            Err(_) => Err(ScalarEncodingConversionError::DecodeError(
46                ConversionError::DecodeError,
47            )),
48        }
49    }
50}
51
52impl TryFrom<&str> for ScalarEncoding {
53    type Error = ScalarEncodingConversionError;
54
55    fn try_from(encoding: &str) -> Result<Self, Self::Error> {
56        match encoding {
57            "FLOAT32" => Ok(ScalarEncoding::FLOAT32),
58            "INT32" => Ok(ScalarEncoding::INT32),
59            _ => Err(ScalarEncodingConversionError::InvalidEncoding),
60        }
61    }
62}
63
64impl From<ScalarEncoding> for String {
65    fn from(encoding: ScalarEncoding) -> String {
66        match encoding {
67            ScalarEncoding::FLOAT32 => "FLOAT32".to_string(),
68            ScalarEncoding::INT32 => "INT32".to_string(),
69        }
70    }
71}
72
73impl From<&ScalarEncoding> for String {
74    fn from(encoding: &ScalarEncoding) -> String {
75        match encoding {
76            ScalarEncoding::FLOAT32 => "FLOAT32".to_string(),
77            ScalarEncoding::INT32 => "INT32".to_string(),
78        }
79    }
80}
81
82#[cfg(test)]
83mod tests {
84    use super::*;
85
86    #[test]
87    fn test_scalar_encoding_try_from() {
88        let proto_encoding = chroma_proto::ScalarEncoding::Float32;
89        let converted_encoding: ScalarEncoding = proto_encoding.try_into().unwrap();
90        assert_eq!(converted_encoding, ScalarEncoding::FLOAT32);
91    }
92}