use crate::plugin::tables::data::FieldTypeId;
use falco_plugin_api::{ss_plugin_field_type, ss_plugin_table_fieldinfo};
use std::sync::Arc;
#[derive(Clone, Copy, Eq, PartialEq, Debug, PartialOrd, Ord)]
#[allow(missing_docs)]
pub enum FieldId {
Static(usize),
Dynamic(usize),
}
#[allow(missing_docs)]
#[derive(Debug)]
pub enum FieldRef {
Static(&'static FieldDescriptor),
Dynamic(Arc<FieldDescriptor>),
}
impl AsRef<FieldDescriptor> for FieldRef {
fn as_ref(&self) -> &FieldDescriptor {
match self {
FieldRef::Static(s) => s,
FieldRef::Dynamic(d) => d.as_ref(),
}
}
}
#[derive(Debug)]
pub struct FieldDescriptor {
pub(in crate::plugin::exported_tables) index: FieldId,
pub(in crate::plugin::exported_tables) type_id: FieldTypeId,
pub(in crate::plugin::exported_tables) read_only: bool,
}
impl FieldDescriptor {
pub const fn maybe_new(
index: FieldId,
type_id: Option<FieldTypeId>,
read_only: bool,
) -> Option<Self> {
match type_id {
Some(type_id) => Some(Self {
index,
type_id,
read_only,
}),
None => None,
}
}
pub fn to_raw(&self, name: &'static [u8]) -> ss_plugin_table_fieldinfo {
ss_plugin_table_fieldinfo {
name: name.as_ptr().cast(),
field_type: self.type_id as ss_plugin_field_type,
read_only: self.read_only.into(),
}
}
}