use metainfo::{FastStrMap, TypeMap};
use volo::net::Address;
use crate::context::Config;
#[derive(Debug, Default)]
pub struct CallOpt {
pub callee_faststr_tags: FastStrMap,
pub callee_tags: TypeMap,
pub address: Option<Address>,
pub config: Config,
pub caller_faststr_tags: FastStrMap,
pub caller_tags: TypeMap,
}
impl CallOpt {
pub fn new() -> Self {
Default::default()
}
}
impl volo::client::Apply<crate::context::ClientContext> for CallOpt {
type Error = crate::Status;
fn apply(self, cx: &mut crate::context::ClientContext) -> Result<(), Self::Error> {
let caller = cx.rpc_info.caller_mut();
if !self.caller_faststr_tags.is_empty() {
caller.faststr_tags.extend(self.caller_faststr_tags);
}
if !self.caller_tags.is_empty() {
caller.tags.extend(self.caller_tags);
}
let callee = cx.rpc_info.callee_mut();
if !self.callee_faststr_tags.is_empty() {
callee.faststr_tags.extend(self.callee_faststr_tags);
}
if !self.callee_tags.is_empty() {
callee.tags.extend(self.callee_tags);
}
if let Some(addr) = self.address {
callee.set_address(addr);
}
cx.rpc_info.config_mut().merge(self.config);
Ok(())
}
}