use std::collections::HashSet;
use syn::{
parse::{Parse, ParseStream},
LitInt, Token,
};
use crate::{client::SharedClient, Expand, Expanded};
mod chain;
use chain::Chain;
#[derive(Debug, Clone, Default)]
pub struct Flow {
pub rate: usize,
pub chain: 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));
self.chain
.logger
.as_ref()
.map(|logger| clients.insert(logger.clone()));
});
}
}
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>()?.logging(rate);
Ok(Self { rate, chain })
}
}
impl Expand for Flow {
fn expand(&self) -> Expanded {
self.chain.expand()
}
}