cassandra_cpp/cassandra/schema/
column_meta.rs1use crate::cassandra::data_type::ConstDataType;
2
3use crate::cassandra::iterator::FieldIterator;
4use crate::cassandra::util::{Protected, ProtectedInner};
5use crate::cassandra::value::Value;
6use crate::cassandra_sys::cass_column_meta_data_type;
7use crate::cassandra_sys::cass_column_meta_field_by_name_n;
8use crate::cassandra_sys::cass_column_meta_name;
9use crate::cassandra_sys::cass_column_meta_type;
10use crate::cassandra_sys::cass_iterator_fields_from_column_meta;
11use crate::cassandra_sys::CassColumnMeta as _CassColumnMeta;
12use crate::cassandra_sys::CassColumnType as _CassColumnType;
13
14use std::marker::PhantomData;
15use std::os::raw::c_char;
16use std::slice;
17use std::str;
18
19#[derive(Debug)]
23pub struct ColumnMeta<'a>(*const _CassColumnMeta, PhantomData<&'a _CassColumnMeta>);
24
25impl ProtectedInner<*const _CassColumnMeta> for ColumnMeta<'_> {
26 fn inner(&self) -> *const _CassColumnMeta {
27 self.0
28 }
29}
30
31impl Protected<*const _CassColumnMeta> for ColumnMeta<'_> {
32 fn build(inner: *const _CassColumnMeta) -> Self {
33 if inner.is_null() {
34 panic!("Unexpected null pointer")
35 };
36 ColumnMeta(inner, PhantomData)
37 }
38}
39
40impl<'a> ColumnMeta<'a> {
41 pub fn field_iter(&self) -> FieldIterator<'a> {
43 unsafe { FieldIterator::build(cass_iterator_fields_from_column_meta(self.0)) }
44 }
45
46 pub fn name(&self) -> String {
48 let mut name = std::ptr::null();
49 let mut name_length = 0;
50 unsafe {
51 cass_column_meta_name(self.0, &mut name, &mut name_length);
52 let slice = slice::from_raw_parts(name as *const u8, name_length);
53 str::from_utf8(slice).expect("must be utf8").to_owned()
54 }
55 }
56
57 pub fn get_type(&self) -> _CassColumnType {
59 unsafe { cass_column_meta_type(self.0) }
60 }
61
62 pub fn data_type(&self) -> ConstDataType<'a> {
64 unsafe { ConstDataType::build(cass_column_meta_data_type(self.0)) }
65 }
66
67 pub fn field_by_name(&self, name: &str) -> Option<Value<'a>> {
70 unsafe {
71 let name_ptr = name.as_ptr() as *const c_char;
72 let field = cass_column_meta_field_by_name_n(self.0, name_ptr, name.len());
73 if field.is_null() {
74 None
75 } else {
76 Some(Value::build(field))
77 }
78 }
79 }
80}