Struct rocket_http::uri::Origin
source · pub struct Origin<'a> { /* private fields */ }
Expand description
A URI with an absolute path and optional query: /path?query
.
Origin URIs are the primary type of URI encountered in Rocket applications. They are also the simplest type of URIs, made up of only a path and an optional query.
Structure
The following diagram illustrates the syntactic structure of an origin URI:
/first_segment/second_segment/third?optional=query
|---------------------------------| |------------|
path query
The URI must begin with a /
, can be followed by any number of segments,
and an optional ?
query separator and query string.
Normalization
Rocket prefers, and will sometimes require, origin URIs to be normalized. A normalized origin URI is a valid origin URI that contains no empty segments except optionally a trailing slash.
As an example, the following URIs are all valid, normalized URIs:
"/",
"/?",
"/a/b/",
"/a/b/c",
"/a/b/c/",
"/a/b/c?",
"/a/b/c?q",
"/hello?lang=en",
"/hello/?lang=en",
"/some%20thing?q=foo&lang=fr",
By contrast, the following are valid but non-normal URIs:
"//", // an empty segment
"/a/ab//c//d", // two empty segments
"/?a&&b", // empty query segment
"/?foo&", // trailing empty query segment
The Origin::into_normalized()
method can be used to normalize any Origin
:
// non-normal versions
"//", "/a/b//c", "/a/ab//c//d/", "/a?a&&b&",
// normalized versions
"/", "/a/b/c", "/a/ab/c/d/", "/a?a&b",
(De)serialization
Origin
is both Serialize
and Deserialize
:
use serde::{Serialize, Deserialize};
use rocket::http::uri::Origin;
#[derive(Deserialize, Serialize)]
struct UriOwned {
uri: Origin<'static>,
}
#[derive(Deserialize, Serialize)]
struct UriBorrowed<'a> {
uri: Origin<'a>,
}
Implementations§
source§impl<'a> Origin<'a>
impl<'a> Origin<'a>
sourcepub fn parse(string: &'a str) -> Result<Origin<'a>, Error<'a>>
pub fn parse(string: &'a str) -> Result<Origin<'a>, Error<'a>>
Parses the string string
into an Origin
. Parsing will never
allocate. Returns an Error
if string
is not a valid origin URI.
Example
use rocket::http::uri::Origin;
// Parse a valid origin URI.
let uri = Origin::parse("/a/b/c?query").expect("valid URI");
assert_eq!(uri.path(), "/a/b/c");
assert_eq!(uri.query().unwrap(), "query");
// Invalid URIs fail to parse.
Origin::parse("foo bar").expect_err("invalid URI");
// Prefer to use `uri!()` when the input is statically known:
let uri = uri!("/a/b/c?query");
assert_eq!(uri.path(), "/a/b/c");
assert_eq!(uri.query().unwrap(), "query");
sourcepub fn parse_owned(string: String) -> Result<Origin<'static>, Error<'static>>
pub fn parse_owned(string: String) -> Result<Origin<'static>, Error<'static>>
Parses the string string
into an Origin
. Never allocates on success.
May allocate on error.
This method should be used instead of Origin::parse()
when
the source URI is already a String
. Returns an Error
if string
is
not a valid origin URI.
Example
use rocket::http::uri::Origin;
let source = format!("/foo/{}/three", 2);
let uri = Origin::parse_owned(source).expect("valid URI");
assert_eq!(uri.path(), "/foo/2/three");
assert!(uri.query().is_none());
sourcepub fn path(&self) -> Path<'_>
pub fn path(&self) -> Path<'_>
Returns the path part of this URI.
Example
let uri = uri!("/a/b/c");
assert_eq!(uri.path(), "/a/b/c");
let uri = uri!("/a/b/c?name=bob");
assert_eq!(uri.path(), "/a/b/c");
sourcepub fn query(&self) -> Option<Query<'_>>
pub fn query(&self) -> Option<Query<'_>>
Returns the query part of this URI without the question mark, if there is any.
Example
let uri = uri!("/a/b/c?alphabet=true");
assert_eq!(uri.query().unwrap(), "alphabet=true");
let uri = uri!("/a/b/c");
assert!(uri.query().is_none());
sourcepub fn map_path<'s, F, P>(&'s self, f: F) -> Option<Self>where
F: FnOnce(&'s RawStr) -> P,
P: Into<RawStrBuf> + 's,
pub fn map_path<'s, F, P>(&'s self, f: F) -> Option<Self>where F: FnOnce(&'s RawStr) -> P, P: Into<RawStrBuf> + 's,
Applies the function f
to the internal path
and returns a new
Origin
with the new path. If the path returned from f
is invalid,
returns None
. Otherwise, returns Some
, even if the new path is
abnormal.
Examples
Affix a trailing slash if one isn’t present.
let uri = uri!("/a/b/c");
let expected_uri = uri!("/a/b/c/d");
assert_eq!(uri.map_path(|p| format!("{}/d", p)), Some(expected_uri));
let uri = uri!("/a/b/c");
let abnormal_map = uri.map_path(|p| format!("{}///d", p));
assert_eq!(abnormal_map.unwrap(), "/a/b/c///d");
let uri = uri!("/a/b/c");
let expected = uri!("/b/c");
let mapped = uri.map_path(|p| p.strip_prefix("/a").unwrap_or(p));
assert_eq!(mapped, Some(expected));
let uri = uri!("/a");
assert_eq!(uri.map_path(|p| p.strip_prefix("/a").unwrap_or(p)), None);
let uri = uri!("/a/b/c");
assert_eq!(uri.map_path(|p| format!("hi/{}", p)), None);
sourcepub fn clear_query(&mut self)
pub fn clear_query(&mut self)
Removes the query part of this URI, if there is any.
Example
let mut uri = uri!("/a/b/c?query=some");
assert_eq!(uri.query().unwrap(), "query=some");
uri.clear_query();
assert!(uri.query().is_none());
sourcepub fn is_normalized(&self) -> bool
pub fn is_normalized(&self) -> bool
Returns true
if self
is normalized. Otherwise, returns false
.
See Normalization for more information on what it
means for an origin URI to be normalized. Note that uri!()
always
normalizes static input.
Example
use rocket::http::uri::Origin;
assert!(Origin::parse("/").unwrap().is_normalized());
assert!(Origin::parse("/a/b/c").unwrap().is_normalized());
assert!(Origin::parse("/a/b/c?a=b&c").unwrap().is_normalized());
assert!(!Origin::parse("/a/b/c//d").unwrap().is_normalized());
assert!(!Origin::parse("/a?q&&b").unwrap().is_normalized());
assert!(uri!("/a/b/c//d").is_normalized());
assert!(uri!("/a?q&&b").is_normalized());
sourcepub fn normalize(&mut self)
pub fn normalize(&mut self)
Normalizes self
. This is a no-op if self
is already normalized.
See Normalization for more information on what it means for an origin URI to be normalized.
Example
use rocket::http::uri::Origin;
let mut abnormal = Origin::parse("/a/b/c//d").unwrap();
assert!(!abnormal.is_normalized());
abnormal.normalize();
assert!(abnormal.is_normalized());
sourcepub fn into_normalized(self) -> Self
pub fn into_normalized(self) -> Self
Consumes self
and returns a normalized version.
This is a no-op if self
is already normalized. See
Normalization for more information on what it means
for an origin URI to be normalized.
Example
use rocket::http::uri::Origin;
let abnormal = Origin::parse("/a/b/c//d").unwrap();
assert!(!abnormal.is_normalized());
assert!(abnormal.into_normalized().is_normalized());
sourcepub fn has_trailing_slash(&self) -> bool
pub fn has_trailing_slash(&self) -> bool
Returns true
if self
has a trailing slash.
This is defined as path.len() > 1
&& path.ends_with('/')
. This
implies that the URI /
is not considered to have a trailing slash.
Example
assert!(!uri!("/").has_trailing_slash());
assert!(!uri!("/a").has_trailing_slash());
assert!(!uri!("/foo/bar/baz").has_trailing_slash());
assert!(uri!("/a/").has_trailing_slash());
assert!(uri!("/foo/").has_trailing_slash());
assert!(uri!("/foo/bar/baz/").has_trailing_slash());
sourcepub fn is_normalized_nontrailing(&self) -> bool
pub fn is_normalized_nontrailing(&self) -> bool
Returns true
if self
is normalized (Origin::is_normalized()
) and
does not have a trailing slash (Origin::has_trailing_slash()).
Otherwise returns false
.
Example
use rocket::http::uri::Origin;
let origin = Origin::parse("/").unwrap();
assert!(origin.is_normalized_nontrailing());
let origin = Origin::parse("/foo/bar").unwrap();
assert!(origin.is_normalized_nontrailing());
let origin = Origin::parse("//").unwrap();
assert!(!origin.is_normalized_nontrailing());
let origin = Origin::parse("/foo/bar//baz/").unwrap();
assert!(!origin.is_normalized_nontrailing());
let origin = Origin::parse("/foo/bar/").unwrap();
assert!(!origin.is_normalized_nontrailing());
sourcepub fn into_normalized_nontrailing(self) -> Self
pub fn into_normalized_nontrailing(self) -> Self
Converts self
into a normalized origin path without a trailing slash.
Does nothing is self
is already normalized_nontrailing
.
Example
use rocket::http::uri::Origin;
let origin = Origin::parse("/").unwrap();
assert!(origin.is_normalized_nontrailing());
let normalized = origin.into_normalized_nontrailing();
assert_eq!(normalized, uri!("/"));
let origin = Origin::parse("//").unwrap();
assert!(!origin.is_normalized_nontrailing());
let normalized = origin.into_normalized_nontrailing();
assert_eq!(normalized, uri!("/"));
let origin = Origin::parse_owned("/foo/bar//baz/".into()).unwrap();
assert!(!origin.is_normalized_nontrailing());
let normalized = origin.into_normalized_nontrailing();
assert_eq!(normalized, uri!("/foo/bar/baz"));
let origin = Origin::parse("/foo/bar/").unwrap();
assert!(!origin.is_normalized_nontrailing());
let normalized = origin.into_normalized_nontrailing();
assert_eq!(normalized, uri!("/foo/bar"));
Trait Implementations§
source§impl<'a, 'de> Deserialize<'de> for Origin<'a>
impl<'a, 'de> Deserialize<'de> for Origin<'a>
source§fn deserialize<D: Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error>
fn deserialize<D: Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error>
source§impl PartialEq<&str> for Origin<'_>
impl PartialEq<&str> for Origin<'_>
source§impl PartialEq<Origin<'_>> for str
impl PartialEq<Origin<'_>> for str
source§impl<'b, 'a> PartialEq<Origin<'a>> for Uri<'b>
impl<'b, 'a> PartialEq<Origin<'a>> for Uri<'b>
source§impl<'a, 'b> PartialEq<Origin<'b>> for Origin<'a>
impl<'a, 'b> PartialEq<Origin<'b>> for Origin<'a>
source§impl<'b, 'a> PartialEq<Uri<'b>> for Origin<'a>
impl<'b, 'a> PartialEq<Uri<'b>> for Origin<'a>
source§impl PartialEq<str> for Origin<'_>
impl PartialEq<str> for Origin<'_>
impl Eq for Origin<'_>
Auto Trait Implementations§
impl<'a> !RefUnwindSafe for Origin<'a>
impl<'a> Send for Origin<'a>
impl<'a> Sync for Origin<'a>
impl<'a> Unpin for Origin<'a>
impl<'a> UnwindSafe for Origin<'a>
Blanket Implementations§
source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere T: ?Sized,
source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
source§impl<Q, K> Equivalent<K> for Qwhere
Q: Eq + ?Sized,
K: Borrow<Q> + ?Sized,
impl<Q, K> Equivalent<K> for Qwhere Q: Eq + ?Sized, K: Borrow<Q> + ?Sized,
source§fn equivalent(&self, key: &K) -> bool
fn equivalent(&self, key: &K) -> bool
key
and return true
if they are equal.source§impl<T> Instrument for T
impl<T> Instrument for T
source§fn instrument(self, span: Span) -> Instrumented<Self>
fn instrument(self, span: Span) -> Instrumented<Self>
source§fn in_current_span(self) -> Instrumented<Self>
fn in_current_span(self) -> Instrumented<Self>
source§impl<T> IntoCollection<T> for T
impl<T> IntoCollection<T> for T
source§impl<T> Paint for Twhere
T: ?Sized,
impl<T> Paint for Twhere T: ?Sized,
source§fn fg(&self, value: Color) -> Painted<&T>
fn fg(&self, value: Color) -> Painted<&T>
Returns a styled value derived from self
with the foreground set to
value
.
This method should be used rarely. Instead, prefer to use color-specific
builder methods like red()
and
green()
, which have the same functionality but are
pithier.
Example
Set foreground color to white using fg()
:
use yansi::{Paint, Color};
painted.fg(Color::White);
Set foreground color to white using white()
.
use yansi::Paint;
painted.white();
source§fn bright_black(&self) -> Painted<&T>
fn bright_black(&self) -> Painted<&T>
source§fn bright_red(&self) -> Painted<&T>
fn bright_red(&self) -> Painted<&T>
source§fn bright_green(&self) -> Painted<&T>
fn bright_green(&self) -> Painted<&T>
source§fn bright_yellow(&self) -> Painted<&T>
fn bright_yellow(&self) -> Painted<&T>
Returns self
with the
fg()
set to
Color::BrightYellow
.
Example
println!("{}", value.bright_yellow());
source§fn bright_blue(&self) -> Painted<&T>
fn bright_blue(&self) -> Painted<&T>
source§fn bright_magenta(&self) -> Painted<&T>
fn bright_magenta(&self) -> Painted<&T>
Returns self
with the
fg()
set to
Color::BrightMagenta
.
Example
println!("{}", value.bright_magenta());
source§fn bright_cyan(&self) -> Painted<&T>
fn bright_cyan(&self) -> Painted<&T>
source§fn bright_white(&self) -> Painted<&T>
fn bright_white(&self) -> Painted<&T>
source§fn bg(&self, value: Color) -> Painted<&T>
fn bg(&self, value: Color) -> Painted<&T>
Returns a styled value derived from self
with the background set to
value
.
This method should be used rarely. Instead, prefer to use color-specific
builder methods like on_red()
and
on_green()
, which have the same functionality but
are pithier.
Example
Set background color to red using fg()
:
use yansi::{Paint, Color};
painted.bg(Color::Red);
Set background color to red using on_red()
.
use yansi::Paint;
painted.on_red();
source§fn on_primary(&self) -> Painted<&T>
fn on_primary(&self) -> Painted<&T>
source§fn on_magenta(&self) -> Painted<&T>
fn on_magenta(&self) -> Painted<&T>
source§fn on_bright_black(&self) -> Painted<&T>
fn on_bright_black(&self) -> Painted<&T>
Returns self
with the
bg()
set to
Color::BrightBlack
.
Example
println!("{}", value.on_bright_black());
source§fn on_bright_red(&self) -> Painted<&T>
fn on_bright_red(&self) -> Painted<&T>
source§fn on_bright_green(&self) -> Painted<&T>
fn on_bright_green(&self) -> Painted<&T>
Returns self
with the
bg()
set to
Color::BrightGreen
.
Example
println!("{}", value.on_bright_green());
source§fn on_bright_yellow(&self) -> Painted<&T>
fn on_bright_yellow(&self) -> Painted<&T>
Returns self
with the
bg()
set to
Color::BrightYellow
.
Example
println!("{}", value.on_bright_yellow());
source§fn on_bright_blue(&self) -> Painted<&T>
fn on_bright_blue(&self) -> Painted<&T>
Returns self
with the
bg()
set to
Color::BrightBlue
.
Example
println!("{}", value.on_bright_blue());
source§fn on_bright_magenta(&self) -> Painted<&T>
fn on_bright_magenta(&self) -> Painted<&T>
Returns self
with the
bg()
set to
Color::BrightMagenta
.
Example
println!("{}", value.on_bright_magenta());
source§fn on_bright_cyan(&self) -> Painted<&T>
fn on_bright_cyan(&self) -> Painted<&T>
Returns self
with the
bg()
set to
Color::BrightCyan
.
Example
println!("{}", value.on_bright_cyan());
source§fn on_bright_white(&self) -> Painted<&T>
fn on_bright_white(&self) -> Painted<&T>
Returns self
with the
bg()
set to
Color::BrightWhite
.
Example
println!("{}", value.on_bright_white());
source§fn attr(&self, value: Attribute) -> Painted<&T>
fn attr(&self, value: Attribute) -> Painted<&T>
Enables the styling Attribute
value
.
This method should be used rarely. Instead, prefer to use
attribute-specific builder methods like bold()
and
underline()
, which have the same functionality
but are pithier.
Example
Make text bold using attr()
:
use yansi::{Paint, Attribute};
painted.attr(Attribute::Bold);
Make text bold using using bold()
.
use yansi::Paint;
painted.bold();
source§fn underline(&self) -> Painted<&T>
fn underline(&self) -> Painted<&T>
Returns self
with the
attr()
set to
Attribute::Underline
.
Example
println!("{}", value.underline());
source§fn rapid_blink(&self) -> Painted<&T>
fn rapid_blink(&self) -> Painted<&T>
Returns self
with the
attr()
set to
Attribute::RapidBlink
.
Example
println!("{}", value.rapid_blink());
source§fn quirk(&self, value: Quirk) -> Painted<&T>
fn quirk(&self, value: Quirk) -> Painted<&T>
Enables the yansi
Quirk
value
.
This method should be used rarely. Instead, prefer to use quirk-specific
builder methods like mask()
and
wrap()
, which have the same functionality but are
pithier.
Example
Enable wrapping using .quirk()
:
use yansi::{Paint, Quirk};
painted.quirk(Quirk::Wrap);
Enable wrapping using wrap()
.
use yansi::Paint;
painted.wrap();
source§fn whenever(&self, value: Condition) -> Painted<&T>
fn whenever(&self, value: Condition) -> Painted<&T>
Conditionally enable styling based on whether the Condition
value
applies. Replaces any previous condition.
See the crate level docs for more details.
Example
Enable styling painted
only when both stdout
and stderr
are TTYs:
use yansi::{Paint, Condition};
painted.red().on_yellow().whenever(Condition::STDOUTERR_ARE_TTY);