use std::cmp::Ordering;
use std::ffi::{c_char, c_int};
use pkgcraft::dep::{Cpn, Cpv, Dep, Version};
use pkgcraft::eapi::Eapi;
use pkgcraft::pkg::{Package, Pkg, RepoPackage};
use pkgcraft::repo::Repo;
use pkgcraft::restrict::{Restrict, Restriction};
use pkgcraft::traits::Intersects;
use pkgcraft::utils::hash;
use crate::macros::*;
pub mod ebuild;
#[repr(C)]
pub enum PkgFormat {
Configured,
Ebuild,
Fake,
}
impl From<&Pkg<'_>> for PkgFormat {
fn from(pkg: &Pkg) -> Self {
match pkg {
Pkg::Configured(_, _) => Self::Configured,
Pkg::Ebuild(_, _) => Self::Ebuild,
Pkg::Fake(_, _) => Self::Fake,
}
}
}
#[no_mangle]
pub unsafe extern "C" fn pkgcraft_pkg_format(p: *mut Pkg) -> PkgFormat {
let pkg = try_ref_from_ptr!(p);
pkg.into()
}
#[no_mangle]
pub unsafe extern "C" fn pkgcraft_pkg_cpv(p: *mut Pkg) -> *mut Cpv {
let pkg = try_ref_from_ptr!(p);
Box::into_raw(Box::new(pkg.cpv().clone()))
}
#[no_mangle]
pub unsafe extern "C" fn pkgcraft_pkg_repo(p: *mut Pkg) -> *const Repo {
let pkg = try_ref_from_ptr!(p);
pkg.repo()
}
#[no_mangle]
pub unsafe extern "C" fn pkgcraft_pkg_eapi(p: *mut Pkg) -> *const Eapi {
let pkg = try_ref_from_ptr!(p);
pkg.eapi()
}
#[no_mangle]
pub unsafe extern "C" fn pkgcraft_pkg_version(p: *mut Pkg) -> *mut Version {
let pkg = try_ref_from_ptr!(p);
Box::into_raw(Box::new(pkg.version().clone()))
}
#[no_mangle]
pub unsafe extern "C" fn pkgcraft_pkg_cmp<'a>(p1: *mut Pkg<'a>, p2: *mut Pkg<'a>) -> c_int {
let pkg1 = try_ref_from_ptr!(p1);
let pkg2 = try_ref_from_ptr!(p2);
match pkg1.cmp(pkg2) {
Ordering::Less => -1,
Ordering::Equal => 0,
Ordering::Greater => 1,
}
}
#[no_mangle]
pub unsafe extern "C" fn pkgcraft_pkg_intersects_dep(p: *mut Pkg, d: *mut Dep) -> bool {
let pkg = try_ref_from_ptr!(p);
let dep = try_ref_from_ptr!(d);
pkg.intersects(dep)
}
#[no_mangle]
pub unsafe extern "C" fn pkgcraft_pkg_intersects_cpv(p: *mut Pkg, c: *mut Cpv) -> bool {
let pkg = try_ref_from_ptr!(p);
let cpv = try_ref_from_ptr!(c);
pkg.intersects(cpv)
}
#[no_mangle]
pub unsafe extern "C" fn pkgcraft_pkg_intersects_cpn(p: *mut Pkg, c: *mut Cpn) -> bool {
let pkg = try_ref_from_ptr!(p);
let cpn = try_ref_from_ptr!(c);
pkg.intersects(cpn)
}
#[no_mangle]
pub unsafe extern "C" fn pkgcraft_pkg_str(p: *mut Pkg) -> *mut c_char {
let pkg = try_ref_from_ptr!(p);
try_ptr_from_str!(pkg.to_string())
}
#[no_mangle]
pub unsafe extern "C" fn pkgcraft_pkg_hash(p: *mut Pkg) -> u64 {
let pkg = try_ref_from_ptr!(p);
hash(pkg)
}
#[no_mangle]
pub unsafe extern "C" fn pkgcraft_pkg_restrict(p: *mut Pkg) -> *mut Restrict {
let pkg = try_ref_from_ptr!(p);
Box::into_raw(Box::new(pkg.into()))
}
#[no_mangle]
pub unsafe extern "C" fn pkgcraft_pkg_restrict_matches(p: *mut Pkg, r: *mut Restrict) -> bool {
let pkg = try_ref_from_ptr!(p);
let r = try_ref_from_ptr!(r);
r.matches(pkg)
}
#[no_mangle]
pub unsafe extern "C" fn pkgcraft_pkg_free(p: *mut Pkg) {
if !p.is_null() {
unsafe { drop(Box::from_raw(p)) };
}
}