use super::ToTokens;
use std::fmt::{self, Display};
use std::str::FromStr;
#[derive(Debug, Clone, Eq, PartialEq)]
pub struct Tokens(String);
impl Tokens {
pub fn new() -> Self {
Tokens(String::new())
}
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());
}
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);
}
}
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);
}
}
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
}
}