use std::any::Any;
use super::types::Type;
#[derive(Clone, Debug)]
pub struct Builder {
args: Vec<Type>,
res: Type,
abi: super::FfiAbi,
}
impl Default for Builder {
fn default() -> Self {
Builder::new()
}
}
impl Builder {
pub fn new() -> Self {
Builder {
args: vec![],
res: Type::void(),
abi: super::ffi_abi_FFI_DEFAULT_ABI,
}
}
pub fn arg(mut self, type_: Type) -> Self {
self.args.push(type_);
self
}
pub fn args<I>(mut self, types: I) -> Self
where I: IntoIterator<Item=Type>
{
self.args.extend(types.into_iter());
self
}
pub fn res(mut self, type_: Type) -> Self {
self.res = type_;
self
}
pub fn abi(mut self, abi: super::FfiAbi) -> Self {
self.abi = abi;
self
}
pub fn into_cif(self) -> super::Cif {
let mut result = super::Cif::new(self.args, self.res);
result.set_abi(self.abi);
result
}
pub fn into_closure<U, R>(
self,
callback: super::Callback<U, R>,
userdata: &U)
-> super::Closure
{
super::Closure::new(self.into_cif(), callback, userdata)
}
pub fn into_closure_mut<U, R>(
self,
callback: super::CallbackMut<U, R>,
userdata: &mut U)
-> super::Closure
{
super::Closure::new_mut(self.into_cif(), callback, userdata)
}
pub fn into_closure_once<U: Any, R>(
self,
callback: super::CallbackOnce<U, R>,
userdata: U)
-> super::ClosureOnce
{
super::ClosureOnce::new(self.into_cif(), callback, userdata)
}
}