use crate::common::allocator::Allocator;
use crate::common::error::Error;
use crate::io::event_loop::EventLoopGroup;
use crate::io::host_resolver::HostResolver;
use crate::io::io_library_init;
use crate::CrtError as _;
use mountpoint_s3_crt_sys::*;
use std::ptr::NonNull;
#[derive(Debug)]
pub struct ClientBootstrap {
pub(crate) inner: NonNull<aws_client_bootstrap>,
}
#[derive(Debug)]
pub struct ClientBootstrapOptions<'a> {
pub event_loop_group: &'a mut EventLoopGroup,
pub host_resolver: &'a mut HostResolver,
}
impl ClientBootstrap {
pub fn new(allocator: &Allocator, options: &ClientBootstrapOptions) -> Result<Self, Error> {
io_library_init(allocator);
let inner_options = aws_client_bootstrap_options {
event_loop_group: options.event_loop_group.inner.as_ptr(),
host_resolver: options.host_resolver.inner.as_ptr(),
..Default::default()
};
let inner = unsafe { aws_client_bootstrap_new(allocator.inner.as_ptr(), &inner_options).ok_or_last_error()? };
Ok(Self { inner })
}
}
impl Clone for ClientBootstrap {
fn clone(&self) -> Self {
let inner = unsafe { NonNull::new_unchecked(aws_client_bootstrap_acquire(self.inner.as_ptr())) };
Self { inner }
}
}
impl Drop for ClientBootstrap {
fn drop(&mut self) {
unsafe {
aws_client_bootstrap_release(self.inner.as_ptr());
}
}
}