use rama_core::error::{BoxError, ErrorContext as _};
use rama_http_types::{HeaderValue, header::ToStrError};
use rama_net::uri::Uri;
#[derive(Clone, Debug, PartialEq)]
pub struct Location(HeaderValue);
derive_header! {
Location(_),
name: LOCATION
}
impl Location {
pub fn new(value: HeaderValue) -> Self {
Self(value)
}
pub fn to_str(&self) -> Result<&str, ToStrError> {
self.0.to_str()
}
}
impl TryFrom<Uri> for Location {
type Error = BoxError;
#[inline]
fn try_from(value: Uri) -> Result<Self, Self::Error> {
Self::try_from(&value)
}
}
impl TryFrom<&Uri> for Location {
type Error = BoxError;
fn try_from(value: &Uri) -> Result<Self, Self::Error> {
Ok(Self(
HeaderValue::try_from(value.to_string()).context("parse uri as header value")?,
))
}
}
#[cfg(test)]
mod tests {
use super::super::test_decode;
use super::*;
#[test]
fn absolute_uri() {
let s = "http://www.example.net/index.html";
let loc = test_decode::<Location>(&[s]).unwrap();
assert_eq!(loc, Location(HeaderValue::from_static(s)));
}
#[test]
fn relative_uri_with_fragment() {
let s = "/People.html#tim";
let loc = test_decode::<Location>(&[s]).unwrap();
assert_eq!(loc, Location(HeaderValue::from_static(s)));
}
}