// 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.

//! Implementation of the [`driver_register`] macro for registering driver implementations
//! with the driver host.

use crate::server::DriverServer;
use crate::Driver;

/// These re-exports are for the use of the macro and so should not be surfaced in documentation.
#[doc(hidden)]
pub use fdf_sys::{
    fdf_dispatcher_get_current_dispatcher, DriverRegistration,
    DriverRegistration_driver_registration_v1, DRIVER_REGISTRATION_VERSION_1,
};

/// Called by the macro [`driver_register`] to create the driver registration struct
/// without exposing any of the internal implementation as a public API.
#[doc(hidden)]
pub const fn make_driver_registration<T: Driver>() -> DriverRegistration {
    DriverRegistration {
        version: DRIVER_REGISTRATION_VERSION_1 as u64,
        v1: DriverRegistration_driver_registration_v1 {
            initialize: Some(DriverServer::<T>::initialize),
            destroy: Some(DriverServer::<T>::destroy),
        },
    }
}

/// Macro for declaring a driver's implementation of the [`Driver`] trait.
///
/// # Example
///
/// ```
/// use fdf_server::{driver_register, Driver, DriverContext};
/// use log::info;
/// use zx::Status;
///
/// #[derive(Default)]
/// struct TestDriver;
///
/// impl Driver for TestDriver {
///     async fn start(context: DriverContext) -> Result<Self, Status> {
///         info!("driver starting!");
///         // implement binding the node client, creating children, etc. here.
///         Ok(Self)
///     }
///     async fn stop(&self) {
///         info!("driver stop message");
///     }
/// }
///
/// driver_register!(TestDriver);
/// ```
#[macro_export]
macro_rules! driver_register {
    ($ty:ty) => {
        #[no_mangle]
        #[link_section = ".driver_registration"]
        #[allow(non_upper_case_globals)]
        pub static __fuchsia_driver_registration__: $crate::macros::DriverRegistration =
            $crate::macros::make_driver_registration::<$ty>();
    };
}
