1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114
//! Data structures for workflow configuration.
mod dist;
mod dist_package;
mod dist_target;
use eyre::eyre;
pub use self::{
dist::{DistConfig, DistConfigBuilder},
dist_package::{DistPackageConfig, DistPackageConfigBuilder},
dist_target::{DistTargetConfig, DistTargetConfigBuilder},
};
use crate::Result;
/// Configures and constructs [`Config`].
///
/// # Examples
///
/// ```rust
/// # fn main() -> cli_xtask::Result<()> {
/// use cli_xtask::{
/// config::{ConfigBuilder, DistConfigBuilder},
/// workspace,
/// };
///
/// let workspace = workspace::current();
/// let dist_config = DistConfigBuilder::new("app-dist", workspace).build()?;
/// let config = ConfigBuilder::new().dist(dist_config).build()?;
/// # Ok(())
/// # }
/// ```
#[derive(Debug, Default)]
pub struct ConfigBuilder<'a> {
dist: Option<DistConfig<'a>>,
}
impl<'a> ConfigBuilder<'a> {
/// Creates a new `ConfigBuilder`.
pub fn new() -> Self {
Self::default()
}
/// Adds a [`DistConfig`] to the builder.
pub fn dist(mut self, dist: DistConfig<'a>) -> Self {
self.dist = Some(dist);
self
}
/// Builds a [`Config`] from the current configuration.
///
/// # Errors
///
/// Returns an error if the [`Config`] cannot be built.
pub fn build(self) -> Result<Config<'a>> {
Ok(Config { dist: self.dist })
}
}
/// Top-level configuration for cargo xtask workflow.
///
/// This struct is build from [`ConfigBuilder`].
///
/// # Examples
///
/// Creates an empty `Config`.
///
/// ```rust
/// # fn main() -> cli_xtask::Result<()> {
/// use cli_xtask::config::Config;
/// let config = Config::new();
/// assert!(config.dist().is_err());
/// # Ok(())
/// # }
/// ```
///
/// Creates a `Config` with a [`DistConfig`].
///
/// ```
/// # fn main() -> cli_xtask::Result<()> {
/// use cli_xtask::{
/// config::{ConfigBuilder, DistConfigBuilder},
/// workspace,
/// };
///
/// let workspace = workspace::current();
/// let dist_config = DistConfigBuilder::new("app-dist", workspace).build()?;
/// let config = ConfigBuilder::new().dist(dist_config).build()?;
/// assert!(config.dist().is_ok());
/// # Ok(())
/// # }
/// ```
#[derive(Debug, Default)]
pub struct Config<'a> {
dist: Option<DistConfig<'a>>,
}
impl<'a> Config<'a> {
/// Creates an empty `Config`.
pub fn new() -> Self {
Self::default()
}
/// Returns the [`DistConfig`] if one was configured.
///
/// # Errors
///
/// Returns an error if the [`DistConfig`] is not set.
pub fn dist(&self) -> Result<&DistConfig<'a>> {
self.dist
.as_ref()
.ok_or_else(|| eyre!("no dist configuration set"))
}
}