chroma_types/
scalar_encoding.rs1use 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}