basic api definition interface
This commit is contained in:
commit
f7ae7281b3
|
@ -0,0 +1 @@
|
||||||
|
/target
|
|
@ -0,0 +1,6 @@
|
||||||
|
[package]
|
||||||
|
name = "nonx"
|
||||||
|
version = "0.1.0"
|
||||||
|
edition = "2021"
|
||||||
|
|
||||||
|
[dependencies]
|
|
@ -0,0 +1,10 @@
|
||||||
|
#![no_std]
|
||||||
|
|
||||||
|
extern crate alloc;
|
||||||
|
|
||||||
|
pub mod utils;
|
||||||
|
|
||||||
|
api_remapper! {
|
||||||
|
api!(nonx::mem::alloc(size: usize, align: usize) -> *mut u8);
|
||||||
|
api!(nonx::mem::free(ptr: *mut u8, size: usize, align: usize));
|
||||||
|
}
|
|
@ -0,0 +1,84 @@
|
||||||
|
use alloc::{collections::btree_map::BTreeMap, string::String, vec::Vec};
|
||||||
|
|
||||||
|
use crate::api_remapper_fn;
|
||||||
|
|
||||||
|
pub struct Call {
|
||||||
|
pub args: &'static str,
|
||||||
|
pub rets: &'static str,
|
||||||
|
}
|
||||||
|
|
||||||
|
pub(crate) static mut APIMAP: BTreeMap<
|
||||||
|
&'static str,
|
||||||
|
BTreeMap<&'static str, BTreeMap<&'static str, Call>>,
|
||||||
|
> = BTreeMap::new();
|
||||||
|
|
||||||
|
#[macro_export]
|
||||||
|
macro_rules! api {
|
||||||
|
($dev: ident :: $modu: ident :: $name: ident ($($arg:tt)*)) => {
|
||||||
|
api_map_add(stringify!($dev::$modu::$name), Call {args: stringify!($($arg)*), rets: "()"});
|
||||||
|
};
|
||||||
|
($dev: ident :: $modu: ident :: $name: ident ($($arg:tt)*) -> $ret:ty) => {
|
||||||
|
api_map_add(stringify!($dev::$modu::$name), Call {args: stringify!($($arg)*), rets: stringify!($ret)});
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
#[macro_export]
|
||||||
|
macro_rules! api_remapper {
|
||||||
|
($($st:stmt;)*) => {
|
||||||
|
fn api_remapper_fn() {
|
||||||
|
use crate::utils::*;
|
||||||
|
$(
|
||||||
|
$st
|
||||||
|
)*
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
static mut APIMAP_INITED: bool = false;
|
||||||
|
|
||||||
|
pub fn api_map_inited() -> bool {
|
||||||
|
unsafe { APIMAP_INITED }
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn api_remap() {
|
||||||
|
unsafe { APIMAP_INITED = true };
|
||||||
|
api_remapper_fn();
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn api_map_get(path: &[String]) -> &'static Call {
|
||||||
|
unsafe {
|
||||||
|
APIMAP
|
||||||
|
.get(path[0].as_str())
|
||||||
|
.unwrap()
|
||||||
|
.get(path[1].as_str())
|
||||||
|
.unwrap()
|
||||||
|
.get(path[2].as_str())
|
||||||
|
.unwrap()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub(crate) fn api_map_add<'a>(path: &'static str, call: Call) {
|
||||||
|
let path = path
|
||||||
|
.split("::")
|
||||||
|
.map(|s| s.trim())
|
||||||
|
.collect::<Vec<&'static str>>();
|
||||||
|
let developer = if let Some(developer) = unsafe { APIMAP.get_mut(path[0]) } {
|
||||||
|
developer
|
||||||
|
} else {
|
||||||
|
unsafe {
|
||||||
|
APIMAP.insert(path[0], BTreeMap::new());
|
||||||
|
APIMAP.get_mut(path[0]).unwrap()
|
||||||
|
}
|
||||||
|
};
|
||||||
|
let module = if let Some(module) = developer.get_mut(path[1]) {
|
||||||
|
module
|
||||||
|
} else {
|
||||||
|
developer.insert(path[1], BTreeMap::new());
|
||||||
|
developer.get_mut(path[1]).unwrap()
|
||||||
|
};
|
||||||
|
if let Some(_) = module.get(path[2]) {
|
||||||
|
panic!("Duplicate api name {:?}.", path);
|
||||||
|
} else {
|
||||||
|
module.insert(path[2], call);
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue