use dart_sys::Dart_Handle;
use derive_more::From;
use medea_macro::dart_bridge;
use crate::platform::dart::utils::{dart_string_into_rust, handle::DartHandle};
#[dart_bridge("flutter/lib/src/native/platform/ice_candidate.g.dart")]
mod ice_candidate {
use std::{os::raw::c_char, ptr};
use dart_sys::Dart_Handle;
use crate::api::DartValueArg;
extern "C" {
pub fn init(
candidate: DartValueArg<String>,
sdp_mid: DartValueArg<Option<String>>,
sdp_m_line_index: DartValueArg<Option<u16>>,
) -> Dart_Handle;
pub fn candidate(ice_candidate: Dart_Handle) -> ptr::NonNull<c_char>;
pub fn sdp_m_line_index(ice_candidate: Dart_Handle) -> u64;
pub fn sdp_mid(ice_candidate: Dart_Handle) -> ptr::NonNull<c_char>;
}
}
#[derive(Debug, From)]
pub struct IceCandidate(DartHandle);
impl IceCandidate {
#[must_use]
pub fn new(
candidate: &str,
sdp_m_line_index: Option<u16>,
sdp_mid: &Option<String>,
) -> Self {
let handle = unsafe {
ice_candidate::init(
candidate.to_owned().into(),
sdp_mid.clone().into(),
sdp_m_line_index.map(i64::from).into(),
)
};
Self(unsafe { DartHandle::new(handle) })
}
#[must_use]
pub fn handle(&self) -> Dart_Handle {
self.0.get()
}
#[must_use]
pub fn candidate(&self) -> String {
let candidate = unsafe { ice_candidate::candidate(self.0.get()) };
unsafe { dart_string_into_rust(candidate) }
}
#[allow(clippy::unwrap_in_result)]
#[must_use]
pub fn sdp_m_line_index(&self) -> Option<u16> {
Some(unsafe {
ice_candidate::sdp_m_line_index(self.0.get())
.try_into()
.unwrap()
})
}
#[must_use]
pub fn sdp_mid(&self) -> Option<String> {
let mid = unsafe { ice_candidate::sdp_mid(self.0.get()) };
Some(unsafe { dart_string_into_rust(mid) })
}
}