use crate::component::{ParseResult, Profile, Request, ResError, Response, Task};
use crate::engine::App;
use futures::future::LocalBoxFuture;
use serde::{Deserialize, Serialize};
type Sitem<U> = Result<U, Box<dyn std::error::Error + Send + Sync>>;
pub trait Spider<U, T, P>: Send + Sync
where
T: Serialize + for<'a> Deserialize<'a> + std::fmt::Debug + Clone,
P: Serialize + for<'a> Deserialize<'a> + std::fmt::Debug + Clone,
U: Serialize + std::fmt::Debug + Clone,
{
fn entry_profile(
&self,
) -> (
Request<T, P>,
Option<
&(dyn Fn(&mut Response<T, P>) -> LocalBoxFuture<'_, Result<Profile<P>, ResError>>
+ Send
+ Sync),
>,
);
fn entry_task(&self) -> Sitem<Vec<Task<T>>>;
fn open_spider(&self, app: &mut App<U, T, P>);
fn close_spider(&self, app: &mut App<U, T, P>);
fn get_parser<'a>(
&self,
ind: String,
) -> Option<&'a (dyn Fn(Response<T, P>) -> Sitem<ParseResult<U, T, P>> + Send + Sync)>;
}