aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authoracdenisSK <[email protected]>2018-06-08 22:25:32 +0200
committeracdenisSK <[email protected]>2018-06-08 22:27:35 +0200
commit9b2cd75baf1fa7ee063f47e966ee3f6566a6d45c (patch)
treec6fe8f0ad888ce2b8a167c5bbb0e6a6e5d694567 /src
parentHandle debug impls better (diff)
downloadserenity-9b2cd75baf1fa7ee063f47e966ee3f6566a6d45c.tar.xz
serenity-9b2cd75baf1fa7ee063f47e966ee3f6566a6d45c.zip
Add the missing `rest` method
Diffstat (limited to 'src')
-rw-r--r--src/framework/standard/args.rs53
1 files changed, 47 insertions, 6 deletions
diff --git a/src/framework/standard/args.rs b/src/framework/standard/args.rs
index 1abe421..213349e 100644
--- a/src/framework/standard/args.rs
+++ b/src/framework/standard/args.rs
@@ -78,17 +78,19 @@ enum TokenKind {
struct Token<'a> {
lit: &'a str,
kind: TokenKind,
+ pos: usize,
}
impl<'a> Token<'a> {
- fn new(kind: TokenKind, lit: &'a str) -> Self {
- Token { kind, lit }
+ fn new(kind: TokenKind, lit: &'a str, pos: usize) -> Self {
+ Token { kind, lit, pos }
}
fn empty() -> Self {
Token {
kind: TokenKind::Eof,
lit: "",
+ pos: !0,
}
}
}
@@ -97,6 +99,7 @@ impl<'a> Token<'a> {
struct TokenOwned {
kind: TokenKind,
lit: String,
+ pos: usize,
}
impl<'a> Token<'a> {
@@ -104,6 +107,7 @@ impl<'a> Token<'a> {
TokenOwned {
kind: self.kind,
lit: self.lit.to_string(),
+ pos: self.pos,
}
}
}
@@ -160,7 +164,7 @@ impl<'a> Lexer<'a> {
if self.current().unwrap().contains(self.delims) {
let start = self.offset;
self.next();
- return Token::new(TokenKind::Delimiter, &self.msg[start..self.offset]);
+ return Token::new(TokenKind::Delimiter, &self.msg[start..self.offset], start);
}
if self.current().unwrap() == "\"" {
@@ -176,9 +180,9 @@ impl<'a> Lexer<'a> {
return if self.at_end() && &self.msg[end-1..end] != "\"" {
// invalid, missing an end quote; view it as a normal argument instead.
- Token::new(TokenKind::Argument, &self.msg[start..])
+ Token::new(TokenKind::Argument, &self.msg[start..], start)
} else {
- Token::new(TokenKind::QuotedArgument, &self.msg[start..end])
+ Token::new(TokenKind::QuotedArgument, &self.msg[start..end], start)
};
}
@@ -188,7 +192,7 @@ impl<'a> Lexer<'a> {
self.next();
}
- Token::new(TokenKind::Argument, &self.msg[start..self.offset])
+ Token::new(TokenKind::Argument, &self.msg[start..self.offset], start)
}
}
@@ -359,6 +363,43 @@ impl Args {
&s[1..end]
}
+ /// Returns the message starting from the token in the current argument offset; the "rest" of the message.
+ ///
+ /// # Examples
+ ///
+ /// ```rust
+ /// use serenity::framework::standard::Args;
+ ///
+ /// let mut args = Args::new("42 69 91", &[" ".to_string()]);
+ ///
+ /// assert_eq!(args.rest(), "42 69 91");
+ ///
+ /// args.skip();
+ ///
+ /// assert_eq!(args.rest(), "69 91");
+ ///
+ /// args.skip();
+ ///
+ /// assert_eq!(args.rest(), "91");
+ ///
+ /// args.skip();
+ ///
+ /// assert_eq!(args.rest(), "");
+ /// ```
+ pub fn rest(&self) -> &str {
+ if self.is_empty() {
+ return "";
+ }
+
+ let args = &self.args[self.offset..];
+
+ if let Some(token) = args.get(0) {
+ &self.message[token.pos..]
+ } else {
+ &self.message[..]
+ }
+ }
+
/// The full amount of recognised arguments.
///
/// **Note**: