arrow_schema/extension/canonical/
uuid.rs1use crate::{ArrowError, DataType, extension::ExtensionType};
23
24#[derive(Debug, Default, Clone, Copy, PartialEq)]
38pub struct Uuid;
39
40impl ExtensionType for Uuid {
41 const NAME: &'static str = "arrow.uuid";
42
43 type Metadata = ();
44
45 fn metadata(&self) -> &Self::Metadata {
46 &()
47 }
48
49 fn serialize_metadata(&self) -> Option<String> {
50 None
51 }
52
53 fn deserialize_metadata(metadata: Option<&str>) -> Result<Self::Metadata, ArrowError> {
54 metadata.map_or_else(
55 || Ok(()),
56 |_| {
57 Err(ArrowError::InvalidArgumentError(
58 "Uuid extension type expects no metadata".to_owned(),
59 ))
60 },
61 )
62 }
63
64 fn supports_data_type(&self, data_type: &DataType) -> Result<(), ArrowError> {
65 match data_type {
66 DataType::FixedSizeBinary(16) => Ok(()),
67 data_type => Err(ArrowError::InvalidArgumentError(format!(
68 "Uuid data type mismatch, expected FixedSizeBinary(16), found {data_type}"
69 ))),
70 }
71 }
72
73 fn try_new(data_type: &DataType, _metadata: Self::Metadata) -> Result<Self, ArrowError> {
74 Self.supports_data_type(data_type).map(|_| Self)
75 }
76
77 fn validate(data_type: &DataType, _metadata: Self::Metadata) -> Result<(), ArrowError> {
78 Self.supports_data_type(data_type)
79 }
80}
81
82#[cfg(test)]
83mod tests {
84 #[cfg(feature = "canonical_extension_types")]
85 use crate::extension::CanonicalExtensionType;
86 use crate::{
87 Field,
88 extension::{EXTENSION_TYPE_METADATA_KEY, EXTENSION_TYPE_NAME_KEY},
89 };
90
91 use super::*;
92
93 #[test]
94 fn valid() -> Result<(), ArrowError> {
95 let mut field = Field::new("", DataType::FixedSizeBinary(16), false);
96 field.try_with_extension_type(Uuid)?;
97 field.try_extension_type::<Uuid>()?;
98 #[cfg(feature = "canonical_extension_types")]
99 assert_eq!(
100 field.try_canonical_extension_type()?,
101 CanonicalExtensionType::Uuid(Uuid)
102 );
103 Ok(())
104 }
105
106 #[test]
107 #[should_panic(expected = "Extension type name missing")]
108 fn missing_name() {
109 let field = Field::new("", DataType::FixedSizeBinary(16), false);
110 field.extension_type::<Uuid>();
111 }
112
113 #[test]
114 #[should_panic(expected = "expected FixedSizeBinary(16), found FixedSizeBinary(8)")]
115 fn invalid_type() {
116 Field::new("", DataType::FixedSizeBinary(8), false).with_extension_type(Uuid);
117 }
118
119 #[test]
120 #[should_panic(expected = "Uuid extension type expects no metadata")]
121 fn with_metadata() {
122 let field = Field::new("", DataType::FixedSizeBinary(16), false).with_metadata(
123 [
124 (EXTENSION_TYPE_NAME_KEY.to_owned(), Uuid::NAME.to_owned()),
125 (EXTENSION_TYPE_METADATA_KEY.to_owned(), "".to_owned()),
126 ]
127 .into_iter()
128 .collect(),
129 );
130 field.extension_type::<Uuid>();
131 }
132}