use super::FromRequest;
use tonic::{Request, Status};
const ROLE_HEADER: &str = "x-postgres-role";
pub type Role = Option<String>;
impl FromRequest for Role {
type Error = Status;
fn from_request<T>(request: &mut Request<T>) -> Result<Self, Self::Error> {
let role = request
.extensions_mut()
.remove::<RoleExtension>()
.ok_or_else(|| Status::internal("Failed to load extensions before handling request"))?
.role;
Ok(role)
}
}
struct RoleExtension {
role: Role,
}
pub fn interceptor(mut request: Request<()>) -> Result<Request<()>, Status> {
let role = request
.metadata()
.get(ROLE_HEADER)
.map(|header| header.to_str())
.transpose()
.map_err(|error| {
let message = format!("Invalid {} header: {}", ROLE_HEADER, error);
Status::invalid_argument(message)
})?
.map(String::from);
request.extensions_mut().insert(RoleExtension { role });
Ok(request)
}