#![no_std]
#[cfg(feature = "tok")]
extern crate alloc;
#[cfg(feature = "tok")]
pub mod tok;
#[cfg(feature = "serde")]
use serde::{
Deserialize,
Serialize
};
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
#[derive(Clone, Copy, PartialEq, Eq, Hash, Debug, Default)]
pub enum CXX {
C,
#[default]
CXX,
CXXOnly
}
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
#[derive(Clone, Copy, PartialEq, Eq, Hash, Debug, Default)]
pub enum Variadic {
#[default]
Nary,
Variadic
}
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
#[derive(Clone, Copy, Hash, Debug, Default)]
pub struct Header<'a> {
path: Option<&'a str>,
name: &'a str,
guard: Option<HeaderGuard<'a>>,
funcs_ptr: usize, num_funcs: usize,
macros_ptr: usize, num_macros: usize,
types_ptr: usize, num_types: usize,
cxx: CXX,
extra: Option<&'a str>,
post_extra: Option<&'a str>
}
impl<'a> Header<'a> {
pub fn new(
path: Option<&'a str>,
name: &'a str,
guard: Option<HeaderGuard<'a>>,
funcs: &'a [Func<'a>],
macros: &'a [Macro<'a>],
types: &'a [Type<'a>],
cxx: CXX,
extra: Option<&'a str>,
post_extra: Option<&'a str>
) -> Self {
let funcs_ptr = funcs.as_ptr() as usize;
let macros_ptr= macros.as_ptr() as usize;
let types_ptr = types.as_ptr() as usize;
Self {
path,
name,
guard,
funcs_ptr,
macros_ptr,
types_ptr,
extra,
post_extra,
cxx,
num_funcs: funcs.len(),
num_types: types.len(),
num_macros: macros.len()
}
}
pub fn path(&self) -> Option<&'a str> {
self.path
}
pub fn name(&self) -> &'a str {
self.name
}
pub fn guard(&self) -> Option<HeaderGuard> {
self.guard
}
pub fn funcs(&self) -> &'a [Func<'a>] {
unsafe {
core::slice::from_raw_parts(self.funcs_ptr as *const Func<'a>, self.num_funcs)
}
}
pub fn macros(&self) -> &'a [Macro<'a>] {
unsafe {
core::slice::from_raw_parts(self.macros_ptr as *const Macro<'a>, self.num_macros)
}
}
pub fn types(&self) -> &'a [Type<'a>] {
unsafe {
core::slice::from_raw_parts(self.types_ptr as *const Type<'a>, self.num_types)
}
}
pub fn cxx(&self) -> CXX {
self.cxx
}
pub fn extra(&self) -> Option<&'a str> {
self.extra
}
pub fn post_extra(&self) -> Option<&'a str> {
self.post_extra
}
}
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
#[derive(Clone, Copy, Hash, Debug, Default)]
pub struct Type<'a> {
name: &'a str,
r#type: &'a str
}
impl<'a> Type<'a> {
pub fn new(
name: &'a str,
r#type: &'a str
) -> Self {
Self {
name,
r#type
}
}
pub fn name(&self) -> &'a str {
self.name
}
pub fn r#type(&self) -> &'a str {
self.r#type
}
}
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
#[derive(Clone, Copy, Hash, Debug, Default)]
pub struct HeaderGuard<'a> {
tok: &'a str,
val: &'a str
}
impl<'a> HeaderGuard<'a> {
pub fn new(
tok: &'a str,
val: &'a str
) -> Self {
Self {
tok,
val
}
}
pub fn tok(&self) -> &'a str {
self.tok
}
pub fn val(&self) -> &'a str {
self.val
}
}
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
#[derive(Clone, Copy, Hash, Debug, Default)]
pub struct Func<'a> {
out: &'a str,
name: &'a str,
params_ptr: usize, num_params: usize,
va: Variadic
}
impl<'a> Func<'a> {
pub fn new(
out: &'a str,
name: &'a str,
params: &'a[&'a str],
va: Variadic
) -> Self {
let params_ptr = params.as_ptr() as usize;
Self {
out,
name,
va,
params_ptr,
num_params: params.len()
}
}
pub fn out(&self) -> &'a str {
self.out
}
pub fn name(&self) -> &'a str {
self.name
}
pub fn params(&self) -> &'a [&'a str] {
unsafe {
core::slice::from_raw_parts(self.params_ptr as *const &'a str, self.num_params)
}
}
pub fn va(&self) -> Variadic {
self.va
}
}
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
#[derive(Clone, Copy, Hash, Debug, Default)]
pub struct Macro<'a> {
tok: &'a str,
val: &'a str,
}
impl<'a> Macro<'a> {
pub fn new(
tok: &'a str,
val: &'a str
) -> Self {
Self {
tok,
val
}
}
pub fn tok(&self) -> &'a str {
self.tok
}
pub fn val(&self) -> &'a str {
self.val
}
}