use async_trait::async_trait;
use futures_core::Stream;
use futures_util::stream::Empty;
use std::future::Future;
use crate::{Context, Envelope, ServiceAddress};
pub type EmptyStream<S> = Empty<Envelope<S>>;
#[async_trait]
pub trait Service: Send + Sized + 'static {
type Stream: Stream<Item = Envelope<Self>> + Unpin + Send;
fn start_by_context(
self,
ctx: Context<Self, Self::Stream>,
) -> (ServiceAddress<Self>, impl Future<Output = ()> + Send) {
ctx.run(self)
}
async fn started(&mut self, _ctx: &mut Context<Self, Self::Stream>) {}
async fn stopped(&mut self, _ctx: &mut Context<Self, Self::Stream>) {}
}