1use std::cmp::Ordering;
2use std::ffi::{c_char, c_int};
3
4use pkgcraft::eapi::{self, Eapi};
5use pkgcraft::utils::hash;
6
7use crate::macros::*;
8use crate::panic::ffi_catch_panic;
9use crate::utils::str_to_raw;
10
11macro_rules! eapi_or_default {
16 ( $var:expr ) => {{
17 let eapi = unsafe { $var.as_ref() };
18 eapi.unwrap_or_default()
19 }};
20}
21pub(crate) use eapi_or_default;
22
23#[no_mangle]
28pub unsafe extern "C" fn pkgcraft_eapis(len: *mut usize) -> *mut *const Eapi {
29 iter_to_array!(eapi::EAPIS.iter(), len, |&e| { e as *const _ })
30}
31
32#[no_mangle]
37pub unsafe extern "C" fn pkgcraft_eapis_official(len: *mut usize) -> *mut *const Eapi {
38 iter_to_array!(eapi::EAPIS_OFFICIAL.iter(), len, |&e| { e as *const _ })
39}
40
41#[no_mangle]
48pub unsafe extern "C" fn pkgcraft_eapi_from_str(s: *const c_char) -> *const Eapi {
49 ffi_catch_panic! {
50 let s = try_str_from_ptr!(s);
51 unwrap_or_panic!(s.parse::<&Eapi>())
52 }
53}
54
55#[no_mangle]
60pub unsafe extern "C" fn pkgcraft_eapi_has(eapi: *const Eapi, s: *const c_char) -> bool {
61 let eapi = try_ref_from_ptr!(eapi);
62 let s = try_str_from_ptr!(s);
63 s.parse().map(|f| eapi.has(f)).unwrap_or_default()
64}
65
66#[no_mangle]
71pub unsafe extern "C" fn pkgcraft_eapi_as_str(eapi: *const Eapi) -> *mut c_char {
72 let eapi = try_ref_from_ptr!(eapi);
73 try_ptr_from_str!(eapi.as_str())
74}
75
76#[no_mangle]
83pub unsafe extern "C" fn pkgcraft_eapi_parse(s: *const c_char) -> *const c_char {
84 ffi_catch_panic! {
85 let val = try_str_from_ptr!(s);
86 unwrap_or_panic!(Eapi::parse(val));
87 s
88 }
89}
90
91#[no_mangle]
97pub unsafe extern "C" fn pkgcraft_eapi_cmp(e1: *const Eapi, e2: *const Eapi) -> c_int {
98 let eapi1 = try_ref_from_ptr!(e1);
99 let eapi2 = try_ref_from_ptr!(e2);
100
101 match eapi1.cmp(eapi2) {
102 Ordering::Less => -1,
103 Ordering::Equal => 0,
104 Ordering::Greater => 1,
105 }
106}
107
108#[no_mangle]
113pub unsafe extern "C" fn pkgcraft_eapi_dep_keys(
114 eapi: *const Eapi,
115 len: *mut usize,
116) -> *mut *mut c_char {
117 let eapi = try_ref_from_ptr!(eapi);
118 iter_to_array!(eapi.dep_keys().iter(), len, str_to_raw)
119}
120
121#[no_mangle]
126pub unsafe extern "C" fn pkgcraft_eapi_metadata_keys(
127 eapi: *const Eapi,
128 len: *mut usize,
129) -> *mut *mut c_char {
130 let eapi = try_ref_from_ptr!(eapi);
131 iter_to_array!(eapi.metadata_keys().iter(), len, str_to_raw)
132}
133
134#[no_mangle]
139pub unsafe extern "C" fn pkgcraft_eapi_hash(eapi: *const Eapi) -> u64 {
140 let eapi = try_ref_from_ptr!(eapi);
141 hash(eapi)
142}
143
144#[no_mangle]
151pub unsafe extern "C" fn pkgcraft_eapis_range(
152 s: *const c_char,
153 len: *mut usize,
154) -> *mut *const Eapi {
155 ffi_catch_panic! {
156 let s = try_str_from_ptr!(s);
157 let eapis = unwrap_or_panic!(eapi::range(s));
158 iter_to_array!(eapis, len, |e| { e as *const _ })
159 }
160}