// Copyright 2022 The Pigweed Authors
//
// Licensed under the Apache License, Version 2.0 (the "License"); you may not
// use this file except in compliance with the License. You may obtain a copy of
// the License at
//
//     https://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
// License for the specific language governing permissions and limitations under
// the License.

use anyhow::Result;

use crate::{hello, target};

#[cfg(feature = "new_command")]
use crate::new;

#[cfg(feature = "python")]
use crate::py_demo;

/// Builtin subcommands for the program.
///
/// Each variant in the enum is the name of a subcommand and should contain a
/// struct which derives `clap::Parser` to specify its arguments.
#[derive(clap::Parser, Debug)]
pub enum Subcommands {
    Hello(hello::Command),
    Target(target::Command),

    #[cfg(feature = "new_command")]
    New(new::Command),

    #[cfg(feature = "python")]
    PyDemo(py_demo::Command),
}

impl Subcommands {
    /// Invokes a subcommand with its parsed arguments.
    pub async fn run(&self) -> Result<()> {
        match self {
            Self::Hello(args) => {
                hello::run(args);
            }
            Self::Target(args) => {
                target::run(args).await?;
            }
            #[cfg(feature = "new_command")]
            Self::New(args) => {
                new::run(args)?;
            }
            #[cfg(feature = "python")]
            Self::PyDemo(cmd) => {
                py_demo::run(cmd);
            }
        };

        Ok(())
    }
}
