///|
/// Validate session.subscribe params.
/// Returns Some(()) when an error response was already sent.
fn BidiProtocol::validate_session_subscribe_params(
self : BidiProtocol,
request_id : Int,
params : Json?,
) -> Unit? {
let map = match params {
Some(Object(map)) => map
_ => {
self.send_error(
request_id, "invalid argument", "params must be an object",
)
return Some(())
}
}
match map.get("events") {
Some(Array(raw_events)) => {
if raw_events.length() == 0 {
self.send_error(
request_id, "invalid argument", "events must not be an empty array",
)
return Some(())
}
for raw_event in raw_events {
match raw_event {
String(event_name) =>
if !is_valid_session_subscription_event_name(event_name) {
self.send_error(
request_id,
"invalid argument",
"Unknown event name: " + event_name,
)
return Some(())
}
_ => {
self.send_error(
request_id, "invalid argument", "events entries must be strings",
)
return Some(())
}
}
}
}
Some(_) => {
self.send_error(request_id, "invalid argument", "events must be an array")
return Some(())
}
None => {
self.send_error(request_id, "invalid argument", "Missing events")
return Some(())
}
}
let mut has_context_targets = false
match map.get("contexts") {
Some(Array(raw_contexts)) => {
has_context_targets = true
if raw_contexts.length() == 0 {
self.send_error(
request_id, "invalid argument", "contexts must not be an empty array",
)
return Some(())
}
for raw_context in raw_contexts {
match raw_context {
String(ctx_id) =>
if !self.manager.has_session(ctx_id) {
self.send_error(
request_id,
"no such frame",
"Unknown context: " + ctx_id,
)
return Some(())
}
_ => {
self.send_error(
request_id, "invalid argument", "contexts entries must be strings",
)
return Some(())
}
}
}
}
Some(_) => {
self.send_error(
request_id, "invalid argument", "contexts must be an array",
)
return Some(())
}
None => ()
}
let mut has_user_context_targets = false
match get_map_field_with_alias(map, "userContexts", "user_contexts") {
Some(Array(raw_user_contexts)) => {
has_user_context_targets = true
if raw_user_contexts.length() == 0 {
self.send_error(
request_id, "invalid argument", "userContexts must not be an empty array",
)
return Some(())
}
for raw_user_context in raw_user_contexts {
match raw_user_context {
String(user_context_id) =>
if !self.user_contexts.get(user_context_id).unwrap_or(false) {
self.send_error(
request_id,
"no such user context",
"Unknown user context: " + user_context_id,
)
return Some(())
}
_ => {
self.send_error(
request_id, "invalid argument", "userContexts entries must be strings",
)
return Some(())
}
}
}
}
Some(_) => {
self.send_error(
request_id, "invalid argument", "userContexts must be an array",
)
return Some(())
}
None => ()
}
if has_context_targets && has_user_context_targets {
self.send_error(
request_id, "invalid argument", "contexts and userContexts are mutually exclusive",
)
return Some(())
}
None
}