blob: 0e889c98f0b620768ab234e8ae9b2bf5a42f4028 [file] [log] [blame]
// Copyright 2024 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
//! Wrappers around the mechanisms of driver registration for the driver
//! framework for implementing startup and shutdown of the driver in rust.
#![warn(missing_docs, unsafe_op_in_unsafe_fn)]
use core::future::Future;
use zx::Status;
mod context;
mod incoming;
pub mod macros;
mod node;
mod server;
pub use context::*;
pub use incoming::*;
pub use node::*;
/// Entry points into a driver for starting and stopping.
///
/// Driver authors should implement this trait, taking information from the [`DriverContext`]
/// passed to the [`Driver::start`] method to set up, and then tearing down any resources they use
/// in the [`Driver::stop`] method.
pub trait Driver: Sized + Send + 'static {
/// The name of the driver as it will appear in logs
const NAME: &str;
/// This will be called when the driver is started.
///
/// The given [`DriverContext`] contains information and functionality necessary to get at the
/// driver's incoming and outgoing namespaces, add child nodes in the driver topology, and
/// manage dispatchers.
///
/// In order for the driver to be properly considered started, it must return [`Status::OK`]
/// and bind the client end for the [`DriverStartArgs::node`] given in
/// [`DriverContext::start_args`].
fn start(context: DriverContext) -> impl Future<Output = Result<Self, Status>> + Send;
/// This will be called when the driver has been asked to stop, and should do any
/// asynchronous cleanup necessary before the driver is fully shut down.
///
/// Note: The driver will not be considered fully stopped until the node client end bound in
/// [`Driver::start`] has been closed.
fn stop(&self) -> impl Future<Output = ()> + Send;
}