use_prelude!();
use std::sync::{Arc, OnceLock};
use super::JsonObject;
use crate::transport::ConnectionType;
pub struct ConnectionRequest {
raw: Arc<repr_c::Box<ffi_sdk::FfiConnectionRequest>>,
cached_peer_metadata: OnceLock<Arc<JsonObject>>,
cached_identity_service_metadata: OnceLock<Arc<JsonObject>>,
cached_peer_key: OnceLock<Arc<str>>,
}
impl ConnectionRequest {
pub(crate) fn new(raw: repr_c::Box<ffi_sdk::FfiConnectionRequest>) -> Self {
Self {
raw: Arc::new(raw),
cached_peer_metadata: <_>::default(),
cached_identity_service_metadata: <_>::default(),
cached_peer_key: <_>::default(),
}
}
pub(crate) fn raw(&self) -> Arc<repr_c::Box<ffi_sdk::FfiConnectionRequest>> {
self.raw.retain()
}
pub fn peer_metadata_json_str(&self) -> String {
String::from_utf8(
ffi_sdk::dittoffi_connection_request_peer_metadata_json(&*self.raw).to_vec(),
)
.expect("UTF-8")
}
pub fn peer_metadata_serde<T: DeserializeOwned>(&self) -> Result<T> {
let value = ::serde_json::from_str(&self.peer_metadata_json_str())?;
Ok(value)
}
pub fn peer_metadata(&self) -> Arc<JsonObject> {
self.cached_peer_metadata
.get_or_init(|| {
Arc::new(
self.peer_metadata_serde()
.expect("incorrect json from `dittoffi`"),
)
})
.retain()
}
pub fn identity_service_metadata_json_str(&self) -> String {
String::from_utf8(
ffi_sdk::dittoffi_connection_request_identity_service_metadata_json(&*self.raw)
.to_vec(),
)
.expect("UTF-8")
}
pub fn identity_service_metadata_serde<T: DeserializeOwned>(&self) -> Result<T> {
let value = ::serde_json::from_str(&self.identity_service_metadata_json_str())?;
Ok(value)
}
pub fn identity_service_metadata(&self) -> Arc<JsonObject> {
self.cached_identity_service_metadata
.get_or_init(|| {
Arc::new(
self.identity_service_metadata_serde()
.expect("incorrect json from `dittoffi`"),
)
})
.retain()
}
pub fn peer_key_string(&self) -> Arc<str> {
self.cached_peer_key
.get_or_init(|| {
ffi_sdk::dittoffi_connection_request_peer_key_string(&*self.raw)
.to_str()
.into()
})
.retain()
}
pub fn connection_type(&self) -> ConnectionType {
ConnectionType::from_ffi(::ffi_sdk::dittoffi_connection_request_connection_type(
&*self.raw,
))
}
}
#[derive(Debug)]
pub(crate) enum ConnectionRequestAuthorizationInner {
Allow { _future_fields: () },
Deny { _future_fields: () },
}
#[derive(Debug)]
pub struct ConnectionRequestAuthorization(pub(crate) ConnectionRequestAuthorizationInner);
impl ConnectionRequestAuthorization {
#![allow(non_upper_case_globals)]
pub const Allow: Self = Self(ConnectionRequestAuthorizationInner::Allow { _future_fields: () });
pub const Deny: Self = Self(ConnectionRequestAuthorizationInner::Deny { _future_fields: () });
pub(crate) fn into_ffi(self, raw: &ffi_sdk::FfiConnectionRequest) {
let ffi_authorization = match self.0 {
ConnectionRequestAuthorizationInner::Allow { _future_fields: () } => {
ffi_sdk::ConnectionRequestAuthorization::Allow
}
ConnectionRequestAuthorizationInner::Deny { _future_fields: () } => {
ffi_sdk::ConnectionRequestAuthorization::Deny
}
};
ffi_sdk::dittoffi_connection_request_authorize(raw, ffi_authorization);
}
}