use url::Url;
use crate::EventHubsTransportType;
#[derive(Debug, thiserror::Error)]
pub enum BuildResourceError {
#[error(transparent)]
ParseError(#[from] url::ParseError),
#[error("Unable to set port to None")]
SetPortError,
#[error("Unable to set password to None")]
SetPasswordError,
#[error("Unable to set username to empty string")]
SetUsernameError,
}
pub fn build_connection_signature_authorization_resource(
transport_type: EventHubsTransportType,
fully_qualified_namespace: Option<&str>,
event_hub_name: Option<&str>,
) -> Result<String, BuildResourceError> {
let fqn = match fully_qualified_namespace {
Some("") => return Ok(String::new()),
None => return Ok(String::new()),
Some(fqn) => fqn,
};
let mut builder = Url::parse(&format!("{}://{}", transport_type.url_scheme(), fqn))?;
builder.set_path(event_hub_name.unwrap_or_default());
builder
.set_port(None)
.map_err(|_| BuildResourceError::SetPortError)?;
builder.set_fragment(None);
builder
.set_password(None)
.map_err(|_| BuildResourceError::SetPasswordError)?;
builder
.set_username("")
.map_err(|_| BuildResourceError::SetUsernameError)?;
builder
.path_segments_mut()
.map_err(|_| url::ParseError::RelativeUrlWithCannotBeABaseBase)?
.pop_if_empty();
Ok(builder.to_string().to_lowercase())
}