use super::compose::{absolute_path, comma_many, group};
use super::items::{generic_parameters, where_clause};
use super::{GeneratedDelimiter, GeneratedToken};
use crate::bounded::Overflow;
#[must_use]
pub fn typed_parameter(
mut pattern: Vec<GeneratedToken>,
kind: Vec<GeneratedToken>,
) -> Vec<GeneratedToken> {
pattern.push(GeneratedToken::alone(':'));
pattern.extend(kind);
pattern
}
#[must_use]
pub fn consuming_receiver() -> Vec<GeneratedToken> {
vec![GeneratedToken::word("self")]
}
#[must_use]
pub fn shared_receiver(lifetime: Vec<GeneratedToken>) -> Vec<GeneratedToken> {
let mut tokens = vec![GeneratedToken::alone('&')];
tokens.extend(lifetime);
tokens.push(GeneratedToken::word("self"));
tokens
}
#[must_use]
pub fn exclusive_receiver(lifetime: Vec<GeneratedToken>) -> Vec<GeneratedToken> {
let mut tokens = vec![GeneratedToken::alone('&')];
tokens.extend(lifetime);
tokens.extend([GeneratedToken::word("mut"), GeneratedToken::word("self")]);
tokens
}
#[must_use]
pub fn pinned_receiver(lifetime: Vec<GeneratedToken>) -> Vec<GeneratedToken> {
let mut kind = absolute_path(&["core", "pin", "Pin"]);
kind.extend([GeneratedToken::alone('<'), GeneratedToken::alone('&')]);
kind.extend(lifetime);
kind.extend([
GeneratedToken::word("mut"),
GeneratedToken::word("Self"),
GeneratedToken::alone('>'),
]);
typed_parameter(vec![GeneratedToken::word("self")], kind)
}
pub fn function_signature(
qualifiers: Vec<GeneratedToken>,
name: GeneratedToken,
parameters: Vec<Vec<GeneratedToken>>,
generics: Vec<Vec<GeneratedToken>>,
result: Option<Vec<GeneratedToken>>,
predicates: Vec<Vec<GeneratedToken>>,
) -> Result<Vec<GeneratedToken>, Overflow> {
let mut tokens = qualifiers;
tokens.extend([GeneratedToken::word("fn"), name]);
tokens.extend(generic_parameters(generics));
tokens.push(group(
GeneratedDelimiter::Parenthesis,
comma_many(parameters),
)?);
if let Some(result) = result {
tokens.extend([GeneratedToken::joint('-'), GeneratedToken::alone('>')]);
tokens.extend(result);
}
tokens.extend(where_clause(predicates));
Ok(tokens)
}
pub fn function_item(
mut signature: Vec<GeneratedToken>,
body: Vec<GeneratedToken>,
) -> Result<Vec<GeneratedToken>, Overflow> {
signature.push(group(GeneratedDelimiter::Brace, body)?);
Ok(signature)
}
pub fn function(
name: &str,
parameters: Vec<GeneratedToken>,
result: Vec<GeneratedToken>,
body: Vec<GeneratedToken>,
) -> Result<Vec<GeneratedToken>, Overflow> {
let signature = function_signature(
Vec::new(),
GeneratedToken::word(name),
vec![parameters],
Vec::new(),
Some(result),
Vec::new(),
)?;
function_item(signature, body)
}
#[must_use]
pub fn match_arm(
mut pattern: Vec<GeneratedToken>,
guard: Option<Vec<GeneratedToken>>,
body: Vec<GeneratedToken>,
) -> Vec<GeneratedToken> {
if let Some(guard) = guard {
pattern.push(GeneratedToken::word("if"));
pattern.extend(guard);
}
pattern.extend([GeneratedToken::joint('='), GeneratedToken::alone('>')]);
pattern.extend(body);
pattern.push(GeneratedToken::alone(','));
pattern
}
pub fn match_expression(
mut subject: Vec<GeneratedToken>,
arms: Vec<Vec<GeneratedToken>>,
) -> Result<Vec<GeneratedToken>, Overflow> {
let mut tokens = vec![GeneratedToken::word("match")];
tokens.append(&mut subject);
tokens.push(group(
GeneratedDelimiter::Brace,
arms.into_iter().flatten().collect(),
)?);
Ok(tokens)
}