use std::{collections::HashSet, fmt::Display};
use syn::{
parse::{Parse, ParseStream},
LitInt, Token,
};
use crate::{client::SharedClient, Expand, Expanded};
mod chain;
use chain::Chain;
use super::Scope;
#[derive(Debug, Clone, Default)]
pub struct Flow {
pub rate: usize,
pub chain: Chain,
}
impl Display for Flow {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
write!(f, "{:3}: {}", self.rate, self.chain)
}
}
impl Flow {
pub fn dedup(&mut self, clients: &mut HashSet<SharedClient>) {
self.chain.dedup(clients);
}
pub fn match_rates(&mut self) {
self.chain.match_rates(self.rate);
}
pub fn collect_clients(&self, clients: &mut HashSet<SharedClient>) {
self.chain.iter().for_each(|client_output| {
client_output
.output
.as_ref()
.map(|output| output.collect(clients));
});
}
pub fn implicits(&self, scope: &mut Scope) -> Vec<Flow> {
self.chain
.implicits(self.rate, scope)
.into_iter()
.map(|chain| Flow {
rate: self.rate,
chain,
})
.collect()
}
}
impl Parse for Flow {
fn parse(input: ParseStream) -> syn::Result<Self> {
let rate = input.parse::<LitInt>()?.base10_parse::<usize>()?;
let _: Token!(:) = input.parse()?;
let chain = input.parse::<Chain>()?; Ok(Self { rate, chain })
}
}
impl Expand for Flow {
fn expand(&self) -> Expanded {
self.chain.expand()
}
}