blob: 78c879df07869bcea3a5c6c8c380c7d05aafffbf [file] [log] [blame]
use super::ToTokens;
use std::fmt::{self, Display};
use std::str::FromStr;
/// Tokens produced by a `quote!(...)` invocation.
#[derive(Debug, Clone, Eq, PartialEq)]
pub struct Tokens(String);
impl Tokens {
/// Empty tokens.
pub fn new() -> Self {
Tokens(String::new())
}
/// For use by `ToTokens` implementations.
///
/// ```
/// # #[macro_use] extern crate quote;
/// # use quote::{Tokens, ToTokens};
/// # fn main() {
/// struct X;
///
/// impl ToTokens for X {
/// fn to_tokens(&self, tokens: &mut Tokens) {
/// tokens.append("a");
/// tokens.append("b");
/// tokens.append("c");
/// }
/// }
///
/// let tokens = quote!(#X);
/// assert_eq!(tokens.as_str(), "a b c");
/// # }
/// ```
pub fn append<T: AsRef<str>>(&mut self, token: T) {
if !self.0.is_empty() && !token.as_ref().is_empty() {
self.0.push(' ');
}
self.0.push_str(token.as_ref());
}
/// For use by `ToTokens` implementations.
///
/// ```
/// # #[macro_use] extern crate quote;
/// # use quote::{Tokens, ToTokens};
/// # fn main() {
/// struct X;
///
/// impl ToTokens for X {
/// fn to_tokens(&self, tokens: &mut Tokens) {
/// tokens.append_all(&[true, false]);
/// }
/// }
///
/// let tokens = quote!(#X);
/// assert_eq!(tokens.as_str(), "true false");
/// # }
/// ```
pub fn append_all<T, I>(&mut self, iter: I)
where T: ToTokens,
I: IntoIterator<Item = T>
{
for token in iter {
token.to_tokens(self);
}
}
/// For use by `ToTokens` implementations.
///
/// ```
/// # #[macro_use] extern crate quote;
/// # use quote::{Tokens, ToTokens};
/// # fn main() {
/// struct X;
///
/// impl ToTokens for X {
/// fn to_tokens(&self, tokens: &mut Tokens) {
/// tokens.append_separated(&[true, false], ",");
/// }
/// }
///
/// let tokens = quote!(#X);
/// assert_eq!(tokens.as_str(), "true , false");
/// # }
/// ```
pub fn append_separated<T, I, S: AsRef<str>>(&mut self, iter: I, sep: S)
where T: ToTokens,
I: IntoIterator<Item = T>
{
for (i, token) in iter.into_iter().enumerate() {
if i > 0 {
self.append(sep.as_ref());
}
token.to_tokens(self);
}
}
/// For use by `ToTokens` implementations.
///
/// ```
/// # #[macro_use] extern crate quote;
/// # use quote::{Tokens, ToTokens};
/// # fn main() {
/// struct X;
///
/// impl ToTokens for X {
/// fn to_tokens(&self, tokens: &mut Tokens) {
/// tokens.append_terminated(&[true, false], ",");
/// }
/// }
///
/// let tokens = quote!(#X);
/// assert_eq!(tokens.as_str(), "true , false ,");
/// # }
/// ```
pub fn append_terminated<T, I, S: AsRef<str>>(&mut self, iter: I, term: S)
where T: ToTokens,
I: IntoIterator<Item = T>
{
for token in iter {
token.to_tokens(self);
self.append(term.as_ref());
}
}
pub fn as_str(&self) -> &str {
&self.0
}
pub fn into_string(self) -> String {
self.0
}
pub fn parse<T: FromStr>(&self) -> Result<T, T::Err> {
FromStr::from_str(&self.0)
}
}
impl Default for Tokens {
fn default() -> Self {
Tokens::new()
}
}
impl Display for Tokens {
fn fmt(&self, formatter: &mut fmt::Formatter) -> Result<(), fmt::Error> {
self.0.fmt(formatter)
}
}
impl AsRef<str> for Tokens {
fn as_ref(&self) -> &str {
&self.0
}
}