// Copyright 2021 The ChromiumOS Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

//! Encapsulate the sub modules of crosh.

#![allow(clippy::unnecessary_wraps)]
#![deny(unsafe_op_in_unsafe_fn)]

pub mod base;
pub mod debugd;
pub mod dev;
pub mod dispatcher;
pub mod legacy;
pub mod util;

use dispatcher::Dispatcher;
use log::error;

pub fn setup_dispatcher() -> Dispatcher {
    let mut dispatcher = Dispatcher::new();

    if util::dev_commands_included() {
        legacy::register_dev_mode_commands(&mut dispatcher);
        dev::register(&mut dispatcher);
    }

    if util::usb_commands_included() {
        legacy::register_removable_commands(&mut dispatcher);
    }

    base::register(&mut dispatcher);
    legacy::register(&mut dispatcher);

    if let Err(err) = dispatcher.validate() {
        // Use error! too so that the message is included in the syslog.
        error!("FATAL: {}", err);
        panic!("FATAL: {}", err);
    }

    dispatcher
}

#[cfg(test)]
mod tests {
    use super::*;

    #[test]
    fn test_validate_registered_commands() {
        util::set_dev_commands_included(true);
        util::set_usb_commands_included(true);
        setup_dispatcher();
    }
}
