You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
35 lines
918 B
35 lines
918 B
//! Generating the strings
|
|
use super::*;
|
|
|
|
#[derive(Debug)]
|
|
pub struct GenBodyError(pub String);
|
|
|
|
impl error::Error for GenBodyError{}
|
|
impl fmt::Display for GenBodyError
|
|
{
|
|
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result
|
|
{
|
|
write!(f, "failed to write {:?} to body", self.0)
|
|
}
|
|
}
|
|
|
|
|
|
pub async fn body(state: State, num: Option<usize>, mut output: mpsc::Sender<String>) -> Result<(), GenBodyError>
|
|
{
|
|
let chain = state.chain().read().await;
|
|
if !chain.is_empty() {
|
|
let filter = state.outbound_filter();
|
|
match num {
|
|
Some(num) if num < state.config().max_gen_size => {
|
|
//This could DoS `full_body` and writes, potentially.
|
|
for string in chain.str_iter_for(num) {
|
|
output.send(filter.filter_owned(string)).await.map_err(|e| GenBodyError(e.0))?;
|
|
}
|
|
},
|
|
_ => output.send(filter.filter_owned(chain.generate_str())).await.map_err(|e| GenBodyError(e.0))?,
|
|
}
|
|
}
|
|
Ok(())
|
|
}
|
|
|