use crate::error::Result;
use crate::server::channel_owner::{ChannelOwner, ChannelOwnerImpl, ParentOrConnection};
use serde_json::Value;
use std::any::Any;
use std::sync::Arc;
#[derive(Clone)]
pub struct BindingCall {
base: ChannelOwnerImpl,
}
impl BindingCall {
pub fn new(
parent: Arc<dyn ChannelOwner>,
type_name: String,
guid: Arc<str>,
initializer: Value,
) -> Result<Self> {
let base = ChannelOwnerImpl::new(
ParentOrConnection::Parent(parent),
type_name,
guid,
initializer,
);
Ok(Self { base })
}
pub fn name(&self) -> &str {
self.base
.initializer()
.get("name")
.and_then(|v| v.as_str())
.unwrap_or("")
}
pub fn args(&self) -> &Value {
self.base.initializer().get("args").unwrap_or(&Value::Null)
}
pub async fn resolve(&self, result: Value) -> Result<()> {
self.base
.channel()
.send_no_result("resolve", serde_json::json!({ "result": result }))
.await
}
pub async fn reject(&self, message: &str) -> Result<()> {
self.base
.channel()
.send_no_result(
"reject",
serde_json::json!({ "error": { "error": { "message": message, "name": "Error" } } }),
)
.await
}
}
impl ChannelOwner for BindingCall {
fn guid(&self) -> &str {
self.base.guid()
}
fn type_name(&self) -> &str {
self.base.type_name()
}
fn parent(&self) -> Option<Arc<dyn ChannelOwner>> {
self.base.parent()
}
fn connection(&self) -> Arc<dyn crate::server::connection::ConnectionLike> {
self.base.connection()
}
fn initializer(&self) -> &Value {
self.base.initializer()
}
fn channel(&self) -> &crate::server::channel::Channel {
self.base.channel()
}
fn dispose(&self, reason: crate::server::channel_owner::DisposeReason) {
self.base.dispose(reason)
}
fn adopt(&self, child: Arc<dyn ChannelOwner>) {
self.base.adopt(child)
}
fn add_child(&self, guid: Arc<str>, child: Arc<dyn ChannelOwner>) {
self.base.add_child(guid, child)
}
fn remove_child(&self, guid: &str) {
self.base.remove_child(guid)
}
fn on_event(&self, _method: &str, _params: Value) {
}
fn was_collected(&self) -> bool {
self.base.was_collected()
}
fn as_any(&self) -> &dyn Any {
self
}
}
impl std::fmt::Debug for BindingCall {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
f.debug_struct("BindingCall")
.field("guid", &self.guid())
.field("name", &self.name())
.finish()
}
}