use super::*;
unsafe extern "C" {
pub fn proto2_rust_Message_delete(m: RawMessage);
pub fn proto2_rust_Message_clear(m: RawMessage);
pub fn proto2_rust_Message_parse(m: RawMessage, input: PtrAndLen) -> bool;
pub fn proto2_rust_Message_parse_dont_enforce_required(m: RawMessage, input: PtrAndLen)
-> bool;
pub fn proto2_rust_Message_serialize(m: RawMessage, output: &mut SerializedData) -> bool;
pub fn proto2_rust_Message_copy_from(dst: RawMessage, src: RawMessage);
pub fn proto2_rust_Message_merge_from(dst: RawMessage, src: RawMessage);
pub fn proto2_rust_Message_get_descriptor(m: RawMessage) -> *const std::ffi::c_void;
}
unsafe extern "C" {
#[link_name = "proto2_rust_messagelite_equals"]
pub fn raw_message_equals(raw1: RawMessage, raw2: RawMessage) -> bool;
}
#[derive(Debug)]
#[doc(hidden)]
#[repr(transparent)]
pub struct OwnedMessageInner<T> {
raw: RawMessage,
_phantom: PhantomData<T>,
}
impl<T: Message> OwnedMessageInner<T> {
pub unsafe fn wrap_raw(raw: RawMessage) -> Self {
OwnedMessageInner { raw, _phantom: PhantomData }
}
pub fn raw(&self) -> RawMessage {
self.raw
}
}
#[derive(Debug)]
#[doc(hidden)]
#[repr(transparent)]
pub struct MessageMutInner<'msg, T> {
raw: RawMessage,
_phantom: PhantomData<(&'msg mut (), T)>,
}
impl<'msg, T: Message> MessageMutInner<'msg, T> {
#[allow(clippy::needless_pass_by_ref_mut)] pub fn mut_of_owned(msg: &'msg mut OwnedMessageInner<T>) -> Self {
MessageMutInner { raw: msg.raw, _phantom: PhantomData }
}
pub unsafe fn wrap_raw(raw: RawMessage) -> Self {
MessageMutInner { raw, _phantom: PhantomData }
}
pub fn from_parent<ParentT: Message>(
_parent_msg: MessageMutInner<'msg, ParentT>,
message_field_ptr: RawMessage,
) -> Self {
Self { raw: message_field_ptr, _phantom: PhantomData }
}
pub fn raw(&self) -> RawMessage {
self.raw
}
pub fn as_view(&self) -> MessageViewInner<'msg, T> {
MessageViewInner { raw: self.raw, _phantom: PhantomData }
}
pub fn reborrow<'shorter>(&mut self) -> MessageMutInner<'shorter, T>
where
'msg: 'shorter,
{
MessageMutInner { raw: self.raw, _phantom: PhantomData }
}
}
#[derive(Debug)]
#[doc(hidden)]
#[repr(transparent)]
pub struct MessageViewInner<'msg, T> {
raw: RawMessage,
_phantom: PhantomData<(&'msg (), T)>,
}
impl<'msg, T: Message> Clone for MessageViewInner<'msg, T> {
fn clone(&self) -> Self {
*self
}
}
impl<'msg, T: Message> Copy for MessageViewInner<'msg, T> {}
impl<'msg, T: Message> MessageViewInner<'msg, T> {
pub unsafe fn wrap_raw(raw: RawMessage) -> Self {
MessageViewInner { raw, _phantom: PhantomData }
}
pub fn view_of_owned(msg: &'msg OwnedMessageInner<T>) -> Self {
MessageViewInner { raw: msg.raw, _phantom: PhantomData }
}
pub fn view_of_mut(msg: MessageMutInner<'msg, T>) -> Self {
MessageViewInner { raw: msg.raw, _phantom: PhantomData }
}
pub fn raw(&self) -> RawMessage {
self.raw
}
}
#[doc(hidden)]
pub unsafe trait CppGetRawMessage: SealedInternal {
fn get_raw_message(&self, _private: Private) -> RawMessage;
}
unsafe impl<T> CppGetRawMessage for T
where
Self: AsMut + AsView,
for<'a> View<'a, <Self as AsView>::Proxied>: CppGetRawMessage,
{
fn get_raw_message(&self, _private: Private) -> RawMessage {
self.as_view().get_raw_message(_private)
}
}
#[doc(hidden)]
pub unsafe trait CppGetRawMessageMut: SealedInternal {
fn get_raw_message_mut(&mut self, _private: Private) -> RawMessage;
}
unsafe impl<T> CppGetRawMessageMut for T
where
Self: MutProxied,
for<'a> Mut<'a, Self>: CppGetRawMessageMut,
{
fn get_raw_message_mut(&mut self, _private: Private) -> RawMessage {
self.as_mut().get_raw_message_mut(_private)
}
}
pub trait KernelMessage: CppGetRawMessage + CppGetRawMessageMut + OwnedMessageInterop {}
impl<T: CppGetRawMessage + CppGetRawMessageMut + OwnedMessageInterop> KernelMessage for T {}
pub trait KernelMessageView<'msg>:
CppGetRawMessage + MessageViewInterop<'msg> + AsView + From<MessageViewInner<'msg, Self::KMessage>>
{
type KMessage;
}
impl<'msg, T> KernelMessageView<'msg> for T
where
T: CppGetRawMessage
+ MessageViewInterop<'msg>
+ AsView
+ From<MessageViewInner<'msg, T::Proxied>>,
{
type KMessage = T::Proxied;
}
pub trait KernelMessageMut<'msg>:
CppGetRawMessageMut + MessageMutInterop<'msg> + AsMut + From<MessageMutInner<'msg, Self::KMessage>>
{
type KMessage;
}
impl<'msg, T> KernelMessageMut<'msg> for T
where
T: CppGetRawMessageMut
+ MessageMutInterop<'msg>
+ AsMut
+ From<MessageMutInner<'msg, T::MutProxied>>,
{
type KMessage = T::MutProxied;
}
pub fn message_eq<T>(a: &T, b: &T) -> bool
where
T: AsView + Debug,
for<'a> View<'a, <T as AsView>::Proxied>: CppGetRawMessage,
{
unsafe {
raw_message_equals(
a.as_view().get_raw_message(Private),
b.as_view().get_raw_message(Private),
)
}
}
impl<T> MatcherEq for T
where
Self: AsView + Debug,
for<'a> View<'a, <Self as AsView>::Proxied>: CppGetRawMessage,
{
fn matches(&self, o: &Self) -> bool {
message_eq(self, o)
}
}
impl<T: CppGetRawMessageMut> Clear for T {
fn clear(&mut self) {
unsafe { proto2_rust_Message_clear(self.get_raw_message_mut(Private)) }
}
}
impl<T: CppGetRawMessageMut> ClearAndParse for T {
fn clear_and_parse(&mut self, data: &[u8]) -> Result<(), ParseError> {
unsafe { proto2_rust_Message_parse(self.get_raw_message_mut(Private), data.into()) }
.then_some(())
.ok_or(ParseError)
}
fn clear_and_parse_dont_enforce_required(&mut self, data: &[u8]) -> Result<(), ParseError> {
unsafe {
proto2_rust_Message_parse_dont_enforce_required(
self.get_raw_message_mut(Private),
data.into(),
)
}
.then_some(())
.ok_or(ParseError)
}
}
impl<T: CppGetRawMessage> Serialize for T {
fn serialize(&self) -> Result<Vec<u8>, SerializeError> {
let mut serialized_data = SerializedData::new();
let success = unsafe {
proto2_rust_Message_serialize(self.get_raw_message(Private), &mut serialized_data)
};
if success {
Ok(serialized_data.into_vec())
} else {
Err(SerializeError)
}
}
}
impl<T> TakeFrom for T
where
Self: CopyFrom + AsMut,
for<'a> Mut<'a, <Self as AsMut>::MutProxied>: Clear,
{
fn take_from(&mut self, mut src: impl AsMut<MutProxied = Self::Proxied>) {
let mut src = src.as_mut();
CopyFrom::copy_from(self, AsView::as_view(&src));
Clear::clear(&mut src);
}
}
impl<T> CopyFrom for T
where
Self: AsMut,
for<'a> View<'a, Self::Proxied>: CppGetRawMessage,
for<'a> Mut<'a, Self::Proxied>: CppGetRawMessageMut,
{
fn copy_from(&mut self, src: impl AsView<Proxied = Self::Proxied>) {
unsafe {
proto2_rust_Message_copy_from(
self.as_mut().get_raw_message_mut(Private),
src.as_view().get_raw_message(Private),
);
}
}
}
impl<T> MergeFrom for T
where
Self: AsMut,
for<'a> View<'a, Self::Proxied>: CppGetRawMessage,
for<'a> Mut<'a, Self::Proxied>: CppGetRawMessageMut,
{
fn merge_from(&mut self, src: impl AsView<Proxied = Self::Proxied>) {
unsafe {
proto2_rust_Message_merge_from(
self.as_mut().get_raw_message_mut(Private),
src.as_view().get_raw_message(Private),
);
}
}
}