///|
/// Parse method into (domain, action)
fn split_method(method_name : String) -> (String, String)? {
let domain = StringBuilder::new()
let action = StringBuilder::new()
let mut in_action = false
for c in method_name.iter() {
if c == '.' && !in_action {
in_action = true
} else if in_action {
action.write_char(c)
} else {
domain.write_char(c)
}
}
let d = domain.to_string()
let a = action.to_string()
if d.length() == 0 || a.length() == 0 {
None
} else {
Some((d, a))
}
}
// =============================================================================
// Dispatch
// =============================================================================
///|
/// Dispatch request to method handler
fn BidiProtocol::dispatch(
self : BidiProtocol,
request : BidiRequest,
) -> Result[Unit, String] {
self.flush_expired_pending_navigation_requests()
let parts = split_method(request.method_name)
let (domain, action) = match parts {
Some(p) => p
None => return Err("Invalid method format")
}
match domain {
"session" => self.dispatch_session(request, action)
"browser" => self.dispatch_browser(request, action)
"browsingContext" => self.dispatch_browsing_context(request, action)
"script" => self.dispatch_script(request, action)
"input" => self.dispatch_input(request, action)
"network" => self.dispatch_network(request, action)
"emulation" => self.dispatch_emulation(request, action)
"bluetooth" => self.dispatch_bluetooth(request, action)
"permissions" => self.dispatch_permissions(request, action)
"storage" => self.dispatch_storage(request, action)
"webExtension" => self.dispatch_web_extension(request, action)
"crater" => self.dispatch_crater(request, action)
"log" => self.dispatch_log(request, action)
_ => {
self.send_error(
request.id,
"unknown command",
"Unknown method: " + request.method_name,
)
Ok(())
}
}
}