use crate::errors::{CliError, CliResult};
pub fn project(flag: Option<String>) -> Option<String> {
match flag {
Some(s) if s.trim() == "*" => None,
Some(s) if !s.trim().is_empty() => Some(s.trim().to_uppercase()),
_ => std::env::var("CLIBAN_PROJECT")
.ok()
.map(|s| s.trim().to_uppercase())
.filter(|s| !s.is_empty() && s != "*"),
}
}
pub fn required_project(flag: Option<String>) -> CliResult<String> {
project(flag)
.ok_or_else(|| CliError::validation("no project scope: pass -p KEY or set $CLIBAN_PROJECT"))
}
pub fn project_identity(pos: Option<String>) -> CliResult<String> {
match pos {
Some(k) if !k.trim().is_empty() && k.trim() != "*" => Ok(k.trim().to_uppercase()),
_ => project(None)
.ok_or_else(|| CliError::validation("no project: pass a KEY or set $CLIBAN_PROJECT")),
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn explicit_flag_wins_and_is_upcased() {
assert_eq!(project(Some("cli".into())), Some("CLI".into()));
}
#[test]
fn star_means_unscoped() {
assert_eq!(project(Some("*".into())), None);
}
}