use bytes::Bytes;
use crate::ffi::errors::{ErrorHandle, Status};
use crate::ffi::{borrow, borrow_text};
use crate::headers::SetCookie;
use crate::models::{Body, Message, Version};
#[unsafe(no_mangle)]
pub unsafe extern "C" fn soyokaze_response_content(content_type: *const u8, content_type_len: usize, body: *const u8, body_len: usize, version: Version) -> *mut Message {
let Some(content_type) = (unsafe { borrow_text(content_type, content_type_len) }) else {
return std::ptr::null_mut();
};
let body = Body::Data(Bytes::copy_from_slice(unsafe { borrow(body, body_len) }.unwrap_or_default()));
Box::into_raw(Box::new(Message::content(content_type, body, version)))
}
#[unsafe(no_mangle)]
pub unsafe extern "C" fn soyokaze_response_text(content: *const u8, content_len: usize, version: Version) -> *mut Message {
match unsafe { borrow_text(content, content_len) } {
Some(content) => Box::into_raw(Box::new(Message::text(content, version))),
None => std::ptr::null_mut(),
}
}
#[unsafe(no_mangle)]
pub unsafe extern "C" fn soyokaze_response_html(content: *const u8, content_len: usize, version: Version) -> *mut Message {
match unsafe { borrow_text(content, content_len) } {
Some(content) => Box::into_raw(Box::new(Message::html(content, version))),
None => std::ptr::null_mut(),
}
}
#[unsafe(no_mangle)]
pub unsafe extern "C" fn soyokaze_response_markdown(content: *const u8, content_len: usize, version: Version) -> *mut Message {
match unsafe { borrow_text(content, content_len) } {
Some(content) => Box::into_raw(Box::new(Message::markdown(content, version))),
None => std::ptr::null_mut(),
}
}
#[unsafe(no_mangle)]
pub unsafe extern "C" fn soyokaze_response_json(content: *const u8, content_len: usize, version: Version) -> *mut Message {
match unsafe { borrow_text(content, content_len) } {
Some(content) => Box::into_raw(Box::new(Message::json(content, version))),
None => std::ptr::null_mut(),
}
}
#[unsafe(no_mangle)]
pub unsafe extern "C" fn soyokaze_response_file(path: *const u8, path_len: usize, version: Version) -> *mut Message {
match unsafe { borrow_text(path, path_len) } {
Some(path) => Box::into_raw(Box::new(Message::file(path, version))),
None => std::ptr::null_mut(),
}
}
#[unsafe(no_mangle)]
pub unsafe extern "C" fn soyokaze_response_redirect(target: *const u8, target_len: usize, version: Version) -> *mut Message {
match unsafe { borrow_text(target, target_len) } {
Some(target) => Box::into_raw(Box::new(Message::redirect(target, version))),
None => std::ptr::null_mut(),
}
}
#[unsafe(no_mangle)]
pub unsafe extern "C" fn soyokaze_message_set_cookie(message: *mut Message, cookie: *const SetCookie, error: *mut *mut ErrorHandle) -> Status {
let (Some(message), Some(cookie)) = (unsafe { message.as_mut() }, unsafe { cookie.as_ref() }) else {
return unsafe { ErrorHandle::raise(error, Status::Invalid) };
};
match message.set_cookie(cookie) {
Ok(()) => Status::Ok,
Err(failure) => unsafe { ErrorHandle::report(error, &failure) },
}
}
#[unsafe(no_mangle)]
pub unsafe extern "C" fn soyokaze_message_delete_cookie(message: *mut Message, cookie: *const SetCookie, error: *mut *mut ErrorHandle) -> Status {
let (Some(message), Some(cookie)) = (unsafe { message.as_mut() }, unsafe { cookie.as_ref() }) else {
return unsafe { ErrorHandle::raise(error, Status::Invalid) };
};
match message.delete_cookie(cookie.clone()) {
Ok(()) => Status::Ok,
Err(failure) => unsafe { ErrorHandle::report(error, &failure) },
}
}