use std::collections::HashMap;
#[derive(Default, Clone, Debug)]
pub struct TokenSourceFetchOptions {
pub(crate) room_name: Option<String>,
pub(crate) participant_name: Option<String>,
pub(crate) participant_identity: Option<String>,
pub(crate) participant_metadata: Option<String>,
pub(crate) participant_attributes: Option<HashMap<String, String>>,
pub(crate) agent_name: Option<String>,
pub(crate) agent_metadata: Option<String>,
pub(crate) deployment: Option<String>,
}
impl TokenSourceFetchOptions {
pub fn new() -> Self {
Self::default()
}
pub fn with_room_name(mut self, value: impl Into<String>) -> Self {
self.room_name = Some(value.into());
self
}
pub fn with_participant_name(mut self, value: impl Into<String>) -> Self {
self.participant_name = Some(value.into());
self
}
pub fn with_participant_identity(mut self, value: impl Into<String>) -> Self {
self.participant_identity = Some(value.into());
self
}
pub fn with_participant_metadata(mut self, value: impl Into<String>) -> Self {
self.participant_metadata = Some(value.into());
self
}
pub fn with_participant_attributes(
mut self,
value: impl IntoIterator<Item = (impl Into<String>, impl Into<String>)>,
) -> Self {
self.participant_attributes
.get_or_insert_with(HashMap::new)
.extend(value.into_iter().map(|(k, v)| (k.into(), v.into())));
self
}
pub fn with_participant_attribute(
mut self,
key: impl Into<String>,
value: impl Into<String>,
) -> Self {
self.participant_attributes
.get_or_insert_with(HashMap::new)
.insert(key.into(), value.into());
self
}
pub fn with_agent_name(mut self, value: impl Into<String>) -> Self {
self.agent_name = Some(value.into());
self
}
pub fn with_agent_metadata(mut self, value: impl Into<String>) -> Self {
self.agent_metadata = Some(value.into());
self
}
pub fn with_deployment(mut self, value: impl Into<String>) -> Self {
self.deployment = Some(value.into());
self
}
}
#[derive(serde::Serialize)]
pub(crate) struct TokenSourceRequest {
#[serde(skip_serializing_if = "Option::is_none")]
room_name: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
participant_name: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
participant_identity: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
participant_metadata: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
participant_attributes: Option<HashMap<String, String>>,
#[serde(skip_serializing_if = "Option::is_none")]
room_config: Option<RoomConfig>,
}
#[derive(serde::Serialize)]
struct RoomConfig {
agents: Vec<AgentDispatch>,
}
#[derive(serde::Serialize)]
struct AgentDispatch {
#[serde(skip_serializing_if = "Option::is_none")]
agent_name: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
metadata: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
deployment: Option<String>,
}
impl From<&TokenSourceFetchOptions> for TokenSourceRequest {
fn from(options: &TokenSourceFetchOptions) -> TokenSourceRequest {
let room_config = if options.agent_name.is_some()
|| options.agent_metadata.is_some()
|| options.deployment.is_some()
{
Some(RoomConfig {
agents: vec![AgentDispatch {
agent_name: options.agent_name.clone(),
metadata: options.agent_metadata.clone(),
deployment: options.deployment.clone(),
}],
})
} else {
None
};
TokenSourceRequest {
room_name: options.room_name.clone(),
participant_name: options.participant_name.clone(),
participant_identity: options.participant_identity.clone(),
participant_metadata: options.participant_metadata.clone(),
participant_attributes: options.participant_attributes.clone(),
room_config,
}
}
}