diff --git a/polkadot/cli/src/lib.rs b/polkadot/cli/src/lib.rs index ba29a39ecc..b2da24ee10 100644 --- a/polkadot/cli/src/lib.rs +++ b/polkadot/cli/src/lib.rs @@ -38,7 +38,7 @@ use chain_spec::ChainSpec; use futures::Future; use tokio::runtime::Runtime; pub use service::{Components as ServiceComponents, Service, CustomConfiguration}; -pub use cli::VersionInfo; +pub use cli::{VersionInfo, IntoExit}; fn load_spec(id: &str) -> Result, String> { Ok(match ChainSpec::from(id) { @@ -51,22 +51,16 @@ fn load_spec(id: &str) -> Result, String> { /// /// This will be invoked with the service and spawn a future that resolves /// when complete. -pub trait Worker { +pub trait Worker: IntoExit { /// A future that resolves when the work is done or the node should exit. /// This will be run on a tokio runtime. type Work: Future + Send + 'static; - /// An exit scheduled for the future. - type Exit: Future + Send + 'static; - /// Return configuration for the polkadot node. // TODO: make this the full configuration, so embedded nodes don't need // string CLI args fn configuration(&self) -> service::CustomConfiguration { Default::default() } - /// Don't work, but schedule an exit. - fn exit_only(&self) -> Self::Exit; - /// Do work and schedule exit. fn work(self, service: &service::Service) -> Self::Work; } @@ -85,9 +79,9 @@ pub fn run(args: I, worker: W, version: cli::VersionInfo) -> error::Res W: Worker, { - match cli::prepare_execution::(args, worker.exit_only(), version, load_spec, "parity-polkadot")? { + match cli::prepare_execution::(args, worker, version, load_spec, "parity-polkadot")? { cli::Action::ExecutedInternally => (), - cli::Action::RunService(mut config) => { + cli::Action::RunService((mut config, worker)) => { info!("Parity ·:· Polkadot"); info!(" version {}", config.full_version()); info!(" by Parity Technologies, 2017, 2018"); diff --git a/polkadot/collator/src/lib.rs b/polkadot/collator/src/lib.rs index 0acee408b6..37428495d9 100644 --- a/polkadot/collator/src/lib.rs +++ b/polkadot/collator/src/lib.rs @@ -69,7 +69,7 @@ use polkadot_api::PolkadotApi; use polkadot_primitives::{AccountId, BlockId, SessionKey}; use polkadot_primitives::parachain::{self, BlockData, DutyRoster, HeadData, ConsolidatedIngress, Message, Id as ParaId}; use polkadot_cli::{ServiceComponents, Service, CustomConfiguration, VersionInfo}; -use polkadot_cli::Worker; +use polkadot_cli::{Worker, IntoExit}; use tokio::timer::Deadline; const COLLATION_TIMEOUT: Duration = Duration::from_secs(30); @@ -211,12 +211,21 @@ struct CollationNode { key: Arc, } +impl IntoExit for CollationNode where + P: ParachainContext + Send + 'static, + E: Future + Send + 'static +{ + type Exit = E; + fn into_exit(self) -> Self::Exit { + self.exit + } +} + impl Worker for CollationNode where P: ParachainContext + Send + 'static, - E: Future + Send + Clone + 'static + E: Future + Send + 'static { type Work = Box + Send>; - type Exit = E; fn configuration(&self) -> CustomConfiguration { let mut config = CustomConfiguration::default(); @@ -227,10 +236,6 @@ impl Worker for CollationNode where config } - fn exit_only(&self) -> Self::Exit { - self.exit.clone() - } - fn work(self, service: &Service) -> Self::Work { let CollationNode { parachain_context, exit, para_id, key } = self; let client = service.client(); diff --git a/polkadot/src/main.rs b/polkadot/src/main.rs index 4e3fba054f..d3e951596e 100644 --- a/polkadot/src/main.rs +++ b/polkadot/src/main.rs @@ -38,11 +38,9 @@ mod vergen { // the regular polkadot worker simply does nothing until ctrl-c struct Worker; -impl cli::Worker for Worker { - type Work = Self::Exit; +impl cli::IntoExit for Worker { type Exit = future::MapErr, fn(oneshot::Canceled) -> ()>; - - fn exit_only(&self) -> Self::Exit { + fn into_exit(self) -> Self::Exit { // can't use signal directly here because CtrlC takes only `Fn`. let (exit_send, exit) = oneshot::channel(); @@ -55,9 +53,13 @@ impl cli::Worker for Worker { exit.map_err(drop) } +} - fn work(self, _service: &Service) -> Self::Exit { - self.exit_only() +impl cli::Worker for Worker { + type Work = ::Exit; + fn work(self, _service: &Service) -> Self::Work { + use cli::IntoExit; + self.into_exit() } }