use crate::protos::authorization;
use crate::protos::prelude::*;
#[derive(Debug)]
pub enum AuthorizationMessage {
ConnectRequest(ConnectRequest),
ConnectResponse(ConnectResponse),
Authorized(Authorized),
AuthorizationError(AuthorizationError),
TrustRequest(TrustRequest),
}
#[derive(Debug)]
pub enum AuthorizationType {
Trust,
}
#[derive(Debug)]
pub enum ConnectRequest {
Bidirectional,
Unidirectional,
}
#[derive(Debug)]
pub struct ConnectResponse {
pub accepted_authorization_types: Vec<AuthorizationType>,
}
#[derive(Debug)]
pub struct TrustRequest {
pub identity: String,
}
#[derive(Debug)]
pub struct Authorized;
#[derive(Debug)]
pub enum AuthorizationError {
AuthorizationRejected(String),
}
impl FromProto<authorization::ConnectRequest> for ConnectRequest {
fn from_proto(source: authorization::ConnectRequest) -> Result<Self, ProtoConversionError> {
use authorization::ConnectRequest_HandshakeMode::*;
match source.handshake_mode {
BIDIRECTIONAL => Ok(ConnectRequest::Bidirectional),
UNIDIRECTIONAL => Ok(ConnectRequest::Unidirectional),
UNSET_HANDSHAKE_MODE => Err(ProtoConversionError::InvalidTypeError(
"No handshake mode was set".into(),
)),
}
}
}
impl FromNative<ConnectRequest> for authorization::ConnectRequest {
fn from_native(req: ConnectRequest) -> Result<Self, ProtoConversionError> {
let mut proto_request = authorization::ConnectRequest::new();
use authorization::ConnectRequest_HandshakeMode::*;
proto_request.set_handshake_mode(match req {
ConnectRequest::Bidirectional => BIDIRECTIONAL,
ConnectRequest::Unidirectional => UNIDIRECTIONAL,
});
Ok(proto_request)
}
}
impl FromProto<authorization::ConnectResponse> for ConnectResponse {
fn from_proto(source: authorization::ConnectResponse) -> Result<Self, ProtoConversionError> {
use authorization::ConnectResponse_AuthorizationType::*;
Ok(Self {
accepted_authorization_types: source
.get_accepted_authorization_types()
.iter()
.map(|t| match t {
TRUST => Ok(AuthorizationType::Trust),
UNSET_AUTHORIZATION_TYPE => Err(ProtoConversionError::InvalidTypeError(
"no authorization type was set".into(),
)),
})
.collect::<Result<Vec<AuthorizationType>, ProtoConversionError>>()?,
})
}
}
impl FromNative<ConnectResponse> for authorization::ConnectResponse {
fn from_native(source: ConnectResponse) -> Result<Self, ProtoConversionError> {
let mut response = authorization::ConnectResponse::new();
response.set_accepted_authorization_types(
source
.accepted_authorization_types
.into_iter()
.map(|auth_type| match auth_type {
AuthorizationType::Trust => {
authorization::ConnectResponse_AuthorizationType::TRUST
}
})
.collect(),
);
Ok(response)
}
}
impl FromProto<authorization::TrustRequest> for TrustRequest {
fn from_proto(mut source: authorization::TrustRequest) -> Result<Self, ProtoConversionError> {
Ok(Self {
identity: source.take_identity(),
})
}
}
impl FromNative<TrustRequest> for authorization::TrustRequest {
fn from_native(source: TrustRequest) -> Result<Self, ProtoConversionError> {
let mut request = authorization::TrustRequest::new();
request.set_identity(source.identity);
Ok(request)
}
}
impl FromProto<authorization::AuthorizedMessage> for Authorized {
fn from_proto(_: authorization::AuthorizedMessage) -> Result<Self, ProtoConversionError> {
Ok(Authorized)
}
}
impl FromNative<Authorized> for authorization::AuthorizedMessage {
fn from_native(_: Authorized) -> Result<Self, ProtoConversionError> {
Ok(authorization::AuthorizedMessage::new())
}
}
impl FromProto<authorization::AuthorizationError> for AuthorizationError {
fn from_proto(
mut source: authorization::AuthorizationError,
) -> Result<Self, ProtoConversionError> {
use authorization::AuthorizationError_AuthorizationErrorType::*;
match source.error_type {
AUTHORIZATION_REJECTED => Ok(AuthorizationError::AuthorizationRejected(
source.take_error_message(),
)),
UNSET_AUTHORIZATION_ERROR_TYPE => Err(ProtoConversionError::InvalidTypeError(
"No error type set".into(),
)),
}
}
}
impl FromNative<AuthorizationError> for authorization::AuthorizationError {
fn from_native(source: AuthorizationError) -> Result<Self, ProtoConversionError> {
use authorization::AuthorizationError_AuthorizationErrorType::*;
let mut error = authorization::AuthorizationError::new();
match source {
AuthorizationError::AuthorizationRejected(message) => {
error.set_error_type(AUTHORIZATION_REJECTED);
error.set_error_message(message);
}
}
Ok(error)
}
}
impl FromProto<authorization::AuthorizationMessage> for AuthorizationMessage {
fn from_proto(
source: authorization::AuthorizationMessage,
) -> Result<Self, ProtoConversionError> {
use authorization::AuthorizationMessageType::*;
match source.message_type {
CONNECT_REQUEST => Ok(AuthorizationMessage::ConnectRequest(FromBytes::<
authorization::ConnectRequest,
>::from_bytes(
source.get_payload(),
)?)),
CONNECT_RESPONSE => Ok(AuthorizationMessage::ConnectResponse(FromBytes::<
authorization::ConnectResponse,
>::from_bytes(
source.get_payload(),
)?)),
AUTHORIZE => Ok(AuthorizationMessage::Authorized(FromBytes::<
authorization::AuthorizedMessage,
>::from_bytes(
source.get_payload()
)?)),
AUTHORIZATION_ERROR => Ok(AuthorizationMessage::AuthorizationError(FromBytes::<
authorization::AuthorizationError,
>::from_bytes(
source.get_payload(),
)?)),
TRUST_REQUEST => Ok(AuthorizationMessage::TrustRequest(FromBytes::<
authorization::TrustRequest,
>::from_bytes(
source.get_payload()
)?)),
UNSET_AUTHORIZATION_MESSAGE_TYPE => Err(ProtoConversionError::InvalidTypeError(
"no message type was set".into(),
)),
}
}
}
impl FromNative<AuthorizationMessage> for authorization::AuthorizationMessage {
fn from_native(source: AuthorizationMessage) -> Result<Self, ProtoConversionError> {
use authorization::AuthorizationMessageType::*;
let mut message = authorization::AuthorizationMessage::new();
match source {
AuthorizationMessage::ConnectRequest(payload) => {
message.set_message_type(CONNECT_REQUEST);
message.set_payload(IntoBytes::<authorization::ConnectRequest>::into_bytes(
payload,
)?);
}
AuthorizationMessage::ConnectResponse(payload) => {
message.set_message_type(CONNECT_RESPONSE);
message.set_payload(IntoBytes::<authorization::ConnectResponse>::into_bytes(
payload,
)?);
}
AuthorizationMessage::Authorized(payload) => {
message.set_message_type(AUTHORIZE);
message.set_payload(IntoBytes::<authorization::AuthorizedMessage>::into_bytes(
payload,
)?);
}
AuthorizationMessage::AuthorizationError(payload) => {
message.set_message_type(AUTHORIZATION_ERROR);
message.set_payload(IntoBytes::<authorization::AuthorizationError>::into_bytes(
payload,
)?);
}
AuthorizationMessage::TrustRequest(payload) => {
message.set_message_type(TRUST_REQUEST);
message.set_payload(IntoBytes::<authorization::TrustRequest>::into_bytes(
payload,
)?);
}
}
Ok(message)
}
}