pub struct Maybe<P, T = Empty> { /* private fields */ }
Expand description
Parses an optional expression introduced by a single-token lookahead.
#[derive(PartialEq, Eq, Debug, Parse, ToTokens)]
enum Ty {
Named(Ident),
Ref(
token::And,
#[parsel(recursive)]
Box<Self>,
),
Opt(
token::Question,
#[parsel(recursive)]
Box<Self>,
),
}
#[derive(PartialEq, Eq, Debug, Parse, ToTokens)]
struct TyAnnot {
colon: token::Colon,
ty: Ty,
}
#[derive(PartialEq, Eq, Debug, Parse, ToTokens)]
struct Function {
kw_fn: token::Fn,
name: Ident,
argument: Paren<Maybe<Ident, TyAnnot>>,
return_ty: Maybe<token::RArrow, Ty>,
body: Brace<Empty>,
}
let unit_to_unit_function: Function = parse_quote!{
fn foo() {}
};
assert_eq!(
unit_to_unit_function,
Function {
kw_fn: Default::default(),
name: ident("foo"),
argument: Paren::default(),
return_ty: Maybe::default(),
body: Brace::default(),
}
);
let unit_to_opt_function: Function = parse_quote!{
fn another_name() -> ?Rofl {}
};
assert_eq!(
unit_to_opt_function,
Function {
kw_fn: Default::default(),
name: ident("another_name"),
argument: Paren::default(),
return_ty: Maybe::from((
token::RArrow::default(),
Ty::Opt(
token::Question::default(),
Box::new(Ty::Named(ident("Rofl"))),
)
)),
body: Brace::default(),
}
);
let opt_to_ref_function: Function = parse_quote!{
fn fn_3(the_arg: ?&DoubleTrouble) -> &Indirect {}
};
assert_eq!(
opt_to_ref_function,
Function {
kw_fn: Default::default(),
name: ident("fn_3"),
argument: Paren::from(Maybe::from((
ident("the_arg"),
TyAnnot {
colon: Default::default(),
ty: Ty::Opt(
token::Question::default(),
Box::new(Ty::Ref(
token::And::default(),
Box::new(Ty::Named(ident("DoubleTrouble"))),
)),
)
}
))),
return_ty: Maybe::from((
token::RArrow::default(),
Ty::Ref(
token::And::default(),
Box::new(Ty::Named(ident("Indirect"))),
)
)),
body: Brace::default(),
}
);
Implementations
sourceimpl<P, T> Maybe<P, T>
impl<P, T> Maybe<P, T>
pub const fn new() -> Self
pub fn as_prefix(&self) -> Option<&P>
pub fn as_prefix_mut(&mut self) -> Option<&mut P>
pub fn into_prefix(self) -> Option<P>
pub fn as_ref(&self) -> Option<&T>
pub fn as_mut(&mut self) -> Option<&mut T>
pub fn into_inner(self) -> Option<T>
pub fn as_parts(&self) -> Option<&(P, T)>
pub fn as_parts_mut(&mut self) -> Option<&mut (P, T)>
pub fn into_parts(self) -> Option<(P, T)>
pub fn into_prefix_iter(self) -> IntoIter<P>
pub fn prefix_iter(&self) -> IntoIter<&P>
pub fn prefix_iter_mut(&mut self) -> IntoIter<&mut P>
pub fn iter(&self) -> IntoIter<&T>
pub fn iter_mut(&mut self) -> IntoIter<&mut T>
pub fn into_parts_iter(self) -> IntoIter<(P, T)>
pub fn parts_iter(&self) -> Iter<'_, (P, T)>
pub fn parts_iter_mut(&mut self) -> IterMut<'_, (P, T)>
Methods from Deref<Target = Option<(P, T)>>
sourcepub fn is_some_and(&self, f: impl for<'_> FnOnce(&T) -> bool) -> bool
🔬 This is a nightly-only experimental API. (is_some_with
)
pub fn is_some_and(&self, f: impl for<'_> FnOnce(&T) -> bool) -> bool
is_some_with
)Returns true
if the option is a Some
and the value inside of it matches a predicate.
Examples
#![feature(is_some_with)]
let x: Option<u32> = Some(2);
assert_eq!(x.is_some_and(|&x| x > 1), true);
let x: Option<u32> = Some(0);
assert_eq!(x.is_some_and(|&x| x > 1), false);
let x: Option<u32> = None;
assert_eq!(x.is_some_and(|&x| x > 1), false);
1.0.0 · sourcepub fn as_ref(&self) -> Option<&T>
pub fn as_ref(&self) -> Option<&T>
Converts from &Option<T>
to Option<&T>
.
Examples
Converts an Option<String>
into an Option<usize>
, preserving
the original. The map
method takes the self
argument by value, consuming the original,
so this technique uses as_ref
to first take an Option
to a reference
to the value inside the original.
let text: Option<String> = Some("Hello, world!".to_string());
// First, cast `Option<String>` to `Option<&String>` with `as_ref`,
// then consume *that* with `map`, leaving `text` on the stack.
let text_length: Option<usize> = text.as_ref().map(|s| s.len());
println!("still can print text: {text:?}");
1.0.0 · sourcepub fn as_mut(&mut self) -> Option<&mut T>
pub fn as_mut(&mut self) -> Option<&mut T>
Converts from &mut Option<T>
to Option<&mut T>
.
Examples
let mut x = Some(2);
match x.as_mut() {
Some(v) => *v = 42,
None => {},
}
assert_eq!(x, Some(42));
1.40.0 · sourcepub fn as_deref(&self) -> Option<&<T as Deref>::Target> where
T: Deref,
pub fn as_deref(&self) -> Option<&<T as Deref>::Target> where
T: Deref,
Converts from Option<T>
(or &Option<T>
) to Option<&T::Target>
.
Leaves the original Option in-place, creating a new one with a reference
to the original one, additionally coercing the contents via Deref
.
Examples
let x: Option<String> = Some("hey".to_owned());
assert_eq!(x.as_deref(), Some("hey"));
let x: Option<String> = None;
assert_eq!(x.as_deref(), None);
1.40.0 · sourcepub fn as_deref_mut(&mut self) -> Option<&mut <T as Deref>::Target> where
T: DerefMut,
pub fn as_deref_mut(&mut self) -> Option<&mut <T as Deref>::Target> where
T: DerefMut,
Converts from Option<T>
(or &mut Option<T>
) to Option<&mut T::Target>
.
Leaves the original Option
in-place, creating a new one containing a mutable reference to
the inner type’s Deref::Target
type.
Examples
let mut x: Option<String> = Some("hey".to_owned());
assert_eq!(x.as_deref_mut().map(|x| {
x.make_ascii_uppercase();
x
}), Some("HEY".to_owned().as_mut_str()));
1.0.0 · sourcepub fn iter(&self) -> Iter<'_, T>
pub fn iter(&self) -> Iter<'_, T>
Returns an iterator over the possibly contained value.
Examples
let x = Some(4);
assert_eq!(x.iter().next(), Some(&4));
let x: Option<u32> = None;
assert_eq!(x.iter().next(), None);
1.0.0 · sourcepub fn iter_mut(&mut self) -> IterMut<'_, T>
pub fn iter_mut(&mut self) -> IterMut<'_, T>
Returns a mutable iterator over the possibly contained value.
Examples
let mut x = Some(4);
match x.iter_mut().next() {
Some(v) => *v = 42,
None => {},
}
assert_eq!(x, Some(42));
let mut x: Option<u32> = None;
assert_eq!(x.iter_mut().next(), None);
1.53.0 · sourcepub fn insert(&mut self, value: T) -> &mut T
pub fn insert(&mut self, value: T) -> &mut T
Inserts value
into the option, then returns a mutable reference to it.
If the option already contains a value, the old value is dropped.
See also Option::get_or_insert
, which doesn’t update the value if
the option already contains Some
.
Example
let mut opt = None;
let val = opt.insert(1);
assert_eq!(*val, 1);
assert_eq!(opt.unwrap(), 1);
let val = opt.insert(2);
assert_eq!(*val, 2);
*val = 3;
assert_eq!(opt.unwrap(), 3);
1.20.0 · sourcepub fn get_or_insert(&mut self, value: T) -> &mut T
pub fn get_or_insert(&mut self, value: T) -> &mut T
Inserts value
into the option if it is None
, then
returns a mutable reference to the contained value.
See also Option::insert
, which updates the value even if
the option already contains Some
.
Examples
let mut x = None;
{
let y: &mut u32 = x.get_or_insert(5);
assert_eq!(y, &5);
*y = 7;
}
assert_eq!(x, Some(7));
sourcepub fn get_or_insert_default(&mut self) -> &mut T where
T: Default,
🔬 This is a nightly-only experimental API. (option_get_or_insert_default
)
pub fn get_or_insert_default(&mut self) -> &mut T where
T: Default,
option_get_or_insert_default
)1.20.0 · sourcepub fn get_or_insert_with<F>(&mut self, f: F) -> &mut T where
F: FnOnce() -> T,
pub fn get_or_insert_with<F>(&mut self, f: F) -> &mut T where
F: FnOnce() -> T,
1.31.0 · sourcepub fn replace(&mut self, value: T) -> Option<T>
pub fn replace(&mut self, value: T) -> Option<T>
Replaces the actual value in the option by the value given in parameter,
returning the old value if present,
leaving a Some
in its place without deinitializing either one.
Examples
let mut x = Some(2);
let old = x.replace(5);
assert_eq!(x, Some(5));
assert_eq!(old, Some(2));
let mut x = None;
let old = x.replace(3);
assert_eq!(x, Some(3));
assert_eq!(old, None);
sourcepub fn contains<U>(&self, x: &U) -> bool where
U: PartialEq<T>,
🔬 This is a nightly-only experimental API. (option_result_contains
)
pub fn contains<U>(&self, x: &U) -> bool where
U: PartialEq<T>,
option_result_contains
)Returns true
if the option is a Some
value containing the given value.
Examples
#![feature(option_result_contains)]
let x: Option<u32> = Some(2);
assert_eq!(x.contains(&2), true);
let x: Option<u32> = Some(3);
assert_eq!(x.contains(&2), false);
let x: Option<u32> = None;
assert_eq!(x.contains(&2), false);
Trait Implementations
sourceimpl<P, T> IntoIterator for Maybe<P, T>
impl<P, T> IntoIterator for Maybe<P, T>
sourceimpl<'a, P, T> IntoIterator for &'a Maybe<P, T>
impl<'a, P, T> IntoIterator for &'a Maybe<P, T>
sourceimpl<'a, P, T> IntoIterator for &'a mut Maybe<P, T>
impl<'a, P, T> IntoIterator for &'a mut Maybe<P, T>
sourceimpl<P, T> Parse for Maybe<P, T> where
P: Parse,
T: Parse,
impl<P, T> Parse for Maybe<P, T> where
P: Parse,
T: Parse,
fn parse(input: ParseStream<'_>) -> Result<Self>
sourceimpl<P, T> ToTokens for Maybe<P, T> where
P: ToTokens,
T: ToTokens,
impl<P, T> ToTokens for Maybe<P, T> where
P: ToTokens,
T: ToTokens,
sourcefn to_tokens(&self, tokens: &mut TokenStream)
fn to_tokens(&self, tokens: &mut TokenStream)
Write self
to the given TokenStream
. Read more
sourcefn to_token_stream(&self) -> TokenStream
fn to_token_stream(&self) -> TokenStream
Convert self
directly into a TokenStream
object. Read more
sourcefn into_token_stream(self) -> TokenStream
fn into_token_stream(self) -> TokenStream
Convert self
directly into a TokenStream
object. Read more
impl<P: Copy, T: Copy> Copy for Maybe<P, T>
impl<P: Eq, T: Eq> Eq for Maybe<P, T>
impl<P, T> StructuralEq for Maybe<P, T>
impl<P, T> StructuralPartialEq for Maybe<P, T>
Auto Trait Implementations
impl<P, T> RefUnwindSafe for Maybe<P, T> where
P: RefUnwindSafe,
T: RefUnwindSafe,
impl<P, T> Send for Maybe<P, T> where
P: Send,
T: Send,
impl<P, T> Sync for Maybe<P, T> where
P: Sync,
T: Sync,
impl<P, T> Unpin for Maybe<P, T> where
P: Unpin,
T: Unpin,
impl<P, T> UnwindSafe for Maybe<P, T> where
P: UnwindSafe,
T: UnwindSafe,
Blanket Implementations
sourceimpl<T> BorrowMut<T> for T where
T: ?Sized,
impl<T> BorrowMut<T> for T where
T: ?Sized,
const: unstable · sourcefn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Mutably borrows from an owned value. Read more
sourceimpl<T> Spanned for T where
T: Spanned + ?Sized,
impl<T> Spanned for T where
T: Spanned + ?Sized,
sourcefn span(&self) -> Span
fn span(&self) -> Span
Returns a Span
covering the complete contents of this syntax tree
node, or Span::call_site()
if this node is empty. Read more
sourceimpl<T> SpannedExt for T where
T: Spanned + ?Sized,
impl<T> SpannedExt for T where
T: Spanned + ?Sized,
sourcefn byte_range(&self, source: &str) -> Range<usize>
fn byte_range(&self, source: &str) -> Range<usize>
TODO(H2CO3): a faster, less naive implementation would be great.
We should use the byte offset of start
to compute that of end
,
sparing the double scan of the source up until the start location.
let source = r#"
-3.667
1248 "string ű literal"
"wíőzs"
"#;
let tokens: Many<Lit> = source.parse()?;
assert_eq!(tokens.len(), 4);
assert_eq!(tokens[0].byte_range(source), 4..10);
assert_eq!(tokens[1].byte_range(source), 13..17);
assert_eq!(tokens[2].byte_range(source), 19..38);
assert_eq!(tokens[3].byte_range(source), 45..54);
sourcefn char_range(&self, source: &str) -> Range<usize>
fn char_range(&self, source: &str) -> Range<usize>
TODO(H2CO3): a faster, less naive implementation would be great.
We should use the char offset of start
to compute that of end
,
sparing the double scan of the source up until the start location.
let source = r#"
-3.667
1248 "string ű literal"
"wíőzs"
"#;
let tokens: Many<Lit> = source.parse()?;
assert_eq!(tokens.len(), 4);
assert_eq!(tokens[0].char_range(source), 4..10);
assert_eq!(tokens[1].char_range(source), 13..17);
assert_eq!(tokens[2].char_range(source), 19..37);
assert_eq!(tokens[3].char_range(source), 44..51);